VBA Access: Consultar entre fechas

Necesito hacer lo siguiente: Al abrir un formulario, necesito que automáticamente los campos DESDE y HASTA adopten la fecha más antigua y la más reciente del campo FNAC de la tabla AUTOR. A su vez, si la tabla está vacía, que coloque fechas arbitrarias (por ejemplo, desde el 1º de enero del año actual al día de hoy), aunque esto último es lo de menos. También, que se puedan mostrar registros con la FNAC vacío mediante algo (casilla de verificación, por ejemplo).
Luego, mediante un botón necesito usar las fechas ingresadas (que también se ingresarán manualmente), necesito que se muestren en un subformulario llamado Sub_T_Con_Autor los datos que estén dentro de ese rango de fechas. Gracias a la ayuda de otro experto, oportunamente logré hacer un filtro similar que me permite hacerlo pero las fechas iniciales son otras (pues depende de otros intereses) y los resultados se abren en una ventana emergente. Necesito que se muestren en el subformulario dentro del formulario principal.
Lo de más urgencia es obtener las fechas iniciales.
Intenté hacerlo con:

FA = DLast("[FNAC]", "[AUTOR]")
FR = DFirst("[FNAC]", "[AUTOR]")

Pero me devuelve error Null (94).
Entiendo que es mucho pero son cosas que he estado postergando y en otros formularios me ayudarán de sobremanera simplemente adaptando el código a la necesidad.

1 Respuesta

Respuesta
2

Para las fechas usa este código, en el evento al cargar del formulario:

Private Sub Form_Load()
Me.txtFIni = Nz(DMin("FNAC", "AUTORES"), CDate("01/01/" & Year(Date)))
Me.txtFFin = Nz(DMax("FNAC", "AUTORES"), Date)
End Sub

Te las pondrá en los cuadros de texto txtFIni y txtFFin (cambialo en el código si no son tus nombres)

Una vez con eso, filtrar un subformulario es igual que filtrar un formulario, has de usar las mismas propiedades (filter, filterOn), pero has de hacer referencia a que es un formulario, Así, en vez de :

Forms("nombreForm").Filter=...

has de usar:

Fomrs("NombreForm").NombreSubform.Form.Filter=...

Agradecido por la pronta respuesta.
El código quedó (sólo cone ste mostró resultados):

Forms("Con_Autor_FNac").Sub_T_Con_Autor_Fecha.Form.Filter = True

Pero pese a consultar, por ejemplo, los últimos 30 años, me sigue mostrando la totalidad de los registros. No sé si será porque en el código no incluyo los criterios o bien porque en el subformulario establecí la propiedad Filtro con estos valores.

[FNAC] Between Forms![Con_Autor_FNac].Form.txtFiltro1 And Forms![Con_Autor_FNac].Form.txtFiltro2

Por último, ¿cómo podré asignar a una casilla de verificación para que me muestre solamente los registros cuya FNAC es nula?

Estuve respondiendo durante más de 5 minutos redactando para que no se publique. Es una pena que funcione tan mal TE.
Veré como resumir:
El código quedó así:

Forms("Con_Autor_FNac").Sub_T_Con_Autor_Fecha.Form.Filter = True

Pero pese a consultar los últimos 30 años me sigue mostrando la totalidad de los registros. Quizá no establecí los criterios en el código (¿cómo se haría?) o porque en el subformulario establecí la propiedad 'Filtro' con el valor:

[FNAC] Between Forms![Con_Autor_FNac].Form.txtFiltro1 And Forms![Con_Autor_FNac].Form.txtFiltro2

Otro detalle que necesitaría es asignar en una casilla de verificación la capacidad de mostrar los registros con FNAC de valor Nulo.

Estuve respondiendo durante más de 5 minutos redactando para que no se publique. Es una pena que funcione tan mal TE.
Veré como resumir:
El código quedó así:

Forms("Con_Autor_FNac").Sub_T_Con_Autor_Fecha.Form.Filter = True

Pero pese a consultar los últimos 30 años me sigue mostrando la totalidad de los registros. Quizá no establecí los criterios en el código (¿cómo se haría?) o porque en el subformulario establecí la propiedad 'Filtro' con el valor:

[FNAC] Between Forms![Con_Autor_FNac].Form.txtFiltro1 And Forms![Con_Autor_FNac].Form.txtFiltro2

Otro detalle que necesitaría es asignar en una casilla de verificación la capacidad de mostrar los registros con FNAC de valor Nulo.

Estuve respondiendo durante más de 5 minutos redactando para que no se publique. Es una pena que funcione tan mal TE.
Veré como resumir:
El código quedó así:

Forms("Con_Autor_FNac").Sub_T_Con_Autor_Fecha.Form.Filter = True

Pero pese a consultar los últimos 30 años me sigue mostrando la totalidad de los registros. Quizá no establecí los criterios en el código (¿cómo se haría?) o porque en el subformulario establecí la propiedad 'Filtro' con el valor:

[FNAC] Between Forms![Con_Autor_FNac].Form.txtFiltro1 And Forms![Con_Autor_FNac].Form.txtFiltro2

Otro detalle que necesitaría es asignar en una casilla de verificación la capacidad de mostrar los registros con FNAC de valor Nulo.

Sí se publican las respuestas, pero tarda un rato (ya llevan así varios días, a ver si lo arreglan de una vez...)

El filtro no te está funcionando porque a la propiedad Filter le tienes que poner el valor del filtro, en tu caso el

[FNAC] Between Forms![Con_Autor_FNac].txtFiltro1 And Forms![Con_Autor_FNac]txtFiltro2

y luego a la propiedad FilterOn es a la que le das el valor True para que aplique el filtro.

Para filtrar por fechas vacías:

1º/ Añades una casilla verificación (chkFVacia, por ejemplo)

2º/ Suponiendo que si la marcas solo quieres ver los que tengas FNAC en blanco, en el código que ejecutas el filtro, pones:

If Me.chkVacia = True Then
    Me.Filter = "FNac Is Null"
    Me.FilterOn = True
Else
...

y donde pongo los ... pones el código que tienes para filtrar entre fechas

Estimado, me ha llegado la notificación de la respuesta pero ésta no sale publicada.

No te queda más remedio que esperar. Por lo que tengo comprobado estos días, tarda entre 40 y 50 minutos en mostrarse en la web... Paciencia!

Estoy probando lo que me has enviado y me da "Se esperaba fin de la instrucción" en la línea

Me.Sub_T_Con_Autor_Fecha.Filter = "FNac Is Null"

Por ello lo cambié a:

Me.Sub_T_Con_Autor_Fecha.Filter = "FNac Is Null"

Quité las comillas, pero me da todo tipo de errores que llevaría tiempo mostrar cuales en qué caso.

Por otro lado:

porque a la propiedad Filter le tienes que poner el valor del filtro

Desconozco como hacerlo. Lo que intenté me marca en rojo la línea y me devuelve error 3075 "Falta operador" en la sintaxis.

Comprobado que funciona: http://www.filebig.net/files/5gnKQKCX2M 

La pregunta sobre Filter, tiene una respuesta muy sencilla (lo sabrías si consultaras la ayuda para esa propiedad) y cito:

Puede usar la propiedad Filter para especificar un subconjunto de registros que se mostrarán al aplicar un filtro a un formulario, informe, consulta o tabla. String de lectura y escritura.

Por tanto, es la misma propiedad que la de las propiedades del formulario "Filtro", y ahí no pones True, si no un campo y un valor para filtrar, ¿verdad?

FilterOn es para aplicar el Filtro, y ahí le dices True (aplica el filtro) o False (no lo apliques y muestra todo)

Parece que sólo aparecen las respuestas ante un comentario del creador de la pregunta. No hace falta que respondas a esto. Comentaré nuevamente en caso que tenga algo más para decir o bien agradecerte.

¡HA FUNCIONADO DE MARAVILLAS!
Y lo que más me enoja es que sí, ya me lo habías mencionado y siempre lo olvido. Hasta tengo el marcador en el navegador con la web que me pasaste. Te pido perdón por volver a preguntar lo mismo una vez más, pero de todos modos ha sido una ayuda inestimable. MUCHÍSIMAS GRACIAS.

No hay de qué.

Ahora solo falta que valores la respuesta, si no lo has hecho ya, je je

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas