Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Buscar un nombre en diferentes tablas

Buenos días,

Por un lado tengo una tabla Clientes y por otro Contactos. Esta última representa los contactos que tiene cada cliente. En este caso cada cliente puede tener varios contactos pero cada contacto solo tiene un cliente. Lo tengo hecho de tal manera que la tabla contactos tiene un campo IdCliente y es lo que uso en la consultas a través de SQL para saber qué contactos están vinculados a un cliente determinado.

El caso es que tengo un buscador en la ficha de clientes que permite localizar un cliente por su nombre, apellidos, dni o tfno

No se si es posible pero me interesaría que el buscador buscase en uno de esos campos tanto en la tabla clientes como en la tabla contactos ya que en muchas ocasiones al buscar una persona no sabemos si es cliente o contacto.

El buscador tiene los edit para introducir la búsqueda y por debajo un dbgrid que se va filtrando con los registros de clientes.

Uso ADO y Access

No sería demasiado importante que el DBGrid mostrase las dos tablas pero sí que por lo menos se viese el cliente que está relacionado con el campo del contacto que se busca.

Se me ocurrió crear un campo de texto en la tabla clientes que recogiese los nombres de los contactos y así incluir ese campo en la búsqueda pero cuando hay muchos contactos resulta poco "limpio" hacer esto.

¿Habría otra solución para poder ejecutar esta búsqueda?

Muchas Gracias
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #2  
Antiguo 24-11-2014
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
Hola Delphitest

Mi a ver si con esto te vale.

Código SQL [-]
SELECT
    CAMPO1
    ,CAMPO2
    ,CAMPOX
  FROM Clientes AS CLI
    INNER JOIN Contactos AS C
      C.IDCLIENTE = CLI.IDCLIENTE
  WHERE
    (
      CLI.NOMBRE LIKE <%Dato a buscar%>
      OR C.NOMBRE LIKE <%Dato a buscar%>
      OR CLI.APELLIDOS LIKE <%Dato a buscar%>
      OR C.APELLIDOS LIKE <%Dato a buscar%>
      OR CLI.DNI LIKE <%Dato a buscar%>
      OR C.DNI LIKE <%Dato a buscar%>
      OR CLI.TELEFONO LIKE <%Dato a buscar%>
      OR C.TELEFONO LIKE <%Dato a buscar%>
    )
Con esto buscaras en todos los campos en ambas tablas.

Un saludo
__________________
Al hacer una consulta SQL, haz que los demás te entiendan y disfruten de ella, será tú reflejo de tú saber.

Última edición por olbeup fecha: 24-11-2014 a las 08:47:28.
Responder Con Cita
  #3  
Antiguo 28-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Muchas gracias por tu ayuda olbeup,

He probado porque lo que indicas tiene bastante lógica pero me salta un error de sintasis en el FROM

He ido reduciendo la sentencia SQL para ver qué es lo que no funciona y por lo que veo es en tramo donde pongo INNER JOIN...

He intentado diferentes combinaciones a ver si con una funcionaba pero no hay manera.

Los nombres de los campos son correctos y los de las tablas tambien
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #4  
Antiguo 28-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Delphitest Ver Mensaje
Muchas gracias por tu ayuda olbeup,

He probado porque lo que indicas tiene bastante lógica pero me salta un error de sintasis en el FROM
...
Seguro ha sido un olvido al escribir, falta ON en la sintáxis de la composición:
Código SQL [-]
...
FROM Clientes AS CLI
    INNER JOIN Contactos AS C 
      ON C.IDCLIENTE = CLI.IDCLIENTE
...

Revisa la sintáxis de INNER JOIN

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 28-11-2014 a las 20:02:39.
Responder Con Cita
  #5  
Antiguo 28-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Era por eso si, gracias

Ya no da el error de sintasis en cuanto le he añadido el ON

Ahora estoy intentando entender porque solo muestra registros que tengan algún contacto

Es decir que no muestra los clientes que no tengan contactos relacionados.

Si un cliente tiene al menos un contacto relacionado si que aparece en el resultado de la búsqueda pero si el cliente tiene solo su registro sin ningún contacto relacionado pues no aparece en la lista.
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #6  
Antiguo 28-11-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Delphitest.
Cita:
Empezado por Delphitest Ver Mensaje
...
Ahora estoy intentando entender porque solo muestra registros que tengan algún contacto

Es decir que no muestra los clientes que no tengan contactos relacionados.

Si un cliente tiene al menos un contacto relacionado si que aparece en el resultado de la búsqueda pero si el cliente tiene solo su registro sin ningún contacto relacionado pues no aparece en la lista.
...
En ese caso creo que vas a tener que usar FULL OUTER JOIN
Código SQL [-]
SELECT ...
FROM CLIENTES CL FULL OUTER JOIN CONTACTOS CO
   ON CL.ID = CO.CLIENTE_ID
WHERE ...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 28-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Adjunto un pantallazo del form y el código que estoy probando porque me estoy liando un poco.

Por un lado tengo el formulario para buscar un cliente

Tiene unos edits donde meto lo que quiero buscar y a medida que escribo el dbgrid que hay por debajo se va filtrando con lo que corresponda.

Lo que pretendo es que al poner el nombre, ademas de buscar en el nombre de la tabla clientes, lo haga también en la tabla contactos de tal manera que el grid vaya mostrando el o los clientes cuyo nombre sea el que estoy escribiendo en el edit correspondiente o el cliente que tenga un contacto cuyo nombre coincida también con la búsqueda.

Con este código solo veo el cliente cuyo nombre contenga lo que escribo en el edit pero no está buscando en contactos por las pruebas que he hecho.

También he notado que si el cliente no tienen ningún contacto relacionado, tampoco se lista.

Código Delphi [-]
procedure TFBuscaCliente.Edit1Change(Sender: TObject);

var bOtraCondicion :boolean;

begin
  bOtraCondicion:=false;
  with TBuscarCliente do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM CLIENTES');

    if ( (Edit1.Text <>'') or  (Edit2.Text <>'') or (Edit3.Text <>'') or  (Edit4.Text <>'') or (Edit5.Text <>'') ) then
    begin
  Close;
    SQL.Clear;
    SQL.Add('SELECT cli.IDCLIENTE,cli.NOMBRE, cli.APELLIDOS, cli.DNI, cli.TELEFONO_FIJO, cli.PROVINCIA FROM CLIENTES AS CLI INNER JOIN Contactos AS C ON C.IDCLIENTE = CLI.IDCLIENTE');
    SQL.Add('WHERE');

      if  Edit1.Text <>'' then
      begin
        SQL.Add('CLI.NOMBRE LIKE :PNOM OR C.NOMBRE LIKE :PNOM');
        bOtraCondicion:= true;
        Parameters.ParamByName('PNOM').Value:= '%'+Edit1.Text+'%';
      end;

      if  Edit2.Text <>'' then
      begin
        if bOtraCondicion then
        SQL.Add('AND');
        SQL.Add('CLI.APELLIDOS LIKE :PAPE OR C.APELLIDOS LIKE :PAPE');
        bOtraCondicion:= true;
        Parameters.ParamByName('PAPE').Value:= '%'+Edit2.Text+'%';
      end;

      if  Edit3.Text <>'' then
      begin
        if bOtraCondicion then
        SQL.Add('AND');
        SQL.Add('CLI.DNI LIKE :PDNI OR C.DNI LIKE :PDNI');
        Parameters.ParamByName('PDNI').Value:= '%'+Edit3.Text+'%';
      end;

      if  Edit4.Text <>'' then
      begin
        if bOtraCondicion then
        SQL.Add('AND');
        SQL.Add('CLI.PROVINCIA LIKE :PPROV OR C.PROVINCIA LIKE :PPROV');
        Parameters.ParamByName('PPROV').Value:= '%'+Edit4.Text+'%';
      end;

      if  Edit5.Text <>'' then
      begin
        if bOtraCondicion then
        SQL.Add('AND');
        SQL.Add('CLI.TELEFONO_FIJO LIKE :PTFNO OR C.TELEFONO_FIJO LIKE :PTFNO');
        Parameters.ParamByName('PTFNO').Value:= '%'+Edit5.Text+'%';
      end;

    end;
    Open;
  end;
end;

Las tablas están en un Data Modulo a parte pero los campos se leen sin problemas y TBuscarCliente es una query que esta en este Form y que esta relacionada con el DBGrid, igual tengo el problema ahí...
Imágenes Adjuntas
Tipo de Archivo: jpg BuscarCliente.jpg (28,0 KB, 3 visitas)
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #8  
Antiguo 28-11-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Pero eso no es lo mismo que esto?
Responder Con Cita
  #9  
Antiguo 29-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Buenos días,

inicialmente la idea era buscar por varios campos en una sola tabla, la de clientes. Eso ya se resolvió en el post que comentas y funciona perfectamente.

Ahora me ha surgido la necesidad de que la búsqueda se haga ademas de en la tabla de clientes, también y a la vez en la tabla de contactos.

De ahí mi consulta para intentar adaptar el código.

ECFISA, he probado con FULL OUTER en lugar de INNER pero me devuelve este error:

"Objeto Parameter mal definido. Se proporcionó información incompleta o incoherente"
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #10  
Antiguo 29-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Vaya, ayer me tire unas cuantas hora probando de todo y no había manera, hoy me he levantado inspirado y después de hacer pruebas ya consigo que los resultados de la búsqueda muestren también los clientes que no tenga contactos relacionados.

Me funciona utilizando LEFT JOIN

Solo me falta que la búsqueda tenga en cuenta los datos de la tabla contactos, porque estoy comprobando que no lo hace, solo se buscan dentro de clientes.
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #11  
Antiguo 29-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Ya sé donde tengo el fallo pero no acabo de dar con la solución.

Sólo se tiene en cuenta la primera condición pero no lo que pongo después del 'OR', posiblemente no lo esté escribiendo correctamente. El caso es que no da error de ningun tipo pero veo que no lo tiene en cuenta. He hecho estas pruebas:

Con esto lo busca solo en la tabla de clientes

Código Delphi [-]
SQL.Add('CLI.NOMBRE LIKE :PNOM OR C.NOMBRE LIKE :PNOM');

Con esto lo busca solo en la tabla de contactos

Código Delphi [-]
SQL.Add('C.NOMBRE LIKE :PNOM OR CLI.NOMBRE LIKE :PNOM');

He probado por si acaso:

Código Delphi [-]
 SQL.Add('(C.NOMBRE LIKE :PNOM)');
 SQL.Add('OR');
 SQL.Add('(CLI.NOMBRE LIKE :PNOM)');

Pero nada, tiene que ser algo relacionado con el uso de las comillas o paréntesis pero por muchas combinaciones que estoy haciendo no doy con ello.
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
  #12  
Antiguo 29-11-2014
Delphitest Delphitest is offline
Miembro
 
Registrado: sep 2006
Ubicación: Salamanca-España
Posts: 249
Poder: 18
Delphitest Va por buen camino
Solucionado...

Como se suele decir, no te acostarás sin saber una cosa más.

He llegado a la conclusión que solo puedo hacer uso del parámetro una vez en la sentencia. Al probar con dos parámetros se ha solucionado el problema.

Código Delphi [-]
SQL.Add('CLI.NOMBRE LIKE :PNOM OR C.NOMBRE LIKE :PNOM2');
bOtraCondicion:= true;
Parameters.ParamByName('PNOM').Value:= '%'+Edit1.Text+'%';
Parameters.ParamByName('PNOM2').Value:= '%'+Edit1.Text+'%';

Muchas gracias por vuestra ayuda y siento haber mareado tanto con este tema

Un abrazo y buen fin de semana
__________________
Mi proyecto paso a paso (Parte I)
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Buscar un registro por diferentes campos jafera OOP 4 27-08-2013 12:40:43
Unir el codigo y nombre de tablas diferentes Jose Manuel SQL 1 13-03-2010 11:26:38
Inserción tablas DB diferentes Delfino Firebird e Interbase 1 26-02-2010 13:54:18
Mostrar nombre de campos y filtar nombre de tablas .db en un combobox Coco_jac Varios 1 24-06-2006 01:34:29
Como buscar en diferentes tablas?? Sasuke_Cub Conexión con bases de datos 3 20-06-2005 10:40:19


La franja horaria es GMT +2. Ahora son las 18:01:11.


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
Copyright 1996-2007 Club Delphi