PDA

Ver la Versión Completa : Insertar tabla de otra tabla con condiciones


igamerpc
18-03-2020, 10:57:31
Buenos dias, tengo duda no se como funciona ejemplo te dire


Tabla 1: ID (esta vacia)



Tabla 2: CODIGO, NOMBRE (archivo DBF que ya tiene contenido)



Tabla 3: ID, CODIGO, NOMBRE (es el servidor que ya tiene contenido)


Quiero que la tabla 2 insertar a la tabla 1 solo ID para que coinciden con la tabla 3 el ID.



En delphi funciona con INNER JOIN no?

ecfisa
18-03-2020, 11:20:40
Hola.

Si no te entendí mal, creo que la instrucción SQL que buscas es:

INSERT INTO TABLA1 (ID, CODIGO, NOMBRE)
SELECT T2.ID, T2.CODIGO, T2.NOMBRE
FROM TABLA2 T2
INNER JOIN TABLA3 T3 ON T2.ID = T3.ID


Saludos :)

igamerpc
18-03-2020, 11:41:45
Perdon digo sobre Delphi eso como hace. Y no SQL.

En inner join funciona con Delphi?

De todas formas estoy programando a ver si funciona. Quizas la setencia sql funciona dentro de Delphi.

Muchas gracias :)

movorack
18-03-2020, 21:10:15
Te pasan la sentencia porque desde Delphi vas a poder ejecutar esa sentencia usando los componentes de acceso a datos.
Lo que necesitas es conectar tu aplicación (Componente TDataBase por ej.) a esos archivos DBF.

Este video te muestra como conectar un programa de Delphi a una base de datos y como trabajar con esa DB.

https://www.youtube.com/watch?v=dwb0wv6IJqA

Y este te muestra como conectar a dBase (Archivos DBF), usando Firedac.

https://www.youtube.com/watch?v=cHjbDtK-GK0

igamerpc
19-03-2020, 09:02:58
Si ese lo tengo yo todo conectado y todo. Lo refiero que pasar tabla 2 a tabla 1 todos los documentos pero distintas.

Es dificil creo.. la tabla 3 insertar numero id a la tabla 1 relacionado de la tabla 2. Es poco lio.
Lo estoy intentando. Puede ser debe ser crear 3 tablas para poder pasar.

kuan-yiu
20-03-2020, 13:04:25
Si he entendido bien: en Tabla1 quieres guardar una relación entre Tabla2 y Tabla3.
Según como sea esa relación hay distintos modos de hacerlo pero ten en cuenta que a través del componente TQuery (o similar) puedes ejecutar código SQL desde Delphi, así que si tienes claro como hacerlo en SQL pasarlo a Delphi es inmediato.
Montas el insert que necesites y en cada iteración le pasas los parámetros. Algo así:

qInsertar:= TQuery.create(Application);
with qInsertar do
begin
try
close;
SQL.Clear;
DatabaseName := f_ficheros.sDataBaseName;
SQL.Add('Insert into '+tabla1+' (IdUno, UdDos)');
SQL.Add('Values (:idUno,:idDos)');
Prepare;
for (tuCondicionParaInsertar) do
begin
Parambyname('idUno').AsInteger := datoDeTabla2;
Parambyname('idDos').AsInteger := datoDeTabla3;
ExecSQL;
//Siguiente registro de las tablas, o lo que sea que tengas que hacer para insertar
end;
finally
Free;
end;
end;

igamerpc
23-03-2020, 15:46:24
Te voy a explicar mas claro, porque el anterior parece confusiones de las tablas. Te voy a mostrar un ejemplo de las tablas

TABLA 1: ID
TABLA 2: ID CODIGO NOMBRE (4, L, Lucas)
TABLA 3: CODIGO NOMBRE (L, Lucas)

Seleccionar la tabla 2 si coincide con la tabla 3 y luego insertar a la tabla 1. Te voy a mostrar ejemplo en SQL para poder ir a Delphi es igual funcionar para ejecutar.


SELECT ID FROM TABLA 2 WHERE CODIGO='L' and NOMBRE='Lucas'






Ahora la tabla 2 si coincide con la tabla 3 y luego insertar el ID de la tabla 1. Eso creo debe hacer IF entre tabla 2 y tabla 3 si coincide, luego insertar a la Tabla 1.

kuan-yiu
24-03-2020, 10:20:15
qInsertar:= TQuery.create(Application);
with qInsertar do
begin
try
close;
SQL.Clear;
DatabaseName := miBase;
SQL.Add('Insert into '+tabla1+' (Id)');
SQL.Add('Values (:id)');
Prepare;
tabla2.first;
tabla3.first;
//Si no están ordenadas tienes que tener dos bucles anidados. Si lo están vale algo así.
while (not tabla2.eof)and(not tabla3.eof) do
begin
if (tabla2.FieldByName('CODIGO').AsInteger=tabla3.FieldByName('CODIGO').AsInteger) and
(tabla2.FieldByName('NOMBRE').AsString=tabla3.FieldByName('NOMBRE').AsString) then
begin
Parambyname('id').AsInteger := tabla2.FieldByName('CODIGO').AsInteger;
ExecSQL;
tabla2.next;
tabla3.next;
end
else
begin
//Siguiente registro. Depende de la ordenación. Avanzando una u otra según cual sea menor o mayor.
end;
end;
finally
Free;
end;
end;

igamerpc
24-03-2020, 14:19:26
Ya esta solucionado era RecordCount si es 1 que si coincide las dos tablas a insertar el registro. Por fin llevo 1 semana intentando.

movorack
24-03-2020, 14:45:41
Te recomiendo revises la solución que te plantea [kuan-yiu].

El recordcount (http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_RecordCount.html) es una propiedad que indica el numero total de registros asociados al dataset, que no siempre coinciden con el número total de la tabla o consulta.

igamerpc
24-03-2020, 16:55:38
Vale hago lo d kuan-yiu lo probare a ver si va bien.