Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Buscar entre 3 tablas y mostrarlo en DBText el Resultado (https://www.clubdelphi.com/foros/showthread.php?t=91339)

koalasoft 08-01-2017 04:14:28

Buscar entre 3 tablas y mostrarlo en DBText el Resultado
 
Estimados tengo el siguiente detalles.

Tengo 3 Tablas diferentes con los siguientes campos:

Código:

ONT.db
ID_ONT
MAC
SERIE
TIPO
FOLIO
 
CLIENTES.db
ID_CL
NOMBRE
DIRECCION
TELEFONO
FOLIO
 
CTRL.db
BOARD
VELOCIDAD
STATUS
ID_CL
ID_ONT
FOLIO

Es una tabla (ONT.db) que es un equipo, el de clientes (cliente.db) y una tabla para llaver el control (ctrl.db)

Lo que pretendo es que ya que en la tres tablas tiene el campo FOLIO que es generado al trabajar en la tabla CTRL.db, en este último guardo solo los ID de cliente y equipo (ont) para que no haya redundancia de información en las tablas, es por eso que solo guardo el ID de cada uno.. ahora bien ..

Tengo el siguiente escenario...

coloque 3 query en el form, uno para cada tabla QueryONT, QueryCL QueryCTRL,, coloque unos DBTexto donde esta la sección donde aparecerá el nombre del cliente, en el otra sección los datos del equipo (ont) y lo demás datos que tiene la tabla CTRLONT igual en unos DBText.

Tengo este código...


Código Delphi [-]
with QueryCTRL do          // Busqueda por Modelo y Tipo
 begin
   Close;
   SQL.Clear;
   // ------------------------------------------------------------
   // Se ultilizó el PArametro JOIN para unir las otras Tablas
   // relacionando el Campo FOLIO en todas ellas siempre y cuando
   // Se cumpliera la condicion de busqueda del ONT ya registrado.
   // ------------------------------------------------------------
   SQL.Add('SELECT * FROM CTRL.db CTRL ');
   SQL.Add('join CLIENTES.db CL on CTRL.FOLIO = CL.FOLIO ');
   SQL.Add('join ONT.db ONT on CTRL.FOLIO = ONT.Folio ');
   SQL.Add('WHERE BOARD_ONT=:BOARD_ONT');  
   // --------------------------------------------------------
   //  Valores de búsqueda para el tablero.
   // --------------------------------------------------------
   ParamByName('BOARD_ONT').AsInteger := StrToInt(Edit1.Text);
   Open;
   if QueryCTRL.IsEmpty then
    Begin
    msError('El ONT no se encuentra registrado, porfavor verifica los datos.','No existe Datos..');
    End
     Else
      Begin
      Bok.Enabled := True;
      End;
 end;

Use la opción join ya que dice que puedes checar la similitud de campos entre tablas .... si me hace la búsqueda cn la condición que le puse .. pero en el fomulario no me muestra los datos restantes del cliente (nnombre, direccion, tel,etc..) y equipo ont (MAC, SERIE, TIPO)..

Me faltará algo para que e muestre os datos restantes teniendo solo relacionado entre ellos el folio??


Gracias !!

koalasoft 08-01-2017 05:44:08

Que tal .. pues me respondo a mi mismo, busqué esta forma no se si sea la mas elegante pero al menos funcionó en lo que buscaba !!

Declaré una variable para extraer el folio y después ya teniendo ese valor lo use para consultar las demás ..

Código Delphi [-]
Var
  F : Integer;

...
..
.

with QueryCTRL do          // Busqueda por Modelo y Tipo
 begin
   Close;
   SQL.Clear;
   // ------------------------------------------------------------
   // Se ultilizó el PArametro JOIN para unir las otras Tablas
   // relacionando el Campo FOLIO en todas ellas siempre y cuando
   // Se cumpliera la condicion de busqueda del ONT ya registrado.
   // ------------------------------------------------------------
   SQL.Add('SELECT * FROM CTRL.db CTRL ');
   SQL.Add('join CLIENTES.db CL on CTRL.FOLIO = CL.FOLIO ');
   SQL.Add('join ONT.db ONT on CTRL.FOLIO = ONT.Folio ');
   SQL.Add('WHERE BOARD_ONT=:BOARD_ONT'); 
   // --------------------------------------------------------
   //  Valores de búsqueda para el tablero.
   // --------------------------------------------------------
   ParamByName('BOARD_ONT').AsInteger := StrToInt(Edit1.Text);
   Open;
   if QueryCTRL.IsEmpty then
    Begin
    msError('El ONT no se encuentra registrado, porfavor verifica los datos.','No existe Datos..');
    End
     Else
      Begin
      F:= QueryRegONT.FieldByName('FOLIO').AsInteger;      // -------------------
      with QueryCL do          // Busqueda por Modelo y Tipo
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM CLIENTES.db ');
          SQL.Add('WHERE FOLIO=:FOLIO');
          ParamByName('FOLIO').AsInteger :=F;
          Open;
        end;
      with QueryONT do          // Busqueda por Modelo y Tipo
        begin
          Close;
          SQL.Clear;
          SQL.Add('SELECT * FROM ONT.db ');
          SQL.Add('WHERE FOLIO=:FOLIO');
          ParamByName('FOLIO').AsInteger :=F;
          Open;
        end;      
    End;
 end;

Con esto, una vez realizada la primera búsqueda, extraigo el campo FOLIO que esta relacionado con las otras tablas, ahora solo lo guarde en una variable y lo use en las otras búsquedas.

Gracias y quedo solucionado por mi parte, si hay alguna mejor idea por favor de compartir !! ..


La franja horaria es GMT +2. Ahora son las 23:35:40.

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