| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Duckman007 Ens


Registrado: 12 May 2007Mensajes: 45Ubicación: Oaxaca, Mexico
|
Publicado: Jue 18 Oct, 2007 9:32 pm Asunto: Insertar Datos de un Campo a Otro en una misma Tabla |
|
|
Buen dia a toda la comunidad.
Antes que nada trabajo con Builder 6 y con tablas DBF de forma local.
Tengo un Query que hace referencia a una tabla de dos campos (“plaza” y “horas”), el campo “plaza” es de tipo carácter y el campo “horas” es de tipo numérico.
La cadena del campo “plaza” es de 21 caracteres y solo me interesan extraer dos caracteres que se encuentran intermedios, ahora lo que necesito saber es como hacerle para extraer esos dos caracteres del campo plaza e insertarlos en el campo contiguo de dicho registro que seria horas?. De ante mano agradezco sus aportaciones, gracias.
A continuación escribo un poco de codigo de cómo me imagine realizarlo:
AnsiString Valor;
Query1->Open();
Query1->First();
while( ! Query1->Eof )
{
Valor = Query1->FieldByName("plaza")->AsString;
// ¿como insertar el contenido de la variable Valor al campo horas…???
Query1->Next();
}
Query1->Close(); |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Jue 22 Nov, 2007 8:16 pm Asunto: |
|
|
Hola, bueno si los caracteres intermedios estan siempre en la misma posicion puedes usar la funcion SubString para extraerlos.
Supongamos que estan de 4º y 5º en la cadena:
| Código: |
AnsiString Valor;
Query1->Open();
Query1->First();
while( ! Query1->Eof )
{
Valor = Query1->FieldByName("plaza")->AsString;
Valor=Valor.SubString(4,2); //Donde 4 es la posicion donde comienza la subcadena y 2 el numero de caracteres a traer
Query1->Next();
}
Query1->Close(); |
Ahora si la posicion varia pero hay un caracter separador por ej. un /
debes hacer un bucle:
| Código: |
String Valor=Query1->FieldByName("plaza")->AsString;
for(int i=1;i<=Valor.Length();i++)
if(Valor.SubString(i,1)=="/")
Valor=Valor,SubString(i+1,2); |
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 23 Nov, 2007 8:39 am Asunto: |
|
|
Otra idea, suponiendo que los caracteres que buscas NO están siempre en la misma posición NI precedidos de un separador. Sabemos que el campo hora es numérico, por lo que esas dos posiciones que tienes que buscar han de ser dígitos.
Yo haría algo así. Necesitarás un TTable y u TQuery:
| Código: | Query1->SQL->Add("UPDATE 'Tabla.dbf' SET Hora = :Hora WHERE Plaza = :Plaza");
Table1->Open();
while (!Table1->Eof)
{
for (int nPos = 1; nPos <Table1>FieldByName("Plaza")->AsString.Length(); nPos ++)
if (isdigit(Table1->FieldByName("Plaza")->AsString.SubString(nPos, 1).c_str()[0])
{
Query1->Close();
Query1->UnPrepare();
Query1->ParamByName("Hora")->AsInteger = StrToInt(Table1->FieldByName("Plaza")->AsString.SubString(nPos, 2));
Query1->ParamByName("Plaza")->AsString = Query1->FieldByName("Plaza")->AsString;
Query1->Prepare();
Query1->ExecSQL();
break;
}
Table1->Next();
} |
SI con un TTable y un Tquery te da problemas, usa dos TQuery. En un lees la tabla y con el otro al modificas:
| Código: | Query1->SQL->Add("SELECT * FROM 'Tabla.dbf'");
Query1->Prepare();
Query1->Open();
Query2->SQL->Add("UPDATE 'Tabla.dbf' SET Hora = :Hora WHERE Plaza = :Plaza");
Query1->Open();
while (!Query1->Eof)
{
for (int nPos = 1; nPos <Query1>FieldByName("Plaza")->AsString.Length(); nPos ++)
if (isdigit(Query1->FieldByName("Plaza")->AsString.SubString(nPos, 1).c_str()[0])
{
Query2->Close();
Query2->UnPrepare();
Query2->ParamByName("Hora")->AsInteger = StrToInt(Query1->FieldByName("Plaza")->AsString.SubString(nPos, 2));
Query2->ParamByName("Plaza")->AsString = Query2->FieldByName("Plaza")->AsString;
Query2->Prepare();
Query2->ExecSQL();
break;
}
Query1->Next();
} |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Vie 23 Nov, 2007 5:46 pm Asunto: |
|
|
Gracias Angel, es un buen enfoque y de paso conoci la funcion isdigit.
Esto es lo bueno de este foro, que no nos vamos sin aprender algo nuevo
Aqui ya algo fuera del tema, tengo entendido que estas en Toledo y este es famoso por sus aceros desde la antiguedad, yo coleciono navajas y me gustaria saber cuantos kilos de cacao en polvo puro me costaria una pieza artesanal (no de esas que se hacen en serie para los turistas) me refiero a las hechas en algun tallercito que todavia conserve las tradiciones y tecnologia.
Lo del precio en cacao es porque las monedas suben y bajan pero el cacao es siempre delicioso  |
|
| Volver arriba |
|
 |
|