Sumar los totales de dos subformularios en VBA

Dispongo de un formulario de Ventas que esta formado por el Formulario Principal y dos subformularios LineasVentas y EntregasACuenta.

Necesito que a través del botón de impresión previamente a la impresión a través de VBA que me actualice el campo PendientePago que es igual a la suma de las líneas TotalLineas y suma de las Entregas con el campo SumaEntregas

PendientePago = TotalLineas - SumaEntregas

Este total he de colocarlo al pie del documento indicando el pendiente de pago existente.

El motivo de tener que hacerlo en VBA es porque después de colocar las entregas directamente se accede a la impresión del documento y nos son actualizados los campos en el formulario principal dando un resultado erróneo en el documento por la falta de la actualización del PendientePago.

2 respuestas

Respuesta
2

Juan: Supongo que ya tienes el Botón de Imprimir, con el que abres el Informe y que lo tienes en el Formulario Principal >> Ventas.

Si eso es así, como primeras líneas, antes de abrir el informe, yo haría.

Me. LineasVentas. Requery

Me. EntregasACuenta. Requery

Me.PendienteDepago = Nz(Me.LineasVentas.TotalLineas,0)-Nz(Me.EntregasACuenta.SumaEntregas,0)

De esa manera ya lo tendrías actualizado, y lo haces servir como origen de Control del Informe.

Espero sea lo que necesitas. Un saludo >> Jacinto

Gracias Jacinto por tu ayuda.

Te explico con más detalle el Formulario:

Formulario Principal: ARREGLOSCABECERA

SubFormulario1: ARREGLOSLINEAS

SubFormulario2: ENTREGASACUENTA

Campo que recoge en Formulario el Pendiente de pago: PENDIENTEPAGO, es un Campo: txt

Quiero evitar que después de dar las líneas de ventas y pasar al Formulario: ENTREGASACUENTA, si después de dar alguna entrega directamente se va al botón de impresión (que es lo que ocurre constantemente), que el Campo: PENDIENTEPAGO quede inmediatamente totalmente actualizado ya que en la impresión, este campo es que me da el importe a pagar del documento.

He colocado lo que me indicas y me da este error:

remarcandome en amarillo:

Me.PendientePago = Nz(Me.ARREGLOSLINEAS.SumaImportes, 0) - Nz(Me.ENTREGASACUENTA1.Entregas, 0)

He probado colocarlo todo entre corchetes y sigue dándome errores.

He intentado colocarlo en el Subformulario ENTREGASA CUENTA en el evento: Al perder el enfoque y tampoco lo he conseguido.

Si necesitas otra información dímelo y te la mando.

Un saludo

Juan: Alguno de los nombres no lo encuentra.

Veo que Nombras un subFormulario como ENTREGASACUENTA y al citarlo lo haces como ENTREGASACUENTA1. Lo primero es asegurar que "todos" los controles coinciden con lo que citas y si después sigue sin salirte, me comentas.

Doy por supuesto que tienes una suma de los Importes en el SubFormulario ARREGLOSLINEAS, que se llama SumaImportes y una suma de las entregas en el Subformulario EntregasACuenta, que se llama Entregas. Mis saludos >> Jacinto

El formulario de las Entregas es: ENTREGASACUENTA1, te había mandado antes mal el nombre.

Al pie de este formulario existe un control que realiza la suma que es: ENTREGAS.

En el subformulario ARREGLOSLINEAS esta el control SumaImportes y estos dos formularios están dentro del Form principal ARREGLOSCABECERA.

El botón de impresión esta dentro del Form principal que es que necesito actualizar antes de realizar la impresión del documento

Formulario Principal: ARREGLOSCABECERA -> (Campo Actualizar) PENDIENTEPAGO

SubFormulario1: ARREGLOSLINEAS ->Totales: SumaImportes

SubFormulario2: ENTREGASACUENTA1 -> Totales: Entregas

PendientePago = SumaImportes - Entregas

Un saludo

Juan: La verdad es que no sé de donde viene el Error, pero por si he omitido algo comienzo de nuevo con los Nombres de de Objetos que me comentas.

Como el único que me falta es el del Botón, voy a suponer que se llama BnAbreInforme.

Entonces:

Private Sub BtnAbreInforme_Click()
'Para actualizar los dos subFormularios, solo por precaución.
Me.ARREGLOSLINEAS.Form.Requery
Me.ENTREGASACUENTA1.Form.Requery
Me.PENDIENTEPAGO = Nz(Me.ARREGLOSLINEAS.SumaImportes,0)-Nz(Me.ENTREGASACUENTA1.Entregas,0)
'Aquí el resto del código que estés utilizando para abrir el Informe.
'****
'****
End Sub

No veo otras cosas que se deban cambiar.

Ahra bien, es posible que por alguna razón alguno, o los dos sub Formularios, tengan el Nombre de "Contenedor" distinto. Eso lo averiguas en vista de diseño, pulsando en el "Marco" del sub Formulario. Mis saludos >> Jacinto

Me da el error en esta línea marcándome lo que esta en negrita y me dice que no encuenta el dato.

Me.PendientePago = Nz(Me.ARREGLOSLINEAS.SumaImportes, 0) - Nz(Me.ENTREGASACUENTA1.Entregas, 0)

En otro apartado del formulario realizo la actualización del Form y me funciona bien:

=Nz([ARREGLOSLINEAS].[Formulario]![SumaImportes])

=Nz([ENTREGASACUENTA1].[Formulario]![Entregas])

Me ocurre esto en el botón de actualización en la actualización previa a la impresión del documento.

Juan: Prueba cambiando la línea >>

Me.PendientePago = Nz(Me.ARREGLOSLINEAS.SumaImportes, 0) - Nz(Me.ENTREGASACUENTA1.Entregas, 0)

por ésta otra

Me.PendientePago = Forms!ArreglosLineas.Form.SumaImportes - Nz(Me.ENTREGASACUENTA1.Entregas, 0)

Porque en realidad ignoro de donde puede venir el error. Mis saludos >> Jacinto

He puesto dos Campos de texto previamente a la impresión que recogen estos valores:

Me.Lineas = Nz(Me.ARREGLOSLINEAS!SumaImportes, 0)
Me.CobrosEntregas = Nz(Me.ENTREGASACUENTA1!Entregas, 0)

Y el campo CobrosEntregas no me recoge el valor hasta que no se ha iniciado la impresión del documento.

También me lo recoge bien o sea previamente si pulso sobre cualquier otro campo o pulso F5 antes de la impresión.

Parece que : Me.entregasacuenta1.Form.Requery No me esta actuando correctamente antes de imprimir ya que no actualiza el subformulario.

Juan: Si solo fuera eso, puedes probar con:

Forms!EntregasAcuenta1.Form.Requery

Pero me temo que hay algo enmascarado por ahí.

Si no lo consigues, pon todo el código del botón de Impresión a ver si descubrimos algo.

Mis saludos >> Jacinto

Este es actualmente lo que tengo colocado en el BOTÓN con campos para comprobar los resultados antes de la impresión:

Private Sub Comando142_Click()
Me.ARREGLOSLINEAS.Form.Requery
Me.Forms!ENTREGASACUENTA1.Form.Requery

' Nuevos campos para comprobacion valores
Me.Lineas = Nz(Me.ARREGLOSLINEAS!SumaImportes, 0)
Me.CobradoEntrega = Nz(Me.ENTREGASACUENTA1!Entregas, 0)

Mensaje = MsgBox("Comprobar PENDIENTE DE PAGO despues ACTUALIZAR")

Me.Pendiente = PendientePago
DoCmd.OpenReport "TICKETARREGLOSLINEAS", , , "IdArreglo=" & Me.IdArreglo
Me.PAGO = " "
End Sub

Juan: Vamos a probar forzando los valores, porque si no sale así, lo veo un poco crudo.

Private Sub Comando142_Click()
Forms!ArreglosCabecera!ARREGLOSLINEAS.Form.Requery
Forms!ArreglosCabecera!ENTREGASACUENTA1.Form.Requery
Me.PendientePago = Forms!ArreglosCabecera!ArreglosLineas.Form.SumaImportes –Forms!ArreglosCabecera!EntregasACuenta1.Form.Entregas
DoCmd.OpenReport "TICKETARREGLOSLINEAS", , , "IdArreglo=" & Me.IdArreglo
End Sub

Mis saludos >> Jacinto

He colocado las instrucciones conforme me has indicado:

Me.PendientePago = Forms!ArreglosCabecera!ArreglosLineas.Form.SumaImportes Forms!ArreglosCabecera!EntregasACuenta1.Form.Entregas

Y me da un error en el signo de la resta: -

He particionado la instrucción en los dos campos que utilizo para ver los totales de los Subformularios:

Me.Lineas = Forms!ArreglosCabecera!ARREGLOSLINEAS.Form.SumaImportes
Me.CobradoEntrega = Forms!ArreglosCabecera!ENTREGASACUENTA1.Form.Entregas

El problema es que no actualiza el Subformulario ENTREGASACUENTA1 ya que el total ENTREGASno recibe ningún valor hasta que no comienza la impresión del documento.

He comprobado que si el Campo total: ENTREGAS tiene un valor por la suma de otras entregas anteriores y modifico o inserto alguna nueva línea en el Formulario me borra el total existente y no lo recupera hasta que no empieza a imprimir el documento.

He probado en los eventos del Formulario ENTREGASACUENTA1 el colocar el Requery y hace caso omiso no actualiza el total: ENTREGAS

Un saludo

Juan: Por mi parte lo único que se me ocurre es que me mandes si quieres, esa parte de tu BD, con todos los objetos que intervengan de tablas, consultas, Formularios, Informes y si hay algún módulo de código asociado para hacer todo el proceso.

Pones unos cuantos datos solo y por favor que no contengan elementos confidenciales o personales.

Si decides enviarmela, lo haces a [email protected] y con ella delante miro de donde viene el problema. Mis saludos >> Jacinto

He optado por colocar un botón que previamente me realiza la actualización de los campos y después paso a la impresión y así me funciona perfectamente utilizando todo lo que en el botón de la impresión no he conseguido que funcione.

No entiendo porque no actúa en el botón de impresión directamente.

Muchas gracias por toda tu gran ayuda.

Un saludo

Respuesta
2

Te prometo que me he perdido, pero por lo que dices, puedes poner en el evento después de actualizar del cuadro de texto Entregas

Docmd. Runcommand accmdsaverecord

Me. Parent! Total. Pendientepago. Requery

O tambien

Me. Parent. Refresh

También podrías poner en el evento Después de actualizar de los cuadros de texto Lineas y Entregas

me.parent!pendientedepago =dsum("lineas","lineasventa","Idloquesea=forms!principal!idloquesea")-dsum("entregas","entregasacuenta","idloquesea=forms!principal!idloquesea")

Siendo idloquesea, o bien el campo que relaciona formulario con subformulario o bien un campo que identifique a un registro del formulario

He colocado las instrucciones conforme me has indicado:

Me.PendientePago = Forms!ArreglosCabecera!ArreglosLineas.Form.SumaImportes Forms!ArreglosCabecera!EntregasACuenta1.Form.Entregas

Y me da un error en el signo de la resta: -

He particionado la instrucción en los dos campos que utilizo para ver los totales de los Subformularios:

Me.Lineas = Forms!ArreglosCabecera!ARREGLOSLINEAS.Form.SumaImportes
Me.CobradoEntrega = Forms!ArreglosCabecera!ENTREGASACUENTA1.Form.Entregas

El problema es que no actualiza el Subformulario ENTREGASACUENTA1 ya que el total ENTREGAS no recibe ningún valor hasta que no comienza la impresión del documento.

He comprobado que si el Campo total: ENTREGAS tiene un valor por la suma de otras entregas anteriores y modifico o inserto alguna nueva línea en el Formulario me borra el total existente y no lo recupera hasta que no empieza a imprimir el documento.

He probado en los eventos del Formulario ENTREGASACUENTA1 el colocar el Requery y hace caso omiso no actualiza el total: ENTREGAS

Un saludo

Creo que ya tienes mi correo, pero si no es así, es

[email protected]

Si quieres, repito, si quieres mándame un mensaje y te envío un ejemplo. Si lo haces, ene el asunto del mensaje pon tu alias Juan Olaso, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas