Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Insertar tabla de otra tabla con condiciones (https://www.clubdelphi.com/foros/showthread.php?t=94524)

igamerpc 18-03-2020 10:57:31

Insertar tabla de otra tabla con condiciones
 
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:
Código SQL [-]
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í:
Código Delphi [-]
   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.

Código SQL [-]
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

Código Delphi [-]
   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 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.


La franja horaria es GMT +2. Ahora son las 08:30:28.

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