Suma de los totales en un formulario con varios campos calculados
Tengo un formulario continuo con 13 campos que son calculados entre ellos, y estos, a su vez dan un Total por cada una de las líneas del formulario.
Intento realizar la suma al pie del formulario del Total de cada una de las líneas pero me esta dando error y no consigo eliminarlo.
Realizo la Suma del pie sumando los cálculos finales pero me sigue dando el mismo error.
=Suma(Nz([PreTotal]+[TotalFamilia]+[Mermas];0))
El campo PreTotal en un total de otros campos anteriores
2 Respuestas
Te comento cosas:
1º/ Estás Usando mal la función Nz(): si alguno de los campos que quieres sumar es Nulo, aunque el resto no lo sea, el resultado, tal como lo tienes puesto, será 0, que no es correcto.
Para que te haga bien la suma, has de usar Nz() en cada sumando:
=Suma(Nz([PreTotal];0)+Nz([TotalFamilia];0)+Nz([Mermas];0))
2º/ El motivo de que te de error, y entendiendo que esos campos calculados los calculas en el formulario directamente (en su origen de control), es que Access no reconoce en el mismo formulario el nombre de los campos calculados. Esto significa que no puedes usar los nombres, sino que has de repetir nuevamente la expresión de cálculo.
Por ejemplo, si tengo en mi formulario los campos Importe e IVA, ambos numéricos, y creo un cuadro de texto txtTotLinea con la expresión: =Nz(Importe;0) + Nz(IVA;0)
A la hora de hacer la suma en el pie del formulario, no puedo poner:
=Suma(txtTotLinea) porque me dará #Error
sin embargo, si pones:
=Suma(Nz(Importe;0) + Nz(IVA;0)) te lo calculará perfectamente.
3º/ Tendrías otra opción para hacerlo: crear una consulta en la que añadas esos campos calculados, y luego hagas el formulario sobre esa consulta y no sobre la tabla (obviamente ya no necesitas hacer los cálculos en el formulario). Ahora sí que podrías usar los nombres de los campos calculados en la expresión como intentabas inicialmente (pero teniendo en cuenta lo que te comentaba del Nz).
Un saludo.
He probado sumar los campos de esta dos formas:
=Suma(Nz([PreTotal]);0)+Nz(([TotalFamilia]);0)+Nz(([Mermas];0))
=Suma(Nz([PreTotal))+Nz(([TotalFamilia]))+Nz(([Mermas]))
y me sigue dando el mismo error: #Error
Estos Campos son sumas acumuladas de diferentes columnas del formulario que componen todo el Form.
¿Y no será que tus cuadros no texto no se llaman PreTotal, TotalFamilia y Mermas? Compruébalo sacando sus propiedades -> Pestaña Otras -> Nombre
Si los nombres son los correctos, tendrás que explicarme mejor cómo se calculan esos campos, poniendo las expresiones, y/o una imagen del formulario, porque no lo acabo de ver claro...
Esta es la Pantalla donde he de sacar los totales de P.V.P. y el error es el que se me ocasiona en la suma del Campo: Total Lote.
Este form es un calculo de PVP de precios de un Lote de Productos.
Todos los Campos son calculados NO existen físicamente en las Tablas.
Todos los cálculos de la aplicación están basadas en Tablas Maestras donde por cada uno de los conceptos existe un Factor que es el Tiempo y Forma de Actuación del Concepto y el Coste del Tiempo es calculado en función de los Costes reales de la Empresa que son variables casi a diario.
El precio de Venta es una variable del Tiempo de Realización del Producto por Coste del Segundo más conceptos especificps del Producto.
Los Campos están bien definidos y por su nombre ya que con eso voy con mucho cuidado por el tipo de trabajo que tiene el programa en cada uno de los Forms que trato.
Muchas gracias por tu atención, si necesitas más información dímelo y te la mando. Un saludo
Sigo sin saber qué quieres sumar, aunque me lo puedo imaginar.
Pero ¿qué es PreTotal yTotalFamilia? Intuyo que PreTotal son los cuadros de texto de la "columna" TOTAL y Mermas imagino que serán los de la columna "MERMAS", pero TotalFamilia me tiene despistado.
Por otro lado, cuando dices que todos los campos son calculados, ¿realmente quieres decir que todos (descripcion, materiales, arte final...) tienen como origen una expresión? Y en ese caso, ¿cuáles son?
Porque insistiendo en mi primera respuesta, has de usar las expresiones de cálculo y no los nombres de los "campos calculados" para obtener la suma total.
Por ponerte un ejemplo sobre tu formulario:
1º/ Supongo que [TOTAL] lo obtienes como (sin tener en cuenta el uso de Nz()):
=[Materiales]+[Arte Final]+[Manipulacion]+[Impresion]+[Extras]
2º/ Supongo que [TOTAL+IVA] es: =[TOTAL]*1.21
3º/ Supongo que [Baremo Familia] y [Mermas] son directos
4º/ Supongo que [Resultante Unidad] es: = [TOTAL+IVA]+[Baremo Familia]+[Mermas]
5º/ Quieres calcular [Total Lote], que será la suma de todos los "Resultante unidad". Entonces, imagino que tu estás haciendo:
=Suma([TOTAL+IVA]+[Baremo Familia]+[Mermas]) y te da #Error
y yo te digo que tendrías que hacerlo así:
=Suma(([Materiales]+[Arte Final]+[Manipulacion]+[Impresion]+[Extras])*1.21+[Materiales]+[Arte Final]+[Manipulacion]+[Impresion]+[Extras])
Te agradeceria muchisimo si puedieses darme la instruccion correcta para evitar el error y poder recoger la Suma Total del campo: SUMATOTAL
Intento realizar las sumas pero no consigo que me funcione. Estos son los nombres de los Campos que he de sumar, son todos ellos extraídos de una consulta de anexión que previamente es ejecutada.
SumaDeImporte1
SumaDeImporte4
SumaDeImporte5
SumaDeImporte8
SumaDeImporte6
Calculo -> Suma de los Campos Anteriores
TotalIVA -> Suma de Calculo + IVA (IVA es el Campo del Impuesto)
SumaDeImporte10
PRETOTAL = Suma(Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*[IVA]/100)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*21/100))*((Nz([SumaDeImporte10]);0)/100)))
TotalFamilia = [PreTotal]*[SumaDeImporte13]/100
MERMAS = ([SumaDeImporte2]*[SumaDeImporte9])+([SumaDeImporte2]*[SumaDeImporte9]*[IVA]/100)
TOTALFINAL= Nz(([PreTotal]+[TotalFamilia]+[Mermas]);0
AREA = Nz(([PreTotal]+[TotalFamilia]+[Mermas]);0)
SUMATOTAL = Nz(([TOTALFINAL])*([SumaDeAREA]);0)
.. He de Totalizar todos los SUMATOTAL que es Precio Venta Publico...
Si necesitas más información dímelo y te la envío.
Muchas gracias. Un saludo
Aunque yo lo hubiera planteado de otra forma, prueba:
Suma((Suma(Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*[IVA]/100)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*21/100))*((Nz([SumaDeImporte10]);0)/100)))+(Suma(Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*[IVA]/100)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0)+((Nz(([SumaDeImporte1]);0)+Nz(([SumaDeImporte4]);0)+Nz(([SumaDeImporte5]);0)+Nz(([SumaDeImporte6]);0)+Nz(([SumaDeImporte8]);0))*21/100))*((Nz([SumaDeImporte10]);0)/100))))*[SumaDeImporte13]/100+([SumaDeImporte2]*[SumaDeImporte9])+([SumaDeImporte2]*[SumaDeImporte9]*[IVA]/100))*[SumaDeAREA])
Pero me parece que te va a dar un error de que la expresión es muy larga...
Efectivamente me da un error.
Me dice que el: texto es demasiado largo para modificarlo.
Me comentas otra forma de haberlo planteado. Cual seria la mejor manera para que pudiese funcionar?
Una ya te la comenté: hacer una consulta que haga los cálculos y usarla como origen del formulario. Así sí podrías usar directamente nombres de los controles en la función Suma.
Otra forma que podrías probar es crear funciones propias en VBA para realizar los cálculos y usarlas en vez de las expresiones que tienes (al menos para PreTotal).
Por último, hacer todos los cálculos vía código y pasar los resultados a los cuadros correspondientes.
Estoy intentando crear una consulta para extraer los totales para usarlos en el formulario como me has indicado.
El problema que tengo es que la tabla esta con muchas líneas para un mismo producto en función del calculo que realizo por cada uno de los concepto de las columnas (Diseño, Materiales, Extras, Manipulados ... etc.)
Al calcular porcentajes o totales me los calcula por cada una de las líneas de forma individual y al final no cuadra por los resusltado individuales.
De que manera podría fusionar la tabla para que me agrupase las líneas por conceptos como hago en el formulario. ¿Hay alguna manera de dejar unicamente una sola línea con la suma de todos los totales previamente a realizar los cálculos en la consulta de anexión que creo?.
Me has mandado anteriormente tu dirección de correo para mandarte la aplicación donde se generan los datos para que la vieses, pero el problema que tengo es que no veo ese correo como si se hubiese borrado.
Ruego me la mandes de nuevo con la referencia que tenga que enviarte para que la puedas ver.
Gracias
Ayer por la tarde te mande el programa, ¿pero al ser con más de 25 Mb. te mandaría un enlace para descargarlo recibiste el correo?
Al final he obviado prácticamente todo de la BD que me envías, porque al no incluir la tabla del iva, los formularios "cascan".
Por eso, he creado la Consulta1 que devuelve exactamente los mismos resultados que muestra tu formulario y que dices (y yo también lo creo) que son erróneos.
La consulta2 es prácticamente igual que la anterior pero con las fórmulas correctas para hacer los cálculos. Sobre ésta he creado el formulario y como ves, hacer el sumatorio del PVP de cada linea en el encabezado no tiene nada de complicado.
http://www.filebig.net/files/4wUuC3YZt5
Dicho lo anterior, te explico la diferencia entre entre la Consulta1 (errónea) y la Consulta2 (correcta según yo lo entiendo) con un ejemplo sobre tus datos:
En la tabla, para el producto CARTON PLUMA 100X70 5 MM, en la columna Importe10 (que es la que da el Margen) tienes estos datos:
Fíjate que solo tienes una linea con un valor distinto de 0 (la que señalo)
En tu formulario, tras pasar los datos a la otra tabla y hacer una consulta de totales como base del formulario obtienes:
que es lo mismo que muestra mi Consulta1:
En este punto, y viendo solo el formulario, es fácil suponer que "Importe+Margen"= ("Total+IVA")*(1+%MargenFinal/100). Sin embargo, haciendo a mano el cálculo, vemos que las cantidades no cuadran: 39,29824 x 1,05 = 41,263152 y no 40,19857 como indica el formulario...
¿Por qué?
Te lo explico con las expresiones de mis consultas, que se ve mejor:
En Consulta1 el cálculo se hace:
ImpMargen: Suma(([Importe1]+[Importe4]+[Importe5]+[Importe8]+[Importe6])*1,21*(1+[Importe10]/100))
es decir, se calcula la suma de los importes 1,4,5,6 y 8, se multiplica por 1.21 (el IVA) y luego se le incrementa el margen. Una vez hecho este cálculo para cada linea se suman todos los resultados. O sea, que primero se hacen los cálculos por linea, y luego se suman.
Esto implica que solo a la primera linea se le aplica el incremente del 5 % de margen, porque es la única que tiene ese valor (para el resto de lineas el Importe10 es 0)
En Consulta2, el cálculo es:
ImpMargen: Suma(([Importe1]+[Importe4]+[Importe5]+[Importe8]+[Importe6]))*1,21*(1+Suma([Importe10])/100)
aquí se hace por un lado la suma de los importes 1,4,5,6 y 8 por linea y la total, luego ese total se multiplica por el iva, y luego se incrementa en la suma de todos los margenes.
Fíjate que esta segunda expresión tiene dos Suma(), mientras que la primera solo una.
Lo mismo ocurre al calcular el PVP, porque no todos los registros tienen un valor para Area...
Volviendo al tema inicial, te dejo de nuevo el archivo con una nueva Consulta3, que es igual que la Consulta2 pero sin los campos calculados Ttotal, TotalIVa, ImpMargen, Resultado Unidad y PVP, que se calculan directamente en el nuevo formulario DESGLOSE2.
En este formulario, aplicando o que te decía de no usar los nombres de los cuadros de texto independientes y sí las expresiones de cálculo, verás que la suma en el cuadro de texto independiente del encabezado funciona y coincide (como no podía ser de otra manera) con la del formulario DESGLOSE.
- Compartir respuesta
Sin saber como está construido ¿has probado a poner
=Suma(Nz([PreTotal])+nz([TotalFamilia])+nz([Mermas]))
En la función NullZero, si no le dices nada en contra, por defecto, transforma los nulos en ceros, no hace falta lo de ;0
He probado sumar los campos de esta dos formas:
=Suma(Nz([PreTotal]);0)+Nz(([TotalFamilia]);0)+Nz(([Mermas];0))
=Suma(Nz([PreTotal))+Nz(([TotalFamilia]))+Nz(([Mermas]))
y me sigue dando el mismo error: #Error
Estos Campos son sumas acumuladas de diferentes columnas del formulario que componen todo el Form.
¿Podrías mandarme una copia con tres o cuatro registros inventados? Es para poder ver donde está el fallo. Mi correo es [email protected]
Si lo haces, en el asunto del mensaje pon tu alias Jobe Orba, ya que si no sé quien me escribe ni los abro.
- Compartir respuesta