Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como seleccionar datos de una tabla e insertarlos en otra por Delphi (https://www.clubdelphi.com/foros/showthread.php?t=83710)

jscubillos5 18-07-2013 21:50:41

Como seleccionar datos de una tabla e insertarlos en otra por Delphi
 
Hola comunidad, quisiera saber si alguno de ustedes sabe como extraer o seleccionar los registros de una tabla de una base de datos por medio de delphi y como insertar estos datos en otra tabla, es que deseo pasar estos registros, pero no se como???

Caminante 18-07-2013 21:57:04

Pueden haber varios opciones. Pero es necesario que des mas detalles de lo que quieres hacer...

Saludos

ecfisa 18-07-2013 22:00:15

Hola jscubillos5, bienvenido a Club Delphi :)

Como a todos los que se inician te invitamos a que leas nuestra guía de estilo.

Saludos y gracias por tu colaboración :)

nlsgarcia 18-07-2013 22:26:19

jscubillos5,

Cita:

Empezado por jscubillos5
...como extraer o seleccionar los registros de una tabla de una base de datos por medio de Delphi y como insertar estos datos en otra tabla...

Te sugiero consultar este libro:
Cita:

La Cara Oculta de Delphi 4, Autor Ian Marteens : http://terawiki.clubdelphi.com/Delph...phi_4_pdf_.zip
Espero sea útil :)

Nelson.

jscubillos5 18-07-2013 23:02:55

Hola gracias por la info sobre la guía de estilo, ahora entiendo que me exprese muy vagamente en el problema que tengo actual, lo que deseo aprender hacer es lo siguiente:
1. Por medio de una consulta de Delphi IBExpert, poder obtener todos los registros de una tabla.
2. Por medio de un objeto de Delphi, aun no se cual, poder tomar los datos consultados y meterlos en otra tabla.

ecfisa 18-07-2013 23:27:39

Hola jscubillos5.

No has comentado con que RDBMS estas trabajando, pero por tu mención a IBExpert es muy posible que sea Firebird. Si estoy en lo cierto, te recomiendo que leas este tutorial del amigo Caral: Tutorial (como empezar con Firebird) Novatos


Saludos. :)

Casimiro Notevi 18-07-2013 23:28:13

Cita:

Empezado por jscubillos5 (Mensaje 464095)
ahora entiendo que me exprese muy vagamente

y sigue siendo así, lo que preguntas es muy amplio. Además de que no existe delphi ibexpert.
Aclara lo más exactamente posible tu duda, no hay problema de espacio, puedes escribir tanto como quieras.

EDITO: haz caso a ecfisa, te ha indicado un excelente enlace.

jscubillos5 18-07-2013 23:37:11

Hola ecfisa, efictavamente el proceso que deseo ejecutar es a una base de datos Firebird, y pues lo que deseo aprender hacer es lo siguiente:
1. Por medio de un boton en delphi, deseo que en su procedure Click(Sender: TObject);, es decir "en su proceso de ejecucción", dentro de este haga:
2. Una consulta a firebird por medio de un IBQUERY, que esta dentro del menu de contextual de delphi en la etiqueta INTERBASE.
3. Esta consulta debe traer todos los registros de una tabla.
4. Luego insertar estos registros en otra tabla.

Ahora cada vez que intento citar o responder el mensaje de algunos de ustedes, me arroja un error el cual dice que yo no tengo permitido colocar imagenes o insertar urls.

Casimiro Notevi 18-07-2013 23:40:47

Para aprender eso, entonces, te viene perfecto el libro aconsejado por nlsgarcia y el enlace de ecfisa.

Y si tienes alguna duda, pregunta ^\||/

Casimiro Notevi 18-07-2013 23:42:58

Cita:

Empezado por jscubillos5 (Mensaje 464098)
Ahora cada vez que intento citar o responder el mensaje de algunos de ustedes, me arroja un error el cual dice que yo no tengo permitido colocar imagenes o insertar urls.

Es un control anti-spam, cuando tengas unos mensajes más ya podrás.
De momento puedes poner los enlaces y algún moderador lo solucionará.
Ejemplo: ttp://loquesea.com/imagen.jpg

Neftali [Germán.Estévez] 19-07-2013 10:01:38

Cita:

Empezado por jscubillos5 (Mensaje 464098)
1. Por medio de un boton en delphi, deseo que en su procedure Click(Sender: TObject);, es decir "en su proceso de ejecucción", dentro de este haga:
2. Una consulta a firebird por medio de un IBQUERY, que esta dentro del menu de contextual de delphi en la etiqueta INTERBASE.
3. Esta consulta debe traer todos los registros de una tabla.
4. Luego insertar estos registros en otra tabla.

Lo primero es colocar en un formulario los componentes correspondientes para realizar las 2 conexiones.
(1) Lo necesario para conectar a la primera Base de Datos (IBDatabase, IBTransaction, IBQuery -o similares dependiendo de los componentes de conexión que estés usando-).
(2) Lo mismo para la Base de Datos destino_; En este caso pueden ser un IBDatabase, IBTransaction, IBTable (o similares).
(3) Configurar el primer IBQuery para ejecutar la consulta.
(4) A medida que vas recorriendo el IBQuery (con los registros devueltos por la consulta), vas insertando en la segunda tabla.

El proceso en sí es sencillo. Ir leyendo de la primera e ir insertando en la segunda.

Ahora si lo intentas, nos puedes decir de forma más concreta dónde tienes problemas.

¿Seleccionar componentes?
¿Configurar los componentes?
¿Generar el código del proceso?
....

jscubillos5 19-07-2013 21:49:09

Continuando con este post
 
Hola comunidad, pues he leido los libors que me dieron y los recursos que he encontrado en la web, y he llegado a este punto:

Código Delphi [-]
procedure TDataModuleCarga.ExtraerDatos(RutaBaseDatos:String);
var NombreTabla, NombreCampo: String;
Index: Integer;
begin
  IBDatabaseSanGil.DatabaseName:= RutaBaseDatos;
  IBDatabaseSanGil.Open;
  try
    IBQueryTablas.Open;
    while not IBQueryTablas.Eof do
    begin
      NombreTabla:= IBQueryTablas.fieldbyname('nombre_tabla').AsString;
      IBQueryExtraerDatosTablas.SQL.Text:= 'select * from ' + NombreTabla;
      IBQueryExtraerDatosTablas.Open;
      for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do
      begin
        NombreCampo:= IBQueryExtraerDatosTablas.FieldList[Index].Text;
      end;
    end;
    IBQueryExtraerDatosTablas.Close;
  finally
    IBDatabaseSanGil.Close;
  end;
end;

Cuando ejecuto este código arroja el siguiente error: Dynamic SQL Error SQL error code = -804 Data type unknown Client SQL dialect 1 does not support reference to BIGINT data type, ¿Alguien sabe el por que de este error?

jscubillos5 19-07-2013 23:12:10

Hola comunidad
 
Cita:

Empezado por jscubillos5 (Mensaje 464167)
Hola comunidad, pues he leido los libors que me dieron y los recursos que he encontrado en la web, y he llegado a este punto:


Código Delphi [-]procedure TDataModuleCarga.ExtraerDatos(RutaBaseDatos:String);
var NombreTabla, NombreCampo: String;
Index: Integer;
begin
IBDatabaseSanGil.DatabaseName:= RutaBaseDatos;
IBDatabaseSanGil.Open;
try
IBQueryTablas.Open;
while not IBQueryTablas.Eof do
begin
NombreTabla:= IBQueryTablas.fieldbyname('nombre_tabla').AsString;
IBQueryExtraerDatosTablas.SQL.Text:= 'select * from ' + NombreTabla;
IBQueryExtraerDatosTablas.Open;
for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do
begin
NombreCampo:= IBQueryExtraerDatosTablas.FieldList[Index].Text;
end;
end;
IBQueryExtraerDatosTablas.Close;
finally
IBDatabaseSanGil.Close;
end;
end;




Cuando ejecuto este código arroja el siguiente error: Dynamic SQL Error SQL error code = -804 Data type unknown Client SQL dialect 1 does not support reference to BIGINT data type, ¿Alguien sabe el por que de este error?

Siguiendo con la solución de mi problema encontre vía web que solo era cuestión de configurar la propiedad SQLDIALECT pasarla de 1 a 3, y listo, a bueno y en el nombre campo se debe llamar así:
Código Delphi [-]
NombreCampo:= IBQueryExtraerDatosTablas.FieldList[Index].FieldName;
ya que como lo tenia antes llama es el valor del campo o el valor deñ registro

jscubillos5 22-07-2013 18:04:06

Respuesta de la pregunta
 
Cita:

Empezado por jscubillos5 (Mensaje 464170)
Siguiendo con la solución de mi problema encontre vía web que solo era cuestión de configurar la propiedad SQLDIALECT pasarla de 1 a 3, y listo, a bueno y en el nombre campo se debe llamar así: Código Delphi [-]NombreCampo:= IBQueryExtraerDatosTablas.FieldList[Index].FieldName;

ya que como lo tenia antes llama es el valor del campo o el valor deñ registro

Hola foro, ya he logrado conseguir que de una base de datos se consulten todas las tablas y pasar los registros de estas tablas a otra base de datos el codigo va así:
Código Delphi [-]
procedure TDataModuleCarga.ExtraerDatos(RutaBaseDatos, ArchivoExcepciones:String); //Creo un método
var NombreTabla, NombreCampo, SentenciaInsertar, ValorCampo, Codigo_Agencia, RutaArchivoSalida: String;
Index: Integer; 
Archivo: TextFile;// Cargo varias variables a usar
begin
  RutaArchivoSalida:= ExtractFilePath(ArchivoExcepciones) + 'Lock.txt'; // Decidi crear un archivo de lock, para saber que inserciones se generan
  IBDatabaseSanGil.DatabaseName:= RutaBaseDatos; //Le asigno la ruta de conexión a una base de datos
  IBQueryObtenerCodigo_Agencia.Open; //Abro una consulta
  Codigo_Agencia:= IBQueryObtenerCodigo_Agencia.fieldbyname('AGENCIA').AsString; //Cargo en una variable el valor de la consulta anterior
  AssignFile(Archivo, RutaArchivoSalida); // Asigno el archivo del lock y la ruta de ubicación del mismo
  Rewrite(Archivo); //Luego lo reescribo si ya existe
  Writeln(Archivo, 'Archivo lock insertaciones'); //Escribo un titulo al archivo
  IBDatabaseSanGil.Open; //Abro la primera consulta para extraer los datos
  try // Lo encierro en un try 
    IBQueryTablas.Open; // Abro la consulta de las tablas
    while not IBQueryTablas.Eof do //Mientras la consulta de las tablas no termine hago
    begin
      NombreCampo:= ''; // Asigno un valor nulo a la variable
      NombreTabla:= Trim(IBQueryTablas.fieldbyname('nombre_tabla').AsString); // Obtengo el nombre de la tabla de la consulta
      IBQueryExtraerDatosTablas.SQL.Text:= 'select * from ' + NombreTabla;
      // Luego cargo los datos de la consulta con la cual voy a extraer todos los campos y datos de la tabla
      IBQueryExtraerDatosTablas.Open; // Abro la consulta
      for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do // Recorro los campos o nombres de los campos por cada tabla
      begin
        NombreCampo:=NombreCampo + ', ' + IBQueryExtraerDatosTablas.FieldList[Index].FieldName; //Lo asigno a una variable
      end;
      Delete(NombreCampo, 1, 1); 
      //Elimino el primer item de Nombre campo, puesto que es una coma al ejecutar el script arrojara una excepción
      while not IBQueryExtraerDatosTablas.Eof do //Mientras extraer datos no tenga fin hago
      begin
        ValorCampo:= ''; // Al igual que con NombreCampo, inicializo el valor de campo en nulo o vacio
        for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do
        begin
          ValorCampo:= ValorCampo + ', ' + IBQueryExtraerDatosTablas.FieldList[Index].Text;
          //Al igual que el anterior cargo el valor del campo en una variable string
        end;
        Delete(ValorCampo, 1, 1); //Elimino el primer caracter igual que en el anterior, puesto que es una coma
        if DebeProcesarTabla(ArchivoExcepciones, NombreTabla) then 
        //Valido si la tabla no debe ser procesa, es decir no todas las tablas que estoy recorriendo, deseo insertar los mismos valores
        //El método DebeProcesarTabla es una function retorna verdadero o falso. 
        begin  //Aquí ya realizo el proceso de crear la sentencia de inserción :D.
          SentenciaInsertar:= 'INSERT INTO ' + NombreTabla + ' ('  + NombreCampo + ', CODIGO_AGENCIA' + ' )' + ' VALUES ' + ' (' + ValorCampo +  ', ' + Codigo_Agencia + ' );'; 
          try
           Writeln(Archivo, SentenciaInsertar); //Escribo la linea en el archivo del lock
           finally
           //CloseFile(Archivo); 
//Comentarie esto por que cada vez que el archivo se iba creando iba generando un error en la proxima vuelta del bucle
           end;
        end
        else
        begin
          SentenciaInsertar:= 'INSERT INTO ' + NombreTabla + ' ('  + NombreCampo + ' )' + ' VALUES ' + ' (' + ValorCampo + ' );';
          try
           Writeln(Archivo, SentenciaInsertar);
           finally
           //CloseFile(Archivo);
           end;
        end;
        IBQueryExtraerDatosTablas.Next; //Para no entrar a un bucle finito
      end;
      IBQueryTablas.Next; //Para no entrar a un bucle finito
    end;
    IBQueryExtraerDatosTablas.Close; //Cierro las consultas
  finally
    CloseFile(Archivo); //Cierro el archivo
    IBDatabaseSanGil.Close; //Cierro la conexión a la base de datos.
  end;
end;

Finalmente seria colocar que por cada inserción se executa una consulta IBQUERY en la base de datos con el SQL.TEXT:= SentenciaInsercion;
Luego se debe ejecutar Consulta.EXEC; y este código deberia ir debajo de cada sentencia de insertar y por encima del archivo del lock, con esto se garantiza que el insert que sea escrito en el lock se haya procesado antes en la base de datos y listo :D.


La franja horaria es GMT +2. Ahora son las 19:19:16.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi