PDA

Ver la Versión Completa : Filtrar por contenido en Paradox


RyAr
12-05-2004, 23:47:33
Pues estoy intentado filtar una tabla por el contenido que ponga en un edit normal. Un ejemplo seria que si tengo estos registros:

Jose Luis
Luis
Angel

Y en el Edit1.text pongo Luis, me devolviera la tabla filtrada con:

Jose Luis
Luis

Yo para filtrar utilizo Table1.filter := 'Nombre = ''' + Edit1.text + ''''; pero el caso es que entonces solo em devuelve el registro que coincide extamente, es decir, solo me devuelve Luis, y yo querria que me devolviera los dos: Jose Luis y Luis.

Saludos, y mil gracias a todos

roman
12-05-2004, 23:53:37
Me parece que esto no lo vas a poder hacer. Los filtros son muy limitados. Te convendría más usar un TQuery con una consulta del tipo:


select * from tabla
where nombre like :nombre


Y llenarías el parámetro con


Query.ParamByName('nombre').AsString := '%' + Edit.Text + '%';


// Saludos

RyAr
13-05-2004, 00:11:35
Buenas, lo rpimero gracias por responder.

He metido en el form un TQuery, y en dataset le he puesto el de la tabla, y en el clik del boton el codigo que me has dado, pero mi duda es donde meto la busqueda SQL??

Gracias

roman
13-05-2004, 02:56:48
Las componentes TQuery son para mandar consultas SQL a la base de datos. Te recomiendo que busques TQuery en la ayuda de Delphi para darte una idea de su funcionamiento.

// Saludos

RyAr
14-05-2004, 16:36:34
Buenas de nuevo, me he estado leyendo un manual del componente y me he hecho una idea de como funciona.

Lo que no he visto es la manera de ejecutar esa consulta, y luego volver a ver toda la tabla. Yo los datos de la tabla la veo sobre un DBGrid.

¿La consulta se ejecuta al pasarle el parametro del dato? ¿Como se "quita la consulta" a la tabla?.

Saludos, y gracias

__cadetill
14-05-2004, 16:44:38
podrías mirar de hacer algo así


begin
Query.Close;
Query.SQL.Clear;
Query.SQL.Add('select * from tabla');

if Trim(Edit1.Text) <> '' then
Query.SQL.Add('where nombre like ' + QuotedStr('%' + Trim(Edit1.Text) + '%') );

try
Query.Open;
except
on E: Exception do
Application.MessageBox(PChar('Error abriendo Query. Mensaje:'#13+E.Message),
'Atención', MB_APPLMODAL or MB_ICONWARNING or MB_OK);
end;


Espero te sirva

RyAr
15-05-2004, 13:52:17
Buenas, gracias por tu codigo me ha ayudado a aclararme como atacar la base de datos, pero el problema es que en el grid no me "filtra".

Yo teniendo ya todo hecho en Delphi añado un TQuery al form, y en Datasource le digo el Datasource1 que es el que esta linkado con Table1. Posteriormente le añado el codigo SQL al TQuery:

select * from agenda where Nombre like :nombre

Y posteriormente en un boton buscar añado este codigo en el evento onclick:

Query.Close;
Query.ParamByName('nombre').AsString := '%' + Edit1.Text + '%';
Query.Open;

Y luego en un boton de cerrar busqueda añado esto:

Query.Close;


Con esto deberia "filtrarme en el DBGrid", no??, tambien he probado en el codigo del final del boton de buscar añadir un DBGrid.refresh y tampoco. Me extraña porque el codigo no da error, simplemnte en el DBGrid se quedan lso mismos datos sin hacer nada.

Saludos, y gracias

__cadetill
15-05-2004, 15:37:40
No me ha terminado de quedar claro si tienes el Query unido al Grid mediante el DataSource o no.

Si no lo tienes unido, haz la unición, sino, no te servirá de nada lanzar la Query ;)

Si lo tienes unido.... realmente no te "filtra"? Debería hacerlo!! :confused: O el problema está en "quitar el filtro"?

RyAr
15-05-2004, 16:00:02
Buenas, tengo una tabla a la cual le digo donde esta la tabla, y el nombre de la tabla de paradox que es agenda.db, luego pongo un datasource al que le doy en dataset el nombre de la tabla. Luego en el TQuery en dataset le doy el datasouerce, y lo mismo en el DBGrid, ya que yo veo los datos en el grid, pero al buscar no "filtran".

He probado a poner una opcion del grid de filtered a tru, pero tampoco "filtra".

Otra prueba que he ehcho es en el TQyery hacer una consulta simple tipo select * from agenda where nombre = 'Pepe' y al ejecutar query.open tampoco se "filtraba" en el grid.

Estoy ya medio loco xDDDDDDDDD

Saludos

__cadetill
15-05-2004, 16:41:53
Creo que el problema que tienes es de enlace de componentes

Sería lo siguiente:

TDBGrid (datasource) -> TDataSource (dataset) -> TQuery

Lo que hay entre paréntesis es la propiedad que se ha de usar para enlazar con el siguiente componentes

El TQuery no ha de ir enlazado a ningún lado y, el TTable te sobraría

RyAr
15-05-2004, 16:59:04
Efectivamente era eso, muchas gracias por tu paciencia. Ahora para que em muestra la tabla antes de ejecutar la consulta lo unico que he de hacer es cam,biar el datasource a la tabla, y luego al query.

Saludos, y muchas gracias

RyAr
16-05-2004, 23:44:04
Buenas, he estado probando para cuando una consulta no devuelve filas, y he probado esta codigo:

If Query.RowsAffected = 0 then begin
ShowMessage ('No hay datos en la consulta.');
end;

El problema es que siempre me sale el mensaje hasta cuando hay resultados en la consulta, ¿no es asi?.

Saludos, y gracias

__cadetill
16-05-2004, 23:46:15
Prueba con Query.IsEmpty

RyAr
16-05-2004, 23:48:54
Gracias, funcionan las dos :D

Saludos

RyAr
17-05-2004, 23:04:00
Buenas, seguimos avanzando en el tema, y surgen nuevas dudas.

El problema esta ahora en que yo al prinicpio linko el datasource con la table, pero cuando hago la consulta linko el mismo datasource con la query, y em devuelve las filas en el dbgrid, del cual selecciono una fila, y tengo un boton de modificar registro, pero se me abre el nuevo formulario con los dbedit correctamente con los datos... pero al estar en la query no me deja modificar. ¿Como puedo modificar los datos de la tabla a través de la consulta?

Gracias y saludos

__cadetill
17-05-2004, 23:15:25
un par de cosas

1.- El TTable no lo necesitas para nada. Mírate el mensaje 6 de este hilo
2.- Para que una consulta la puedas modificar, has de poner la propiedad del TQuery RequestLive a true o bien usar el componente TUpdateSQL (creo recordar que se llama)

Espero te sirva

RyAr
18-05-2004, 00:27:55
Pero si que necesito la tabla para poder insertar registros y ver los datos en el grid, puesto que sino no sale nada en el grid, y no puedo insertar registros desde dbedit, no???

Una vez he activado esa propiedad, en un boton de guardar pongo este cogido query.updaterecord; y al volver a visualizar la tabla no se guardan los cambios.

Estoy liado con la tabla??

Saludos

roman
18-05-2004, 07:23:38
RyAr

De tus mensajes en este hilo queda claro que apenas empiezas con bases de datos y muy posiblemente con Dephi así que primero que nada te recomiendo te leas algún tutorial para conocer el modelo entidad-relación- fundamental para el entendimiento y diseño de bases de datos relacionales. Una búsqueda en Google te ayudaá en esto, como muestra te pongo este (http://www.programacion.com/bbdd/tutorial/entidadrelacion/). Después será bueno que entiendas lo básico del lenguaje SQL- imprescindible para obtener y modificar datos en las tablas de una base de datos. También encontrarás muchos tutoriales en línea como este (http://www.asptutor.com/sql/). Desde luego será muy importante que aprendas los rudimentos de la conexión a bases de datos con Delphi para lo cual dispones de la ayuda del mismo Delphi y los demos que incluye. El acceso a bases de datos se incluye en prácticamente cualquier libro básico de Delphi y puedes incluso bajar gratuitamente La Cara Oculta de Delphi 4 (http://www.marteens.com/CaraOculta.htm) que si bien fue escrito para la versión 4, te servirá perfectamente para empezar.

No se trata que profundices en cada uno de estos tópicos sino sólo que te des una buena idea de qué trata todo el asunto de manera que entiendas bien, por ejemplo, la diferencia entre usar un TTable y un TQuery para no andar "dando palos de ciego". Si bien la lectura de estos temas te puede llevar una semana, a la larga será más rápido que el método de "prueba y error" y te dará unos fundamentos mucho más sólidos para tu desarrollo.

-------------

Dicho lo anterior y para que no se diga que no contesto te comento que normalmente los datos que obtienes de una consulta SQL con un TQuery no son editables salvo que se den ciertas condiciones. En tu caso es muy posible que así sea para lo cual bastará que pongas la propiedad RequestLive del Query en true. Con esto te olvidas por completo de tu componente TTable- bórrala ya del formulario.

Ahora, si resultase que tu consulta SQL no es editable (aun con RequestLive) puedes optar, al menos, por dos caminos: uno es el usar una componente TUpdateSQL para proveer al motor de bases de datos de las consultas SQL necesarias para la edición, inserción y borrado de registros. Pero, claro, tendrás que entender un poco más de cómo funcionan las componentes de acceso a bases de datos y de SQL en general. También puedes olvidarte del Query y quedarte con tu TTable y utilizar el evento OnFilterRecord que te permite filtrados más complejos al permitirte decidir por cada registro si se muesra o no. Pero si bien te puede parecer lo más sencillo yo en lo personal usaría esto como último recurso ya que suele ser bastante más lento en rendimiento que otros métodos.

// Saludos

RyAr
19-05-2004, 18:13:41
Buenas, ya he estado mirando los manuales, y toda esta confusion se debe a un profesor que nos dio Delphi sin tener ni puta idea, así va la enseñanza...

Te comento que ya he logrado hacer lo que queria, solo hay un problema. Quiero actualizar un dato en todas las filas el cual introduzco por teclado, siendo este el codigo SQL:

UPDATE basedatos
SET Precio_unidad = :precio, Total = Superficie * Precio_unidad
WHERE Superficie IS NOT NULL

Y le paso el precio que introduzco en un edit:

Form3.Query1.Close;
Form3.Query1.ParamByName('precio').AsFloat := strtofloat(Edit1.Text);
Form3.Query1.Open;

Entonces al darle al boton de aceptar me salta este error "Error creating cursor handle", y entonces me voy a ver los registros, y da la casualidad que ha actualizado todos menos el primero, y que si cierro y vuelvo a entrar al programa estan todos actualizados, ¿que problema hay?.

Saludos, y gracias por tu apciencia

roman
19-05-2004, 18:17:53
Form3.Query1.Close;
Form3.Query1.ParamByName('precio').AsFloat := strtofloat(Edit1.Text);
Form3.Query1.Open;




Usa ExecSQL en lugar de Open. Open es para consultas tipo SELECT que te devuelven registros y ExecSQL es para consultas que actualizan, insertan o borran registros.

// Saludos