Ir al contenido


Foto

Buscar entre 3 tablas y mostrarlo en DBText el Resultado


Mejor respuesta Koalasoft , 07 enero 2017 - 09:41

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 ..

delphi
  1. Var
  2.   F : Integer;
  3.  
  4. ...
  5. ..
  6. .
  7.  
  8. with QueryCTRL do          // Busqueda por Modelo y Tipo
  9.  begin
  10.    Close;
  11.    SQL.Clear;
  12.    // ------------------------------------------------------------
  13.    // Se ultilizó el PArametro JOIN para unir las otras Tablas
  14.    // relacionando el Campo FOLIO en todas ellas siempre y cuando
  15.    // Se cumpliera la condicion de busqueda del ONT ya registrado.
  16.    // ------------------------------------------------------------
  17.    SQL.Add('SELECT * FROM CTRL.db CTRL ');
  18.    SQL.Add('join CLIENTES.db CL on CTRL.FOLIO = CL.FOLIO ');
  19.    SQL.Add('join ONT.db ONT on CTRL.FOLIO = ONT.Folio ');
  20.    SQL.Add('WHERE BOARD_ONT=:BOARD_ONT'); 
  21.    // --------------------------------------------------------
  22.    //  Valores de búsqueda para el tablero.
  23.    // --------------------------------------------------------
  24.    ParamByName('BOARD_ONT').AsInteger := StrToInt(Edit1.Text);
  25.    Open;
  26.    if QueryCTRL.IsEmpty then
  27.     Begin
  28.     msError('El ONT no se encuentra registrado, porfavor verifica los datos.','No existe Datos..');
  29.     End
  30.      Else
  31.       Begin
  32.       F:= QueryRegONT.FieldByName('FOLIO').AsInteger;      // -------------------
  33.       with QueryCL do          // Busqueda por Modelo y Tipo
  34.         begin
  35.           Close;
  36.           SQL.Clear;
  37.           SQL.Add('SELECT * FROM CLIENTES.db ');
  38.           SQL.Add('WHERE FOLIO=:FOLIO');
  39.           ParamByName('FOLIO').AsInteger :=F;
  40.           Open;
  41.         end;
  42.       with QueryONT do          // Busqueda por Modelo y Tipo
  43.         begin
  44.           Close;
  45.           SQL.Clear;
  46.           SQL.Add('SELECT * FROM ONT.db ');
  47.           SQL.Add('WHERE FOLIO=:FOLIO');
  48.           ParamByName('FOLIO').AsInteger :=F;
  49.           Open;
  50.         end;      End;
  51.  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 !! .. Ir al mensaje completo


  • Por favor identifícate para responder
2 respuestas en este tema

#1 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 07 enero 2017 - 08:13

Estimados tengo el siguiente detalles.
 
Tengo 3 Tablas diferentes con los siguientes campos:

delphi
  1. ONT.db
  2. ID_ONT
  3. MAC
  4. SERIE
  5. TIPO
  6. FOLIO
  7.  
  8. CLIENTES.db
  9. ID_CL
  10. NOMBRE
  11. DIRECCION
  12. TELEFONO
  13. FOLIO
  14.  
  15. CTRL.db
  16. BOARD
  17. VELOCIDAD
  18. STATUS
  19. ID_CL
  20. ID_ONT
  21. 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...
 


delphi
  1. with QueryCTRL do          // Busqueda por Modelo y Tipo
  2.  begin
  3.    Close;
  4.    SQL.Clear;
  5.    // ------------------------------------------------------------
  6.    // Se ultilizó el PArametro JOIN para unir las otras Tablas
  7.    // relacionando el Campo FOLIO en todas ellas siempre y cuando
  8.    // Se cumpliera la condicion de busqueda del ONT ya registrado.
  9.    // ------------------------------------------------------------
  10.    SQL.Add('SELECT * FROM CTRL.db CTRL ');
  11.    SQL.Add('join CLIENTES.db CL on CTRL.FOLIO = CL.FOLIO ');
  12.    SQL.Add('join ONT.db ONT on CTRL.FOLIO = ONT.Folio ');
  13.    SQL.Add('WHERE BOARD_ONT=:BOARD_ONT'); 
  14.    // --------------------------------------------------------
  15.    //  Valores de búsqueda para el tablero.
  16.    // --------------------------------------------------------
  17.    ParamByName('BOARD_ONT').AsInteger := StrToInt(Edit1.Text);
  18.    Open;
  19.    if QueryCTRL.IsEmpty then
  20.     Begin
  21.     msError('El ONT no se encuentra registrado, porfavor verifica los datos.','No existe Datos..');
  22.     End
  23.      Else
  24.       Begin
  25.       Bok.Enabled := True;
  26.       End;
  27.  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 !!
  • 0

#2 Koalasoft

Koalasoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 142 mensajes
  • LocationMéxico

Escrito 07 enero 2017 - 09:41   Mejor respuesta

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 ..

delphi
  1. Var
  2.   F : Integer;
  3.  
  4. ...
  5. ..
  6. .
  7.  
  8. with QueryCTRL do          // Busqueda por Modelo y Tipo
  9.  begin
  10.    Close;
  11.    SQL.Clear;
  12.    // ------------------------------------------------------------
  13.    // Se ultilizó el PArametro JOIN para unir las otras Tablas
  14.    // relacionando el Campo FOLIO en todas ellas siempre y cuando
  15.    // Se cumpliera la condicion de busqueda del ONT ya registrado.
  16.    // ------------------------------------------------------------
  17.    SQL.Add('SELECT * FROM CTRL.db CTRL ');
  18.    SQL.Add('join CLIENTES.db CL on CTRL.FOLIO = CL.FOLIO ');
  19.    SQL.Add('join ONT.db ONT on CTRL.FOLIO = ONT.Folio ');
  20.    SQL.Add('WHERE BOARD_ONT=:BOARD_ONT'); 
  21.    // --------------------------------------------------------
  22.    //  Valores de búsqueda para el tablero.
  23.    // --------------------------------------------------------
  24.    ParamByName('BOARD_ONT').AsInteger := StrToInt(Edit1.Text);
  25.    Open;
  26.    if QueryCTRL.IsEmpty then
  27.     Begin
  28.     msError('El ONT no se encuentra registrado, porfavor verifica los datos.','No existe Datos..');
  29.     End
  30.      Else
  31.       Begin
  32.       F:= QueryRegONT.FieldByName('FOLIO').AsInteger;      // -------------------
  33.       with QueryCL do          // Busqueda por Modelo y Tipo
  34.         begin
  35.           Close;
  36.           SQL.Clear;
  37.           SQL.Add('SELECT * FROM CLIENTES.db ');
  38.           SQL.Add('WHERE FOLIO=:FOLIO');
  39.           ParamByName('FOLIO').AsInteger :=F;
  40.           Open;
  41.         end;
  42.       with QueryONT do          // Busqueda por Modelo y Tipo
  43.         begin
  44.           Close;
  45.           SQL.Clear;
  46.           SQL.Add('SELECT * FROM ONT.db ');
  47.           SQL.Add('WHERE FOLIO=:FOLIO');
  48.           ParamByName('FOLIO').AsInteger :=F;
  49.           Open;
  50.         end;      End;
  51.  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 !! ..
  • 1

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 enero 2017 - 08:23

No sé en qué motor de base de datos trabajas, normalmente puedes hacerlo desde la misma consulta SQL:


sql
  1. SELECT t1.*, t2.*, t3.* FROM tabla1 t1
  2. JOIN tabla2 t2 ON t2.id = t1.id
  3. JOIN tabla3 t3 ON t3.id = t1.id
  4. WHERE (t1.campo = :algo1) OR (t2.campo = :algo2) OR (t3.campo = :algo3)


  • 0




IP.Board spam blocked by CleanTalk.