Campos "Sumatorios acumulados" por mes y año en formulario

Necesitaría que en mi formulario apareciesen 2 sumatorios referidos a las cantidades acumuladas cada mes y anualmente de un consumo que se introduciría diariamente.

Es decir, tengo un formulario con un campo clave "Fecha" y entre otros campos uno referido al "Consumo diario". La cuestión es que el consumo anual lo logro con la opción Suma([Consumo diario]), pero no sé como lograr diferenciar el consumo referido a cada mes. Y tanto un dato como el otro sería necesario que estuviesen actualizados al abrir el formulario cada día.

Creo que se podría intentar por medio de una consulta pero no doy con la clave.

3 Respuestas

Respuesta
1

Se me ocurren diversas soluciones:

1º/ Por medio de consultas: Creas una consulta de totales que te agrupe los datos por mes (con Mes([Fecha])), consulta que puedes hacer para que te devuelva los datos del mes actual, y en ella calculas el sumatorio del campo.

Luego, en tu formulario, con la función DBúsq() como origen del cuadro de texto, coges el dato del mes que necesites.

2º/ Por código: Con la función DSum() calculas la suma del campo para el mes que necesitas, y lo pasas al cuadro de texto. El código lo pondrías en el evento "Al cargar" o "Al activar registro" del formulario.

Lo mismo haría para los años.

Un saludo.


Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/ 

Gracias de antemano por tu tiempo. Voy a intentar detallar más exactamente lo que necesitaría, para comprobar si tu respuesta va por ese camino.

Imagina un formulario donde se va a introducir un valor numérico referido al consumo diario. Busco que al abrir cada día el nuevo formulario (se realiza una única entrada de consumo por día y el campo clave de la tabla y por tanto del formulario es la fecha), aparezca el valor acumulado tanto de ese mes como del año.

No es necesario ni que ese valor se guarde en la tabla, simplemente que aparezca y se actualice al guardar el formulario y haber metido el dato nuevo diario.

Evidentemente necesitaría que el acumulado del mes se fuese a 0 al comenzar cada nuevo mes.

Espero que puedas ayudarme. Gracias y un saludo.

Te adjunto un ejemplo con 3 formas de hacerlo:

1º/ Con consultas sin código (formulario GastosConsultas)

2º/ Con consultas y con código (formulario GastosCodigoConsultas)

3º/ Con código sin consultas (formulario GastosCodigoSinConsultas)

http://www.filebig.net/files/vd2VXUamyn 

Buenas tardes,

He descargado tu base de datos de ejemplo y sería exactamente lo que estaba buscando. Mi intención, si puede evitarlo, es hacerlo sin código pero precisamente esa opción de formulario "GastosConsultas" al abrirlo me da un error de visual basic...¿sabes por qué?

Gracias por la ayuda, creo que si depuramos ese error sería la opción que tomaría.

Un saludo cordial.

Nada más fácil: cuando te salga el error, pulsas "depurar" y en el editor de VBA borras el código para ese formulario (en la ventana que te sale, desde el Private Sub.. hasta End Sub)

Se me quedó ese código al duplicar el formulario...

Buenas tardes,

He eliminado el código y los formularios con códigos, quedándome únicamente con la tabla, las 2 consultas y el formulario GastosConsultas...ahora ha desaparecido el error de visual basic pero al abrir el formulario en los dos campos acumulados me aparece #¿Nombre?

¿Podrías, si no es mucha molestia, mandarme el ejemplo únicamente con las consultas y totalmente operativo? Te lo agradecería enormemente.

Un cordial saludo.

Muchas gracias...me has solucionado el problema. He tomado los pasos de tu base de datos y se lo he acoplado a la mía y ésta ha funcionado correctamente con los nuevos campos de acumulados por mes y año.

Una última cosita es que, al abrir el formulario con una nueva fecha, efectivamente me aparecen actualizados los acumulados por mes y año, pero al introducir la nueva cantidad en el campo "Consumo", ésta no actualiza los campos acumulados al instante, ni siquiera al guardar el formulario. Tengo que cerrarlo, y al abrirlo de nuevo si ya aparece actualizado.

¿Tiene fácil solución? Sino me quedo como esta que cumple con lo que pedía.

Un saludo y nuevamente gracias.

Sí, tiene fácil solución, pero has de añadir algo (una línea) de código.

En el Evento "Después de actualizar" de tu campo Consumo le generas este código:

Private Sub Consumo_AfterUpdate()

Me.Recalc

End Sub

Si no te funciona Me. Recalc, prueba con Me. Refresh, o Me. Requery

¡Gracias! Ahora si quedó perfecto. Me has solucionado un gran problema y quedo totalmente satisfecho con la ayuda que me has proporcionado...espero poder contar contigo para cualquier duda futura.

Un cordial saludo.

Respuesta
1

Aparte de lo que te comenta Sveinbjorn, que es correcto, si quieres mira éste ejemplo que preparé de Consulta de Referencias Cruzadas.

http://www.mediafire.com/download/gjg9euk8odytbpx/RefCruzadasMesesA%C3%B1os.rar 

Mis saludos >> Jacinto

¡Gracias por tu tiempo Jacinto! Acabo de descargar el documento del link y aunque no es exactamente lo que busco, creo que me puede servir para nuevos proyectos.

Un saludo cordial.

Respuesta
1

Todo depende de DESDE DONDE lo quieras ver. Me explico, si en el formulario tienes un combinado llamado por ejemplo PorMes, con los números de los meses y un cuadro de texto ConsumoMensual, en las propiedades del combinado-Eventos-Después de actualizar

Consumomensual = DSum("[consumo diario]", "cliente", "month([fecha])='" & [PorMes] & "'")

Lo mismo deberías poner en el evento Al activar registro del formulario.

Otra forma sería un botón de comando y un cuadro de texto, y en el evento al hacer clic

Consumomensual = DSum("[consumo diario]", "cliente", "month([fecha])='" & [PorMes] & "'")

En el caso de que lo quisieras en un consulta, créala con el campo Consumo diario. Añade un campo:

Mes:mes([fecha])

 En criterios debajo del anterior pon

[escribe un mes]

En la barra de menús pulsa el signo de Agrupar y debajo del campo Consumo Diario le pones Agrupar por Suma. Así cuando quieras abrir la consulta te dirá que escribas un mes.

Lo mismo para año.

Hay mas formas.

Gracias de antemano por tu tiempo. Voy a intentar detallar más exactamente lo que necesitaría, para comprobar si tu respuesta va por ese camino.

Imagina un formulario donde se va a introducir un valor numérico referido al consumo diario. Busco que al abrir cada día el nuevo formulario (se realiza una única entrada de consumo por día y el campo clave de la tabla y por tanto del formulario es la fecha), aparezca el valor acumulado tanto de ese mes como del año.

No es necesario ni que ese valor se guarde en la tabla, simplemente que aparezca y se actualice al guardar el formulario y haber metido el dato nuevo diario.

Evidentemente necesitaría que el acumulado del mes se fuese a 0 al comenzar cada nuevo mes.

Espero que puedas ayudarme. Gracias y un saludo.

Vamos a suponer que el formulario tiene los campos, y por ende los cuadros de texto FechaF, ConsumoDiario, etc. Crea un cuadro de texto llamado, por ejemplo AcumuladoMes.

En el evento Al activar registro del formulario crea un procedimiento de evento y entre Private Sub y End Sub escribe

AcumuladoMes = DSum("[consumo Diario]", "nombretabla", "month([fechaf])=month([forms]![nombreformulario]![fechaf])")

Y en el evento Después de actualizar del cuadro de texto Consumo diario, como se supone que después de poner la fecha y el consumo diario aún te quedarán cuadros por rellenar ponle

DoCmd. RunCommand acCmdSaveRecord

AcumuladoMes = DSum("[consumo Diario]", "nombretabla", "month([fechaf])=month([forms]![nombreformulario]![fechaf])")

Así cuando abras el formulario en un registro cualquiera "mirará" el mes del cuadro de texto FechaF y en el cuadro de texto AcumuladoMes te aparecerá la suma de ese mes. Cuando vayas a escribir una fecha con un mes nuevo, como no hay suma no te aparecerá nada en Acumuladomes, pero una vez que hayas puesto el consumo diario, como ya hay cantidades te pondrá el valor.

Para el caso del año cambia month por year.

Si realmente quieres que te aparezca un cero en vez de quedar en blanco, puedes poner

en vez de [consumo diario]

Nz([consumo diario])

Esta función transformas los nulos, sin valor, en ceros.

De todas formas, si quieres, mándame un mensaje a [email protected], y te mando un par de ejemplos.

Buenas tardes,

Gracias por la explicación, minuciosa y detallada, del asunto. Creo que podría hacerlo pero no estaría de más, si te es posible, que me enviases algún ejemplo simple. Te enviaré un correo a la dirección que me has dado en breves momentos.

Un saludo cordial y nuevamente gracias por tu tiempo.

Gracias por todo...me has ayudado mucho y con tus ejemplos he logrado resolverlo. Si en un futuro tuviese una nueva duda espero poder contar con tu sapiencia.

Un cordial saludo.

Como ya tienes mi correo, no hay problema.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas