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
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
- Compartir respuesta
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
- Compartir respuesta