Ir al contenido


Foto

Query Filter


  • Por favor identifícate para responder
12 respuestas en este tema

#1 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 01 marzo 2012 - 09:31

estoy tratando de hacer un filtro en una consulta asi:


delphi
  1.     with qryConsulta do
  2.     begin
  3.       Filter := 'Saldo > 0';
  4.       Filtered := True;
  5.       Active := False;
  6.       SQL.Clear;
  7.       SQL.Add('select CLV_CLIE,NOMBRE,SALDO');
  8.       SQL.Add('FROM CLIENT');
  9.       Active := True;
  10.     end;


pero no me sale, el filtro de deberia dejar solamente los clientes que tengas saldo > 0
¿alguien me hecha una manita?  :)
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 01 marzo 2012 - 09:35

Dos cosas:

Primero, intenta así:



delphi
  1. with qryConsulta do
  2.     begin
  3.       Filter := 'Saldo > 0';
  4.       Active := False;
  5.       SQL.Clear;
  6.       SQL.Add('select CLV_CLIE,NOMBRE,SALDO');
  7.       SQL.Add('FROM CLIENT');
  8.       Active := True;
  9.       Filtered := True;  // cambiamos esta línea
  10.     end;



Y dos, porqué no integras la condición al where de la consulta ???  ^o|

Saludox ! :)
  • 0

#3 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 01 marzo 2012 - 09:36

Saludos.

Si estas "armando" el SELECT ¿porque filtrarlo?; simplemente pon esa condición dentro de tu sentencia.
  • 0

#4 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 01 marzo 2012 - 09:38

Dos cosas:

Primero, intenta así:



delphi
  1. with qryConsulta do
  2.     begin
  3.       Filter := 'Saldo > 0';
  4.       Active := False;
  5.       SQL.Clear;
  6.       SQL.Add('select CLV_CLIE,NOMBRE,SALDO');
  7.       SQL.Add('FROM CLIENT');
  8.       Active := True;
  9.       Filtered := True;  // cambiamos esta línea
  10.     end;



Y dos, porqué no integras la condición al where de la consulta ???  ^o|

Saludox ! :)


gracias , voy a probar a ver que pasa :)
  • 0

#5 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 01 marzo 2012 - 09:39

Saludos.

Si estas "armando" el SELECT ¿porque filtrarlo?; simplemente pon esa condición dentro de tu sentencia.


no es asi de facil , la consulta es mas compleja de la que aqui se ve, simplemente la puse asi de simple como ejemplo de lo que quiero hacer :)
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 01 marzo 2012 - 09:45


Saludos.

Si estas "armando" el SELECT ¿porque filtrarlo?; simplemente pon esa condición dentro de tu sentencia.


no es asi de facil , la consulta es mas compleja de la que aqui se ve, simplemente la puse asi de simple como ejemplo de lo que quiero hacer :)


Bien amigo, de todos modos, no es una mala idea el integrar el where a la consulta, por más compleja que sea y ya sea que la armes o la tengas pre-diseñada en un DataSet, siempre puedes hacerle modificaciones directamente en la propiedad SQL para generarle condiciones que pueden variar a lo mejor con ciertos parámetros de tu programa.

Saludox ! :)
  • 0

#7 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 01 marzo 2012 - 09:51



Saludos.

Si estas "armando" el SELECT ¿porque filtrarlo?; simplemente pon esa condición dentro de tu sentencia.


no es asi de facil , la consulta es mas compleja de la que aqui se ve, simplemente la puse asi de simple como ejemplo de lo que quiero hacer :)


Bien amigo, de todos modos, no es una mala idea el integrar el where a la consulta, por más compleja que sea y ya sea que la armes o la tengas pre-diseñada en un DataSet, siempre puedes hacerle modificaciones directamente en la propiedad SQL para generarle condiciones que pueden variar a lo mejor con ciertos parámetros de tu programa.

Saludox ! :)


la columna saldo es el resultado de una operacion , por lo que no puedo incluirla en una sentencia where sinembargo lo que puedo hacer es un case basado en el resultado de la operacion en saldo, lo que me duplicario el codigo al devolver el saldo, aunque ahora que lo pienso esto se podria solucionar utilizando un sp para devolver el sado.... bueno da igual, me tiene intrigado esto de los filtros que nunca me funcionan :p

  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 01 marzo 2012 - 10:06

Buenas,

Si es el resultado de una operación (sum, count,...) entonces tendrás un group by. Dado que tienes el group by, puedes ponerle un having

select dato1, dato2, sum(saldo) 
from tabla
group by dato1, dato2
having sum(saldo) > 0


Si fuera una operación matemática, no tendrías que tener problema en ponerla en el where

Espero te sirva

Nos leemos

  • 0

#9 look

look

    Advanced Member

  • Miembros
  • PipPipPip
  • 418 mensajes
  • LocationLa Ceiba-Atlantida-Honduras

Escrito 01 marzo 2012 - 10:33

hola, al final de decidi por un procedimiento almacenado , me ha salido mas facil de esta manera

Saludos

pd: sigo sin saber como funcionan los filtros y porque este no funciona :s
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 marzo 2012 - 01:13

Hola,

Hay algunas cosas a puntualizar sobre el tema de los filtros:

1) Los filtros sólo aplican al conjuntos de datos activos que regrese el DataSet.
2) Los filtros están implementados de forma interna, dentro de los componentes de acceso a los datos, por lo que su funcionamiento es limitado (incluso no reconoce demasiadas instrucciones SQL) y no tiene el mismo poder que el de un motor de base de datos.
3) De (1) y (2) podemos apreciar entonces que el efecto del filtro es local, para trabajar justo con el conjunto de datos visualizados en ese momento. En el momento en que se desactiva el filtro se vuelve a mostrar todo el conjunto entero original. Y para que funcione debemos asegurarnos de que las instrucciones que forman el filtro pueda ser válida. No reconoce instrucciones propias de un motor. Por ejemplo, algo como el Coalesce() o un SubString(), etc.

Si dices que no te está funcionando el filtro hace falta entonces ver exactamente la consulta original, el filtro que intentas establecer y el motor que utilizas.

Saludos,
  • 0

#11 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 566 mensajes
  • LocationEspaña

Escrito 02 marzo 2012 - 10:09

Hay algunas cosas a puntualizar sobre el tema de los filtros:

1) Los filtros sólo aplican al conjuntos de datos activos que regrese el DataSet.
2) Los filtros están implementados de forma interna, dentro de los componentes de acceso a los datos, por lo que su funcionamiento es limitado (incluso no reconoce demasiadas instrucciones SQL) y no tiene el mismo poder que el de un motor de base de datos.
3) De (1) y (2) podemos apreciar entonces que el efecto del filtro es local, para trabajar justo con el conjunto de datos visualizados en ese momento.


Totalmente de acuerdo con el maestro Delphius. Debes tener en cuenta que puedes cargar un clientDataset con el resultado de una consulta y luego aplicar los filtros que creas necesarios al resultado obtenido.

Yo lo suelo usar en relaciones maestro-detalle en las que es muy costoso traer datos detalle cada vez que te mueves por una rejilla maestra. Me traigo todos los registros detalles, y luego al cambiar el maestro, simplemente aplico el filtro. Muy rápido y no se sobrecarga la red.

Saludos
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 02 marzo 2012 - 10:11

Hola,

Hay algunas cosas a puntualizar sobre el tema de los filtros:

1) Los filtros sólo aplican al conjuntos de datos activos que regrese el DataSet.
2) Los filtros están implementados de forma interna, dentro de los componentes de acceso a los datos, por lo que su funcionamiento es limitado (incluso no reconoce demasiadas instrucciones SQL) y no tiene el mismo poder que el de un motor de base de datos.
3) De (1) y (2) podemos apreciar entonces que el efecto del filtro es local, para trabajar justo con el conjunto de datos visualizados en ese momento. En el momento en que se desactiva el filtro se vuelve a mostrar todo el conjunto entero original. Y para que funcione debemos asegurarnos de que las instrucciones que forman el filtro pueda ser válida. No reconoce instrucciones propias de un motor. Por ejemplo, algo como el Coalesce() o un SubString(), etc.

Si dices que no te está funcionando el filtro hace falta entonces ver exactamente la consulta original, el filtro que intentas establecer y el motor que utilizas.

Saludos,


Tonses la manera en que yo lo propuse debería de funcionar no ???  ^o|

Saludox ! :)
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 marzo 2012 - 12:00


Tonses la manera en que yo lo propuse debería de funcionar no ???  ^o|

Saludox ! :)

Pues si, debería. Aunque quizá, sólo por precaución, yo armaría el select y luego armaría el filtro. Por ejemplo:



delphi
  1. Query1.Sql := '...';
  2. Query1.Open;
  3. Query1.Filter := '...';
  4. Query1.Filtered := true;



Aunque no debería haber problema en armar el filtro antes y luego la consulta (obviamente, previamente ha de estar filtered en false).

El problema vaya a saber donde está realmente; look nos comentaba que la consulta era mucho más compleja que la del ejemplo. Quizá el problema esté allí y/o en la condición del filtrado que ha utilizado.

De todas formas me sumo a que en lo posibles mejor filtrar desde la propia consulta empleando la cláusula WHERE que para eso es que está. Ahora bien, si lo que desea es obtener un filtro local, sea o no que los datos hayan sido pasados por un filtro previo (la consulta), no hay demasiadas opciones y una de ellas es utilizar filter.

Saludos,
  • 0




IP.Board spam blocked by CleanTalk.