PDA

Ver la Versión Completa : Como seleccionar datos de una tabla e insertarlos en otra por Delphi


jscubillos5
18-07-2013, 21:50:41
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 (http://www.clubdelphi.com/foros/guiaestilo.php).

Saludos y gracias por tu colaboración :)

nlsgarcia
18-07-2013, 22:26:19
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:

La Cara Oculta de Delphi 4, Autor Ian Marteens : http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_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 (http://www.clubdelphi.com/foros/showthread.php?t=68708)


Saludos. :)

Casimiro Notevi
18-07-2013, 23:28:13
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
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
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
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:

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, 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 [-] (http://www.clubdelphi.com/foros/#)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í: 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
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 [-] (http://www.clubdelphi.com/foros/#)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í:

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.