PDA

Ver la Versión Completa : Buscar Registro Semejantes


servicomp
31-08-2010, 01:09:07
Hola compañeros

Tengo una pequeña base de datos, con los campos, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL. Deseo que el usuario busque por uno de los campos de la tabla, asi no conozca el nombre completo, y me lo envie a un DBGrid.

Estos usando Firebird y para hacer la conexión estoy usando IBX, pero como arranco para este proceso

Agradeciendo de antemano la atención prestada


Macana

Casimiro Notevi
31-08-2010, 01:18:49
Pues tendrás que hacerlo como "en la vida real", o sea, comparar cada campo. Me explico, el usuario escribe una cadena a buscar en un TEdit. (por ejemplo)

Ahora debes pedir al servidor de datos lo que te interesa buscar, puede ser algo parecido a esto:


select *
from tbclientes
where NOMBRE1 containing :cQueBusco
or NOMBRE2 containing :cQueBusco
or APELLIDO1 containing :cQueBusco
or APELLIDO2 containing :cQueBusco
or NOMCOMERCIAL containing :cQueBusco


Puedes crear el select desde delphi o pasarle el valor a buscar como un parámetro a un IBQuery (por ejemplo) que ya tenga creada la sentencia.

servicomp
31-08-2010, 01:26:27
Perdon.

el usuario ya ha seleccionado por cual de los campos desea buscar, mi problema aparece es cuando deseamos buscar por uno de los campos por ejemplo la palabra 'ALBERTO', pero el usuario solo escribe 'ALBE', y deberian sali en mi dbgrid, todos los registros que el campo NOMBRE1, inicien con 'ALBE', hay algun comodin para usarlo, o alguna instrucción.


Agradeciendo de antemano la ayuda


Macana

Casimiro Notevi
31-08-2010, 01:48:18
Entonces puedes usar "like"

servicomp
02-09-2010, 19:40:25
Agradezco la colaboración amigos, con la siguiente espreción que deseo colocar por si alguien en un futuro lo necesita, resolvi parte del problema

SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 LIKE'+Edit1.Text+'%

El problema es que la consulta la realizo con in IBQuery, y deseo que los resultados me aparezcan en un DBGird. ¿Como direcciono los datos que me da el IBQuery al DBGrid?

Agradeciendo de antemano la atención prestada

IVAND
04-09-2010, 21:14:14
Enlazas al Ibquery con un componente Datasource (Propiedad Dataset colocas en nombre del Ibquery) y a este con el dbgrid en su propiedad Datasource

servicomp
14-09-2010, 01:33:52
Bueno amigos, le cuanto que estoy usando para mi busquedad la sentencia SQL que escribi en la antigua consulta y que coloco de nuevo a continuación.

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 LIKE "J% " ORDER BY NOMBRE2' );

Le he colocado la "J%", como por ejemplo me busque los registros que inician por J y el comodin, pero al ejecutar la opcion IBuscar.Open, para activar la busqueda, me lanza el siguiente error

SQL Error Code = -206
Column Unknown
J%

Al parecer no me esta tomando el LIKE y me esta tomando la J% como una columna.

Agradezco sus comentarios para resolver esta trivial consulta.


Macana

ARPE
14-09-2010, 08:06:03
Hola, me temo que es cuestión de comillas y cuentan por ahí que es más eficiente "starting with" que "like xxx%".

La consulta quedaría algo así:

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 LIKE ''' + edit1.text + '%'' ORDER BY NOMBRE2');

Todo son comillas simples, pero cuentan que es mejor esta

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with ''' + edit1.text + ''' ORDER BY NOMBRE2');

y lo malo como el usuario te escriba L'Andreu

saludos.

mcs
14-09-2010, 10:44:58
Hola, me temo que es cuestión de comillas y cuentan por ahí que es más eficiente "starting with" que "like xxx%".

La consulta quedaría algo así:

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 LIKE ''' + edit1.text + '%'' ORDER BY NOMBRE2');

Todo son comillas simples, pero cuentan que es mejor esta

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with ''' + edit1.text + ''' ORDER BY NOMBRE2');

y lo malo como el usuario te escriba L'Andreu

saludos.

No sería mejor pasar el nombre por parámetros? No sé como funcionan estos componentes que usáis, pero en los IBDAC sería algo como:


IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with '':NOMBRE'' ORDER BY NOMBRE2');
IBuscar.ParamByName('NOMBRE').AsString:=edit1.text;


Así nos ahorramos los problemas de escribir L'Andreu y cosas similares...

Ah, observar que :NOMBRE no está entre comillas, está entre apostrofes... Las comillas producen el error que comentaba antes servicomp (el -206 de "Column not found")

guillotmarc
14-09-2010, 10:52:07
Todo son comillas simples, pero cuentan que es mejor esta

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with ''' + edit1.text + ''' ORDER BY NOMBRE2');

y lo malo como el usuario te escriba L'Andreu


Para evitar eso se utilizan consultas con parámetros :

IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1, APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with :NOMBRE ORDER BY NOMBRE2');

IBuscar.ParamByName('NOMBRE').Value := 'J';

Saludos.