PDA

Ver la Versión Completa : Buscar un registro por diferentes campos


jafera
26-08-2013, 18:38:45
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:

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:

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

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

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:


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