Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Buscar un registro por diferentes campos (https://www.clubdelphi.com/foros/showthread.php?t=83999)

jafera 26-08-2013 18:38:45

Buscar un registro por diferentes campos
 
Buenas a todos.

Necesito buscar un registro dentro de una tabla pero por diferentes campos, os explico tengo un form con un grid en el que se van colocando los registros seleccionados, este form tiene un edit en el que tecleo el nombre, la licencia, el dni o el codigo uci y mediante una consulta filtro los registros que cumplan la condicion para poder elegir el que corresponda, por ejemplo si tecleo gomez, me manda en un for auxiliar todos los registros que empiezan por gomez, si tecleo 12345678 me busca primero en el nombre, como no lo encuentra tendria que buscar en el dni pero me devuelve la consulta en blanco.

Este es el código:
Código Delphi [-]
 
procedure TF_Inscripcions.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
        If (Key=#13)  then
        begin
                F_BuscarInscripcio:=TF_BuscarInscripcio.Create(Application);
                begin
                        F_BuscarInscripcio.BuscarCorredor.Close;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Clear;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('SELECT DORSAL, NOM_LLARG, DNI, LLICENCIA, CODIUCI, NACIO, CLUB, ABR_CLUB, PUBLICITAT, EDAT, CATEGORIA FROM CTR0003');
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('WHERE NOM_LLARG STARTING' +QuotedStr(Edit1.Text));
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('ORDER BY NOM_LLARG');
                        F_BuscarInscripcio.BuscarCorredor.Open;
                        If F_BuscarInscripcio.BuscarCorredor.Recordcount>0 then
                        Abort;
                end;
                begin
                        F_BuscarInscripcio.BuscarCorredor.Close;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Clear;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('SELECT DORSAL, NOM_LLARG, DNI, LLICENCIA, CODIUCI, NACIO, CLUB, ABR_CLUB, PUBLICITAT, EDAT, CATEGORIA FROM CTR0003');
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('WHERE LLICENCIA STARTING' +QuotedStr(Edit1.Text));
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('ORDER BY LLICENCIA');
                        F_BuscarInscripcio.BuscarCorredor.Open;
                        if F_BuscarInscripcio.BuscarCorredor.RecordCount>0 then
                        Abort;
                end;
                begin
                        F_BuscarInscripcio.BuscarCorredor.Close;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Clear;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('SELECT DORSAL, NOM_LLARG, DNI, LLICENCIA, CODIUCI, NACIO, CLUB, ABR_CLUB, PUBLICITAT, EDAT, CATEGORIA FROM CTR0003');
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('WHERE DNI STARTING' +QuotedStr(Edit1.Text));
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('ORDER BY DNI');
                        F_BuscarInscripcio.BuscarCorredor.Open;
                        if F_BuscarInscripcio.BuscarCorredor.RecordCount>0 then
                        Abort;
                end;
                begin
                        F_BuscarInscripcio.BuscarCorredor.Close;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Clear;
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('SELECT DORSAL, NOM_LLARG, DNI, LLICENCIA, CODIUCI, NACIO, CLUB, ABR_CLUB, PUBLICITAT, EDAT, CATEGORIA FROM CTR0003');
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('WHERE CODIUCI STARTING' +QuotedStr(Edit1.Text));
                        F_BuscarInscripcio.BuscarCorredor.SQL.Add('ORDER BY CODIUCI');
                        F_BuscarInscripcio.BuscarCorredor.Open;
                        if F_BuscarInscripcio.BuscarCorredor.RecordCount>0 then
                end;
                F_BuscarInscripcio.Show;
        end;
end;
No se si los Abort esan bien colocados o donde puede estar el fallo, pero no me salta de un bloque a otro si el recordcount vale > 0

Gracias y saludos

Josep

Caminante 26-08-2013 19:59:49

Hola
No me quedaron claros tantos Begin End; pero bueno yo tengo en mi sistema una busqueda por nombre y ruc y mi consulta la hago mas o menos asi:

Código SQL [-]
Select [Mis campos]from Clientes where Nombre like :ParNom or Ruc like :ParRuc order by nombre;

fjcg02 26-08-2013 22:25:34

Hombre,
lo normal es poner varios edits para que el usuario pueda buscar por los campos más importantes. Luego montas la where de la query.
Código Delphi [-]
Si editNombre <>'' then 
  where := where+' campoNombre = '+ quotedStr(editNombre);
Si editDNI <>'' then 
  Si where <> '' then where:= where + 'AND '
  where := where+' campoDNI = '+ quotedStr(editDNI);
...
Y así sucesivamente

Query.SQL.Add(where);
Query Open;
Otra opción es poner un combo con los campos , seleccionar el campo por el que se quiere buscar y con un edit adicional para meter un valor volver a montar la where de la query.

Código Delphi [-]
where := 'where '+Combo.Text+ ' = '+ QueotedStr(Edit.Text)
Query.SQL.Add(where);
Query Open;

Y si quieres usar un sólo edit para varios campos, lo comentado,

SELECT * FROM TABLA WHERE CAMPO1 = '+QuotedStr(Edit.Text) +' OR CAMPO2 ='+QuotedStr(Edit.Text);

Cuidado con los valores nulos, si permites que los campos por los que buscas tengan valores nulos, tendrás que contemplarlo en la condición de la where.

Prueba y nos dices.

Un saludo

oscarac 27-08-2013 06:08:50

Yo lo hago asi
voy buscando con el locate los campos que quiera y si necesito mas campos simplemente agrego las lineas con el codigo y los campos adicionales

Código Delphi [-]
procedure TfrmCatalogoAnexo.edtSearchChange(Sender: TObject);
var _Position :TBookmarkStr;
begin
  if qryAnexos.Locate('Codigo', edtSearch.Text, [loPartialKey]) then
    Begin
      _position := qryAnexos.Bookmark;
      qryAnexos.Sort := 'Codigo';
      qryAnexos.Bookmark := _position;
      dbgAnexo.Show;
    End;
  if qryAnexos.Locate('Ruc', edtSearch.Text, [loPartialKey]) then
    Begin
      _position := qryAnexos.Bookmark;
      qryAnexos.Sort := 'Ruc';
      qryAnexos.Bookmark := _position;
      dbgAnexo.show;
    End;
  If qryAnexos.Locate('RazonSocial', edtSearch.Text, [loPartialKey]) then
    Begin
      _position := qryAnexos.Bookmark;
      qryAnexos.Sort := 'RazonSocial';
      qryAnexos.Bookmark := _position;
      dbgAnexo.show;
    End;
end;

jafera 27-08-2013 12:40:43

Gracias por vuestras respuestas.

Al final he implementado la solución de los or:

Código Delphi [-]
 
procedure TF_Inscripcions.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
        If (Key=#13)  then
        begin
                F_BuscarInscripcio:=TF_BuscarInscripcio.Create(Application);
                F_BuscarInscripcio.BuscarCorredor.Close;
                F_BuscarInscripcio.BuscarCorredor.SQL.Clear;
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('SELECT DORSAL, NOM_LLARG, DNI, LLICENCIA, CODIUCI, NACIO, CLUB, ABR_CLUB, PUBLICITAT, EDAT, CATEGORIA FROM CTR0003');
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('WHERE NOM_LLARG STARTING :NOM');
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('OR DNI STARTING :NOM');
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('OR LLICENCIA STARTING :NOM');
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('OR CODIUCI STARTING :NOM');
                F_BuscarInscripcio.BuscarCorredor.ParamByName('NOM').AsString:=Edit1.Text;
                F_BuscarInscripcio.BuscarCorredor.SQL.Add('ORDER BY NOM_LLARG');
                F_BuscarInscripcio.BuscarCorredor.Open;
                F_BuscarInscripcio.Show;
        end;
end;

El motivo del Edit único es por semejanza al uso de un programa que ya está funcionando en la actualidad y se hace así. Para no liar más a los usuarios imito el funcionamiento.

Saludos

Josep


La franja horaria es GMT +2. Ahora son las 17:38:34.

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