PDA

Ver la Versión Completa : Busqueda en un DBF sin SQL


RoyTan
11-02-2008, 11:41:58
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:

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:

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
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 [-] (http://www.clubdelphi.com/foros/#)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

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

Select * from Clientes where Nombre Like ' + QuotedStr('%' + txNombre.Text + '%') + ' Order by CampoOrdenar

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