Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Filtrar por contenido en Paradox (https://www.clubdelphi.com/foros/showthread.php?t=10203)

RyAr 12-05-2004 23:47:33

Filtrar por contenido en Paradox
 
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:

Código SQL [-]
select * from tabla
where nombre like :nombre

Y llenarías el parámetro con

Código Delphi [-]
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í

Código Delphi [-]
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:

Código SQL [-]
select * from agenda where Nombre like :nombre

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

Código Delphi [-]
Query.Close;
Query.ParamByName('nombre').AsString := '%' + Edit1.Text + '%';
Query.Open;

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

Código Delphi [-]
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:

Código Delphi [-]
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. 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. 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 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:

Código 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:

Código Delphi [-]
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

Cita:

Empezado por RyAr
Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 10:07:21.

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