Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Busqueda en un DBF sin SQL (https://www.clubdelphi.com/foros/showthread.php?t=53107)

RoyTan 11-02-2008 11:41:58

Busqueda en un DBF sin SQL
 
Saludos.

Siempre tuve una gran duda sobre las búsquedas en los campos de un dbf.

Resulta que si se utiliza “Locate” para buscar en un determinado campo por ejemplo
ModuloDatos.TCliente.Locate('NOMBRE',Edit.Text,[loPartialKey, loCaseInsensitive]);

En el Edit tienes que poner el nombre exacto del cliente a buscar, y si no es exacto no lo encuentra.

Mi pregunta es la siguiente.
¿Hay alguna forma de filtrar los nombres de búsquedas sin utilizar SQL para que tan solo utilizando varios caracteres que contengan la palabra a buscar la encuentre?

Pongo un ejemplo.

Necesito buscar la palabra CIENPIES, con Locate siempre tengo que poner la primera letra por lo menos para que aparezca.

Y yo necesito que con solo poner PIES aparezca.

¿Es eso posible sin utilizar SQL en una base de datos DBF?

Espero y deseo haberme explicado bien.

Gracias

eduarcol 11-02-2008 14:04:59

no entiendo porq complicarlo, si con una sql es tan facil como:

Código SQL [-]
Select * from cliente where nombre like %:nom%

RoyTan 11-02-2008 14:59:49

Sí, seguramente es facil.
Pero nunca he trabajado con SQL y no tengo ni idea donde poner ese codigo que tu me comentas.

¿En el onkeypress del edit?:confused:

¿Me vale el TTable o tengo que cambiarlo por el TQuerry?:confused:

No se como hacerlo, tampoco pretendo que me enseñeis paso a paso. Con un sencillo y pequeño empujón tengo suficiente.

Gracias Eduarcol

eduarcol 11-02-2008 15:16:20

voy a tratar de ponerlo facil

1.- Coloca un TQuery
2.- Configuralo como si fuera el TTable
3.- En el evento que deseas realizar la busqueda escribe el siguiente codigo:

Código Delphi [-]
begin
   //Cierra el query
   MiQuery.Active := False;
   //Establece la sentencia donde clientes es el nombre de la tabla,
   //Nombre es el campo por el que se realizara la busqueda y
   //txNombre la caja de texto por la que va a buscar
   MiQuery.Sql.Text := 'Select * from Clientes where Nombre Like ' + QuotedStr(txNombre.Text + '%');
   MiQuery.Active := True;
end;

Lo coloco de memoria, si te da un error avisas para ayudarte a corregirlo

RoyTan 11-02-2008 15:31:55

Vale de acuerdo.

Solo una duda, ¿ya tengo en el Datamodule un TTable Clientes, que hago, lo dejo o lo sustituyo por TQuerry Clientes?

¿Pueden estar los dos o juntos son incompatibles?
Me refiero a TTable yTQuerry conectados a la misma base de datos.

Gracias.

eduarcol 11-02-2008 15:35:36

si tienes otro uso para el tTable dejalo, si no lo necesitas mas quitalo, no son incompatibles

RoyTan 11-02-2008 18:38:53

Ok Eduarcol.

Voy a probar y mañana te cuento Ok.

Gracias amigo.

RoyTan 11-02-2008 19:42:44

Bueno empezamos mal con el SQL.
Creo que no he configurado bien el TQuery.
Porque al compilar el programa me da el siguiente error.
TQuery: No SQL statament available
Si tengo un TTable Clientes y un TQuery Clientes, ¿ Tengo que tener también un TDataSource para cada uno de ellos?

Gracias.

eduarcol 11-02-2008 20:02:09

Lo mas seguro es que estas tratando de abrirlo antes de asignarle el SQL, el active := True o el Open saltatelo hasta que llegues al codigo que te escribi

RoyTan 11-02-2008 20:36:11

Sí pero el problema es que no soy capaz de poner a True la propiedad Active del TQuery.

No se como hacerlo me da error.

eduarcol 11-02-2008 20:40:44

puedes explicarnos como lo tratas de hacer, paso a paso para encontrar el error

RoyTan 11-02-2008 21:12:45

Bueno haber si puedo explicarme para que me podáis entender.
Tengo en un DataModule , Un TTableClientes, Un TQueryClientes, un DataSourceClientes1 y otro DatasourceClientes2.
El TTableClientes con las propiedades
DatabaseName = C:\Progreama\Datos
TableName = Clientes.Dbf
Active = True
Está conectado a un DataSourceClientes1
-------Otro------.
El TQueryClientes con las propiedades
DatabaseName = C:\Progreama\Datos
TableName no tiene (y lo que no sé es donde poner la Base de datos Clientes.dbf)
Active = False
Este conectado a un DataSourceClientes2
Aclarar que no tengo instalado ni Oracle, ni MySql ni nada de eso, tampoco tengo interbase.
No se si hace falta instalar algo de eso.
Saludos.

eduarcol 11-02-2008 22:17:51

bueno vamos bien, ahora asi como esta lo que tienes es qe colocar el codigo de arriba en el evento que deseas realizar la busqueda

RoyTan 11-02-2008 23:28:18

Sencillamente sencillo.
Eres grande Eduarcol, esto funciona de maravilla.

Tan solo decirte que sigue saliendo la excepcion al compilar que dice...

TQuery: No SQL statament available.

Y no sé porque, pero de todas formas si le doy a continuar funciona.

Gracias.

eduarcol 12-02-2008 13:43:58

no ni tan grande si supieras como 1.72 :D:D

esa excepcion es porq estas tratando de realizar un open, cuando te salte fijate en que linea y quitas el TQuery.open

RoyTan 13-02-2008 00:21:00

Ok.
Solucionado.

El Hombre no se mide por su altura, se lo hace por su grandeza.

Gracias Eduarcol.

Saludos desde España.:)

fpirovani 14-02-2008 18:37:21

Cita:

Empezado por eduarcol (Mensaje 264882)
voy a tratar de ponerlo facil

1.- Coloca un TQuery
2.- Configuralo como si fuera el TTable
3.- En el evento que deseas realizar la busqueda escribe el siguiente codigo:


Código Delphi [-]begin
//Cierra el query
MiQuery.Active := False;
//Establece la sentencia donde clientes es el nombre de la tabla,
//Nombre es el campo por el que se realizara la busqueda y
//txNombre la caja de texto por la que va a buscar
MiQuery.Sql.Text := 'Select * from Clientes where Nombre Like ' + QuotedStr(txNombre.Text + '%');
MiQuery.Active := True;
end;




Lo coloco de memoria, si te da un error avisas para ayudarte a corregirlo

Hola a todos!
Justamente estoy tratando de hacer lo mismo que RoyTan. Hice todo como figura en la cita que hice del post de eduarcol, pero cuando quiero buscar, para que encuentre una coincidiencia tengo que ingresar el nombre empezando por la primer letra. Por ejemplo: si quiero buscar CARLOS en el campo NOMBRE tengo que escribir primero la C despues la A etc.
yo lo q necesito es que si escribo en el edit OS me muestre todos los registros que dentro del campo NOMBRE figure OS. Por ejemplo: carlOS, marcOS.
Si no entendi mal lo que lei del hilo que creo RoyTan el queria hacer justamente eso.

Saludos

eduarcol 14-02-2008 18:49:59

el operador %, se utiliza para determinar la ubicacion de la cadena de busqueda en el ejemplo de roytan esta al final, o sea todo lo que comienze como se indica y termine en lo que sea.

Si quieres lograr eso, modifica esta linea

Código Delphi [-]
MiQuery.Sql.Text := 'Select * from Clientes where Nombre Like ' + QuotedStr('%' + txNombre.Text + '%');

fpirovani 14-02-2008 20:42:29

Buenisimo!! muchas gracias anda perfecto!

Ahora yo tengo un DBgrid donde se muestra lo que va encontrando a medida que se escribe, pero no me aparece ordenado en orden alfabetico...
y en el Query no contre donde espesificar un indice como para que lo ordene, tal como la propiedad IndexName del TTable (TTable.IndexName)

ya que estoy te pregunto, hay algun tutorial, manual, libro o algo parecido donde se puedan aprender detalles como el de la ubicacion del signo % en el Query

eduarcol 14-02-2008 21:03:20

Cita:

Empezado por fpirovani (Mensaje 265983)
Buenisimo!! muchas gracias anda perfecto!

Ahora yo tengo un DBgrid donde se muestra lo que va encontrando a medida que se escribe, pero no me aparece ordenado en orden alfabetico...
y en el Query no contre donde espesificar un indice como para que lo ordene, tal como la propiedad IndexName del TTable (TTable.IndexName)

ya que estoy te pregunto, hay algun tutorial, manual, libro o algo parecido donde se puedan aprender detalles como el de la ubicacion del signo % en el Query

Busca en google MANUAL DE SQL, encontraras informacion de sobra, con respecto al orden prueba esta sentencia:

Código SQL [-]
Select * from Clientes where Nombre Like ' + QuotedStr('%' + txNombre.Text + '%') + ' Order by CampoOrdenar

Donde "CampoOrdenar", es el campo por el que quieres ordenar el grid.


La franja horaria es GMT +2. Ahora son las 21:28:09.

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