Access - Informe con campo calculado

 
Vista:

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 11:16:22
Hola,
Necesitaría ayuda para hacer un informe de contribuciones de socios en una institución.
Simplificaré los datos para hacerlo más comprensible.
Cada socio realiza una aportación voluntaria cuya cantidad puede variar a lo largo del tiempo. Para guardar ese histórico de aportaciones tengo una tabla con la siguiente información:

Nombre de socio, Importe mensual de contribución, Fecha de Inicio del período contributivo, Fecha de Fin del período contributivo.

Cada Fecha de Inicio de un período es siempre el día 1 del mes indicado, y cada Fecha de Fin de período tiene como día el último del mes indicado. Si un período contributivo tiene Fecha de Inicio pero no fecha de fin quiere decir que sigue en vigor esa cantidad de aportación en el momento actual.

Por ejemplo, esta tabla podría tener como entradas:

Juan, 100, 01/11/2014, 30/04/2015
Juan, 150, 01/05/2015,
Elena, 50, 01/01/2015, 31/05/2015
Elena, 70, 01/06/2015, 30/06/2015
Elena, 120,01/07/2015,

Necesito hacer un informe en el que se refleje la cantidad anual total aportada por cada socio. En el ejemplo que he puesto arriba, para el año 2015, cada socio ha realizado estas aportaciones:

Juan; 4*100+8*150 = 1600
Elena: 50*5+70+6*120 = 1040.

No tengo ni idea de cómo calcular esos importes acumulados y no sé cómo determinar cuántos meses intersecan mi año de consulta para cada período contributivo guardado.

¿Alguien puede ayudarme, por favor?

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Informe con campo calculado

Publicado por Jesus (54 intervenciones) el 08/10/2016 15:55:20
Algo así como:

1
2
3
SELECT Socio, Sum([Cuota]*(DateDiff("m",[FechaInicio],Nz([FechaFin],[FechaFinCalculo]))+1)) AS Importe
FROM Mitabla
GROUP BY Socio;

Al ejecutarla te pedirá como parámetro la fecha final de calculo, en este caso veo que es 31/12/2015

El importe de Juan no coincide con el que tú dices:
"Juan; 4*100+8*150 = 1600"
debido a que de noviembre del 14 hasta abril del 15 van seis meses .. :-)

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 16:09:11
Muchas gracias Jesús.
No entiendo bien a qué te refieres con que el importe de Juan no coincide con el que digo. Puede ser que no me haya explicado bien, pero efectivamente entre noviembre de 2014 y abril de 2015 van seis meses, pero solo 4 de ellos pertenecen a 2015, por lo que hay que desechar los otros dos (SOLO me interesan las contribuciones del año 2015, no las anteriores).

Por esa razón creo que FechaInicio no va a funcionar como espero dentro de la función Nz.
Por ejemplo, para la línea 1 de Juan, habría que utilizar como FechaInicioCalculada el 01/01/2016,
pero para la línea 2 sirve la que hay en la tabla.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Informe con campo calculado

Publicado por Jesus (54 intervenciones) el 08/10/2016 16:45:40
No había 'cazado' que era el año...

La cosa sería:

1
2
3
SELECT Socio, Sum((DateDiff("m",IIf(DateSerial([AñoCalculo],1,1)>[FechaInicio],DateSerial([AñoCalculo],1,1),[FechaInicio]),IIf(Nz([FechaFin],DateSerial([AñoCalculo],12,31))>DateSerial([AñoCalculo],12,31),DateSerial([AñoCalculo],12,31),Nz([FechaFin],DateSerial([AñoCalculo],12,31))))+1)*[Cuota]) AS Importe
FROM MiTabla
GROUP BY Socio;


La verdad es que se 've' horrorosamente complicado ... más limpio sería crearse una función a medida para esto, pero no se que tal andas de VBA ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 16:56:32
Vaya, parece que nos cruzamos en las respuestas.
Si crees que es más limpio con VBA puedo hacerlo. Suelo programar en ese lenguaje, entre otros, pero no tengo experiencia en ligar esa función a un informe.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Informe con campo calculado

Publicado por Jesus (54 intervenciones) el 08/10/2016 17:42:49
Pues ahí va ...

Por un lado te creas en un módulo independiente la siguiente Función:

1
2
3
4
5
6
7
8
Function RT_Calculo(Cuota As Currency, FechaInicio As Date, FechaFinal As Variant, Año As Integer) As Currency
Dim F1 As Date, F2 As Date
    F1 = DateSerial(Año, 1, 1)
    F2 = DateSerial(Año, 12, 31)
    If FechaInicio > F1 Then F1 = FechaInicio
    If Nz(FechaFinal, F2) < F2 Then F2 = FechaFinal
    RT_Calculo = (DateDiff("m", F1, F2) + 1) * Cuota
End Function


Y una vez creada, ya puedes llamarla desde cualquier otro sitio:

1
2
3
SELECT Socio, Sum(RT_Calculo([Cuota],[FechaInicio],[FechaFin],[AñoCalculo])) AS Importe
FROM MiTabla
GROUP BY Socio;

El uso de funciones en casos como este nos facilita 'leer' lo que hace y sobre todo posibles modificaciones ... que modificar el 'zapato' de SQL anterior tiene mucha miga.



Para pasarle el parámetro bastaría con:

- Al abrir el informe pasas el año en el argumento OpenArgs:
1
DoCmd.OpenReport "MiInforme", , , , , Me.Año

y en el informe, en el evento abrir le asignas la 'consulta' :
1
2
3
4
Private Sub Report_Open(Cancel As Integer)
    Me.RecordSource = "SELECT Socio, Sum(RT_Calculo([Cuota],[FechaInicio],[FechaFin], " & Me.OpenArgs & ")) AS Importe " & _
                      "FROM MiTabla GROUP BY Socio"
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 17:47:55
Entiendo. Mucho más legible así, sin duda.

Pero si pongo esta consulta como origen del registro en mi informe, ¿cómo le paso el valor del parámetro Año con VBA?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 18:07:01
Entiendo. Se la asigno dinámicamente en lugar de mediante el interface.
Pues todo aclarado.
Muchísimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 16:47:26
Hola de nuevo, Jesús.
Creo que todo funciona bien si sustituyo Fecha_Inicio por el máximo entre el valor de Fecha_Inicio y #01/01/2015# (año 2015 en mi ejemplo)
O sea, tendría que sustituir Fecha_Inicio en la expresión que me has dado por algo así:

IIf(Fecha_Inicio <= #01/01/2015#, #01/01/2015#,Fecha_Inicio)

De esta forma sólo utiliza los meses correspondientes al año 2015 que hay en cada período contributivo.
¿Quizás hay otra función que calcule de forma automática el máximo entre dos valores fecha que yo no conozco?

Muchísimas gracias. Me has ayudado mucho.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Informe con campo calculado

Publicado por Ana (11 intervenciones) el 08/10/2016 17:30:34
Hola Jesús,
No sé si me puedes ayudar a terminar con esto.

La consulta que está asociada al informe (la que me has puesto antes) tiene como parámetro AñoCalculado.
¿Es posible modificar esta consulta mediante código VBA para que no solicite este parámetro? El usuario ya habrá determinado previamente el año del que quiere el informe (junto con otros criterios) en un cuadro de diálogo.

O sea querría que al pulsar un botón "Generar informe" en un cuadro de diálogo en el que el usuario ha seleccionado el año, se pasara este valor automáticamente a la consulta antes de abrir el informe.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Jesus
Val: 149
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

Informe con campo calculado

Publicado por Jesus (54 intervenciones) el 08/10/2016 17:45:18
Te contesto a continuación de mi anterior post, que si no el hilo queda con 'hipo'
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar