Consulta en Access 2003 que devuelva fechas de los últimos 6 meses

Necesito crear una consulta en Access 2003 donde se filtren aquellos registros que contengan en el campo "fecha" al menos una fecha de cada mes dentro de los 6 meses anteriores a la fecha de la consulta. Es decir, usuarios que hayan tenido actividad al menos una vez al mes dentro de los 6 meses anteriores a la fecha de la consulta.

1 Respuesta

Respuesta
1

Yo lo haría así:

En tu consulta añades un nuevo campo:

Diferencia:  DifFecha("m";Fecha();[Fecha])

Y en ese campo le pones como criterio: >=-6

Si no quieres que te aparezca en la consulta, le desmarcas la casilla Mostrar.

Este nuevo campo te devolverá la diferencia en meses entre la fecha actual (Fecha()) y tu campo fecha ([Fecha]). Como criterio le pones que te muestre los que tienen una diferencia mayor o igual a -6.

Otra alternativa sería invertir el orden de las fechas en la función (DifFecha("m";[Fecha];Fecha()) y el del criterio (<=6)

Gracias de nuevo por tu tiempo Sveinbjor. Verás, tal y como planteas la consulta (en tu primera respuesta) funciona pero a medias. Me explico: en efecto devuelve los registros que tienen alguna fecha (movimiento) de entre los 6 meses anteriores a la consulta, pero lo que necesito es que filtre solo los que han tenido al menos un movimiento en todos y cada uno de los 6 meses anteriores a la fecha de la consulta. 

Prueba de esta forma:

Añades 6 campos nuevos:

Dif6: DifFecha("m";Fecha();[Fecha])

y Criterio =-6

Dif5: DifFecha("m";Fecha();[Fecha])

y Criterio =-5

Y así...
Si necesitas los del mes actual, añade un nuevo campo Dif0 con el criterio =0

Umm, no, así no te va a salir. Déjame darle una vuelta y te digo algo más...

No, así no funciona puesto que le estamos pidiendo a un registro que cumpla varias condiciones distintas a la vez. Es decir que tenga fecha de este mes y del pasado y del anterior...etc. Lógicamente devuelve 0 registros que cumplan todas estas condiciones juntas.

No obstante, me estoy dando cuenta que lo que necesito en esta consulta es que un determinado registro se muestre o no, dependiendo de que otro distinto cumpla también determinada condición. Es decir, que devuelva el registro con fecha de este mes pero sólo si existe otro registro, del mismo usuario, con fecha del mes pasado y del anterior... Y, me temo que esto no será posible. Así pues creo que la mejor solución posible es la que expones un tu primera respuesta. Muchas gracias.

No obstante, si se te ocurre algo más, soy todo oídos.

Se me ocurrió esto, a ver si te sirve:

Creas una consulta "auxiliar", con el campo "Usuario" (o el que tengas que te interesa mostrar), el campo fecha y la diferencia (Dif6: DifFecha("m";[Fecha];Fecha()) y el del criterio (=-6). La guardas como Aux6. Te devolverá los usuarios con movimientos hace 6 meses exclusivamente

Haces lo mismo para 5 meses, 4... modificando los nombres de los campos y los criterios. Vas guardando las consultas como Aux 5, Aux 4...

Luego creas una nueva consulta, añades todas las consultas auxiliares, las relacionas entre sí por el campo usuario, que será el unico que seleccionas para mostrar. Además, has de hacerla una consulta de totales, para que no te muestre los registros repetidos

Te dejo un ejemplo con una tabla de facturas, para saber que empresas facturaron en los últimos 6 meses (y en cada mes). En este ejemplo no muestro las que facturan en el mes actual, para eso habría que añadir una nueva consulta Aux0 con criterio =0

El inconveniente es que sólo puedes mostrar los campos que son idénticos en cada cosnulta (en el ejemplo el nombre de la empresa). Si añadiese el importe de la factura, ya no sale (se repetirían los registros de cada tabla tantas veces como haya en cada una de las otras... una locura.)

En fin, que a ver si te sirve, porque no le veo otra forma.

Se me acaba de ocurrir una idea mejor. Te actualizo el ejemplo y te explico:

1º/ Para que funcione, tu BD ha de tenes una estructura similar a esta: una tabla Usuarios y otra tabla Movimientos, relacionadas entre sí.

2º/ En un módulo nuevo copias la función que te paso en el ejemplo:

Public Function Activo(elUsuario As Integer) As Boolean
    Dim i As Integer
    Dim cuenta As Integer
    cuenta = 0
    'Suponemos que por defecto no está activo en los 6 meses anteriores
    Activo = False
    'Creamos un bucle para comprobar si está activo en cada uno de los 6 meses anteriores (incluido el actual)
    For i = 0 To 6
        cuenta = DCount("*", "TMovimientos", "Usuario=" & elUsuario & " AND Datediff('m',[Fecha],Date())=" & i)
        If cuenta = 0 Then Exit Function 'Si cuenta =0 es que no hay registros en el mes => no está activo
    Next i
    'Si llegamos aquí es porque se encontraron registros para cada uno de los 6 meses anteriores
    'Le damos a la función el valor verdadero
    Activo = True
End Function

Si el campo Usuario (el campo por el que se relacionan ambas tablas) fuera de tipo texto, la función sería esta otra:

Public Function Activo(elUsuario As String) As Boolean
    Dim i As Integer
    Dim cuenta As Integer
    cuenta = 0
    'Suponemos que por defecto no está activo en los 6 meses anteriores
    Activo = False
    'Creamos un bucle para comprobar si está activo en cada uno de los 6 meses anteriores (incluido el actual)
    For i = 0 To 6
        cuenta = DCount("*", "TMovimientos", "Usuario='" & elUsuario & "' AND Datediff('m',[Fecha],Date())=" & i)
        If cuenta = 0 Then Exit Function 'Si cuenta =0 es que no hay registros en el mes => no está activo
    Next i
    'Si llegamos aquí es porque se encontraron registros para cada uno de los 6 meses anteriores
    'Le damos a la función el valor verdadero
    Activo = True
End Function

3º/ Creas una consulta sobre la tabla usuarios (CActivos en el ejemplo) Esta Consulta te devolverá todos los registros de la tabla TUsuarios que cumplen la condición de partida (al menos un registro por cada mes hasta el sexto anterior a la fecha actual)

4º/ Creas una consulta sobre la tabla movimientos (CMov6Meses en el ejemplo), según lo comentado en las respuestas anteriores, para obtener TODOS los movimientos de los 6 meses anteriores.

5º/ Si fuera necesario, puedes crear una consulta sobre las dos anteriores (CMov6MesesActivos) para mostrar sólo los movimientos de los usuarios activos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas