Pregunta

Estoy tratando de filtrar algunos registros de una TADOQuery. He establecido la propiedad filtrada en true y cuando me puse el filtro de campo = 'valor', todo funciona bien. Me gustaría construir dinámicamente este filtro añadiendo

<space>AND field='value'

a un valor siempre es cierto, y pensé 1 = 1 que hacer el truco. Así que tendría que 1 = 1 como el filtro predeterminado y luego simplemente añadir AND field='value' a ella como sea necesario.

Esto, sin embargo, no funciona. El mensaje de error dice lo siguiente:

  

argumentos son del tipo incorrecto, están fuera del intervalo aceptable, o están en conflicto entre sí.

Podría alguien por favor dígame ¿qué podía utilizar como un versátil siempre verdadera expresión de este filtro?

¿Fue útil?

Solución

supongo que no hace falta decir, pero depende del proveedor de OLE DB si es o no funciona. Cuando se establece un filtro en un conjunto de registros existentes, acaba de pasar por una interfaz diferente OLE DB (IViewFilter si no recuerdo mal). Así que incluso si un filtro funciona en una cláusula WHERE en una sentencia SQL, no necesariamente significa que funcionará como un filtro. El filtro que se establece termina siendo analizado aparte en las piezas componentes y después se pasa a la interfaz OLE DB. Puede ser que la aplicación del proveedor no está a la espera de un filtro de la forma "constante = constante". Como solución alternativa, es posible que intente configurar todo en la cláusula WHERE de la instrucción SQL.

Otros consejos

Hay que establecer la propiedad 'filtrada' False si no está filtrando algo, y configurarlo Verdadero y su condición cuando se desea el conjunto de resultados que se desea filtrar.

Me gustaría crear dinámicamente la propiedad SQL correcta, aunque por lo que siempre sabe exactamente lo que se envía a la base de datos (y que está seguro de que sólo aquellos registros que desea es recibido por su programa).

El truco 1 = 1 funciona bien en la cláusula where de una consulta, pero no en la propiedad filtrada. Si desea desactivar el filtro, conjunto filtrado a falso y se devolverán todos los registros.

El problema con el filtrado es que se realiza del lado del cliente. Si está utilizando un motor de base de datos como SQL Server y esperar a tener un gran conjunto de registros para filtrar, a continuación, su mejor servido por el cambio de la consulta SQL que permitirá el servidor de base de datos para devolver sólo los registros solicitados. Sólo recuerde cerrar su TADOQuery en primer lugar, cambiar el SQL a continuación, volver a abrir.

Un truco que utilizo para evitar volver todo el conjunto de datos (utilizado para grandes conjuntos de datos) es considerar un número máximo de registros que desea mostrar, a continuación, utilizar el TOP sintaxis SQL para devolver uno más que el número de registros que quería mostrar 'n' ... si llego a ese número, entonces yo notifique al usuario de que había más de n-1 registros devueltos y se ajustan a los criterios de búsqueda / filtro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top