Utilizar Silnm en Consulta de Access 2007

Quisiera saber quien me ayuda con lo siguiente,

Tengo una consulta que me gustaría filtrarla por fechas, una de inicio y una final, eso lo hago bien, pero el problema es que cuando dejo los campos de fechas vacíos en el formulario y abro la consulta me sale vacía la consulta y me gustaría que me saliera todo lo que tengo si dejo estos campos vacíos, y otra pregunta más.

- La base de datos que tengo tiene diferente columnas como fechas, productos, proveedores, etc, y me gustaría poder filtrar por cada una de estas columnas, digamos que quiero que en un formulario si pincho un nombre de proveedor me aparezca un informe con todos los productos que ingrese con ese proveedor y así consecutivamente con todos los otros campo, ahora recién lo hago pero tengo que hacer una consulta por cada campo que quiero filtrar, si alguien me ayuda a que con una sola consulta lograr esto.

1 respuesta

Respuesta
1

El siguiente ejemplo. En el se comprueba una fecha de un campo de un formulario, si existe se usa esa fecha y si no existe se usa usa fecha 'prehistórica' para que se seleccionen todos los registros existentes posteriores a esa fecha, es decir, todos los registros (que además cumplan el resto de condiciones que tengas en tu consulta).. En tu caso imagino que buscas registros entre dos fechas, por lo que usarías el ENTRE y con cada una de las fechas el mismo sistema con una fecha pasada o futura.

SELECT CITAS.Fecha_Cita, CITAS.Hora_Inicio, CITAS.Hora_Final, CITAS.Cliente
FROM CITAS
WHERE (((CITAS.Fecha_Cita)>IIf(IsNull([Formularios]![CITAS]![Fecha_Cita]),#1/1/1000#,[Formularios]![CITAS]![Fecha_Cita])));

Con respecto a tu segunda pregunta basta con que en la consulta uses en cada campo el filtro adecuado. Me explico. Tu ingresas en cada columna de la consulta que quieras usar como posible filtro un criterio de filtrado que use algo similar a lo anterior. Por ejemplo, si usas entre otros un filtro sobre un campo que contiene valores de texto, debes de definir el criterio de filtro para que lo use si hay algún valor y no lo use si no has escrito nada en ese filtro. Digo que no lo usa cuando realmente lo está usando, pero al cumplir todos los registros con esa condición el resultado es el mismo a no usar en ese momento ese filtro.

Volviendo al ejemplo anterior, te lo modifico de modo que además del filtrado por el campo CITAS_Fecha tenga en cuenta también si existe algún valor en el filtro aplicado al campo Cliente.

SELECT CITAS.Fecha_Cita, CITAS.Hora_Inicio, CITAS.Hora_Final, CITAS.Cliente

FROM CITAS

WHERE (((CITAS.Fecha_Cita)>IIf(IsNull([Formularios]![CITAS]![Fecha_Cita]),#1/1/1000#,[Formularios]![CITAS]![Fecha_Cita])) AND ((CITAS.Cliente) Like IIf(IsNull([Formularios]![CITAS]![Cliente]),"*",[Formularios]![CITAS]![Cliente])));

Como verás basta con usar la condición que comprueba si hay algo en el campo de filtrado ‘Cliente’, Si hay algo lo usa para el filtrado y si no usa el * para no restringir registros por este criterio,

En resumen, ambos campos se tienen en cuenta para el filtrado comprobando si no hay valores para aplicar lo que corresponda.

Una última consideración. SI no necesitas visualizar la consulta, ósea, si simplemente es el origen de datos de un informe o similar, es más versátil construirla y usarla en código, aunque el resultado final de registros obtenidos sea en ambos casos el mismo.

Cordiales saludos.

¡Gracias! Así fue como quedó(Claro que no me refiero en SQL que soy bastante malo)

>SiInm(EsNulo([Formularios]![MODAL]![Texto2]);#01/01/1000#;[Formularios]![Modal]![texto2]) Y >SiInm(EsNulo([Formularios]![MODAL]![Texto4]);#01/01/1000#;[Formularios]![Modal]![Texto4])

Lo que si no pude conseguir es que si inserto en la fecha inicial solamenteme tome los datos de esa fecha en adelante y si inserto solamente en la fecha final me tome de esa fecha hacia detrás, de todas formas muchas gracias

Lo que pides complica un poco la escritura de la SQL pero en concepto es sencillo. Basta con anidar varios SiInm. Me explico. Haces un primer SiInm y en la condición compruebas que ambos campos tengan algun valor. Indicas que hacer si se cumple, y en la parte de que hacer si no se cumple usas un segundo SiInm. En este compruebas por ejemplo que Texto2 tenga algún valor. Si es cierto, ya puedes definir el criterio para cuando Texto2 tenga valor pero no lo tenga Texto4 (ya que si lo tuviera se habría cumplida la primera de las condiciones). En la parte de que hacer si no se cumple colocas un nuevo SiInm. En éste la condición es que haya algún valor en Texto4. Si se cumple defines el filtro y en la parte de quehacer si no se cumple pones el filtro adecuado para taerse todos los registros, ya que estamos en el caso de que no hay ninguna fecha inscrita y podrías usar las fechas ficticias prehistórica y futura que desees. Ten cuidado con el cierre de todos los paréntesis que vas a tener que escribir. Te aconsejo que uses el generador de criterios en la consulta, ya que él te controlará al menos este tipo de cosas y evitará errores.

Cordiales saludos.

¡Gracias! Todo bien hasta ahora si pudieras ayudarme en lo ultimo se lo agradecería, tengo un formulario con un cuadro combinado y tengo dentro de este formularion un subformulario de una consulta, en esta consulta tengo como criterio en el Campo Producto que es igual al campo combinado del formulario, este cuadro combinado solo contiene valores de productos de una tabla, me sale todo bien según elija el Producto, lo que no logro hacer es que me salgan todos los registros de todos los productos cuando el cuadro combinado esté vacío, he probado con esNulo, y he visto por Internet pero nada me ha ayudado, gracias por todo hasta ahora, EXcelentes respuestas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas