Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Insertar Datos de un Campo a Otro en una misma Tabla

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Insertar Datos de un Campo a Otro en una misma Tabla Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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 Smile

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 Wink
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.