Expresión de Calculo Promedio en Consulta
Como seria la expresión de un calculo en una consulta en donde quiero que me saque la media o el promedio de 3 datos de 3 campos en una tabla. Pe Kg1, Kg2, Kg3 . Pero que si el 3° dato (Kg3) es 0 o nulo me calcule el promedio solo de A y B.
1 respuesta
Respuesta de joel1725
1
1
joel1725, Enseñadote aprendo
Solo tienes que cambiar los nombres de los campos y de la tabla que están en negritas.
Promedio:Val(Nz(Sum([k1]))+Nz(Sum([k2]))+Nz(Sum([k3])))/Val(DCount('[k1]','Table1','[k1]<>0')+DCount('[k2]','Table1','[k2]<>0')+DCount('[k3]','Table1','[k3]<>0'))
Crea una consulta que proceda de la tabla donde están los datos a calcular, pero no añadas ningún campo de la tabla, solo que la consulta surja de la tabla.
Coloca el código como un campo nuevo y cambia los nombres de los campos que están en negritas y el nombre de la tabla que esta en negritas.
Lo que hace es calcular el valor promedio de tres campos, solo cuando estos campos son números diferentes de cero, y no nulos. Hasta aquí tu respuesta lo que sigue si te interesa es la explicación de cada uno de los códigos. Si necesitas mi ayuda avisame.
Ahora te explico para que se usan estos 4 códigos diferentes, es bien fácil y te servirá para el resto de tu vida en access. Comencemos con:
1.Val() Este vuelve numero todo lo que este dentro de los paréntesis. Ejemplo
Val("Joel") = 0
Esto es bueno ya que existen lugares donde access interpreta que lo que esta dentro no es un numero, como en el código que puse más arriba si quitas Val() al inicio no te dará un numero correccto.
2.Nz() Este vuelve Cero todo campo Nulo. Ejemplo
Variable + 1 si la variable es un valor nulo devuelve un valor nulo pero Nz(variable) +1 si la variable es un valor nulo deviuelve 1.
Nz() puede ser más complejo así que indaga un poco más sobre el en la web.
3.Sum() Este suma todo lo que este dentro del paréntesis. Ejemplo
Sum(campo1)
Sumara todos los valores del campo1
4.DCount() Este es más complejo este es el criterio que se usa.
DCount('Expresion','Dominio', 'Criterio') no te asustes con todas estas cosas es fácil te explico.
Expresión quiere decir el campo que deseas calcular. Dominio quiere decir el nombre de la tabla donde esta el campo que deseas calcular. Criterio quiere decir cuales son los datos de ese campo que se van a calcular.
En tu caso la expresión use con DCount() fue:
DCount( '[k2]', 'Table1', '[k2]<>0' )
Esto en Español dice Cuenta el campo '[K2]' de la tabla 'Table1' donde los datos de '[K2] sean Diferentes <> de 0'.
Hasta aquí la lección espero que te halla servido y que los puedas practicar mucho así te acostumbraras, no te desanimes y para lante. Si necesitas algo más solo dime.
Promedio:Val(Nz(Sum([k1]))+Nz(Sum([k2]))+Nz(Sum([k3])))/Val(DCount('[k1]','Table1','[k1]<>0')+DCount('[k2]','Table1','[k2]<>0')+DCount('[k3]','Table1','[k3]<>0'))
Crea una consulta que proceda de la tabla donde están los datos a calcular, pero no añadas ningún campo de la tabla, solo que la consulta surja de la tabla.
Coloca el código como un campo nuevo y cambia los nombres de los campos que están en negritas y el nombre de la tabla que esta en negritas.
Lo que hace es calcular el valor promedio de tres campos, solo cuando estos campos son números diferentes de cero, y no nulos. Hasta aquí tu respuesta lo que sigue si te interesa es la explicación de cada uno de los códigos. Si necesitas mi ayuda avisame.
Ahora te explico para que se usan estos 4 códigos diferentes, es bien fácil y te servirá para el resto de tu vida en access. Comencemos con:
1.Val() Este vuelve numero todo lo que este dentro de los paréntesis. Ejemplo
Val("Joel") = 0
Esto es bueno ya que existen lugares donde access interpreta que lo que esta dentro no es un numero, como en el código que puse más arriba si quitas Val() al inicio no te dará un numero correccto.
2.Nz() Este vuelve Cero todo campo Nulo. Ejemplo
Variable + 1 si la variable es un valor nulo devuelve un valor nulo pero Nz(variable) +1 si la variable es un valor nulo deviuelve 1.
Nz() puede ser más complejo así que indaga un poco más sobre el en la web.
3.Sum() Este suma todo lo que este dentro del paréntesis. Ejemplo
Sum(campo1)
Sumara todos los valores del campo1
4.DCount() Este es más complejo este es el criterio que se usa.
DCount('Expresion','Dominio', 'Criterio') no te asustes con todas estas cosas es fácil te explico.
Expresión quiere decir el campo que deseas calcular. Dominio quiere decir el nombre de la tabla donde esta el campo que deseas calcular. Criterio quiere decir cuales son los datos de ese campo que se van a calcular.
En tu caso la expresión use con DCount() fue:
DCount( '[k2]', 'Table1', '[k2]<>0' )
Esto en Español dice Cuenta el campo '[K2]' de la tabla 'Table1' donde los datos de '[K2] sean Diferentes <> de 0'.
Hasta aquí la lección espero que te halla servido y que los puedas practicar mucho así te acostumbraras, no te desanimes y para lante. Si necesitas algo más solo dime.
Hola, gracias por tu tiempo.
Lo he logrado de otra manera, utilizando SiInm(EsNulo.
He creado una consulta donde he puesto lo siguiente:
PromPeso: SiInm(EsNulo([DATOS]![Peso3]),(([DATOS]![Peso1]+[DATOS]![Peso2])/2),(([DATOS]![Peso1]+[DATOS]![Peso2]+[DATOS]![Peso3])/3))
Pero me tengo que asegurar que en el formulario de ingreso de datos en la tabla, los campos tenga un numero o nada pero no cero, ¿estoy en lo correcto?
Te hago otra consulta, quisiera que esa consulta agregara datos a una tabla. Pero en la consulta de datos anexados, cada vez que se ejecuta agrega nuevamente los mismos campos. ¿Lo correcto seria usar una consulta de actualización? ¿He probado pero aparentemente debo primero debo crear una consulta de creación de tabla y luego actualizar con esta la otra tabla? No hay forma de que convierta esa consulta (¿la de la fórmula) en una consulta de actualización de otra tabla existente?
Muchas Gracias
Lo he logrado de otra manera, utilizando SiInm(EsNulo.
He creado una consulta donde he puesto lo siguiente:
PromPeso: SiInm(EsNulo([DATOS]![Peso3]),(([DATOS]![Peso1]+[DATOS]![Peso2])/2),(([DATOS]![Peso1]+[DATOS]![Peso2]+[DATOS]![Peso3])/3))
Pero me tengo que asegurar que en el formulario de ingreso de datos en la tabla, los campos tenga un numero o nada pero no cero, ¿estoy en lo correcto?
Te hago otra consulta, quisiera que esa consulta agregara datos a una tabla. Pero en la consulta de datos anexados, cada vez que se ejecuta agrega nuevamente los mismos campos. ¿Lo correcto seria usar una consulta de actualización? ¿He probado pero aparentemente debo primero debo crear una consulta de creación de tabla y luego actualizar con esta la otra tabla? No hay forma de que convierta esa consulta (¿la de la fórmula) en una consulta de actualización de otra tabla existente?
Muchas Gracias
El código que has creado con Silnm() es bueno para lo que deseas ya que puede crear varios errores, por ejemplo esta expresión calculara tu expresión sin problemas siempre que no sea cero, al momento que dividas 0 con 3 te dará error (Exactamente como dices), ademas solo te calculara bien cuando el campo Peso 3 sea diferente de cero y no sea nulo, pero si el campo Peso2 es cero o es nulo ERROR y si el campo Peso 1 es cero o es nulo ERROR, te recomiendo que uses el que te di ya que funcionara correctamente, ademas te explique lo que hice trata de analizarlo.
Con relación a la consulta de actualización, en access lamentablemento no puedes usar una expresión como esta para ser añadida en una tabla inmediatamente ya que access solo puede añadir datos desde una tabla que contenga datos ya existentes y no calcular y añadir todo al mismo tiempo. Es una pena. Se puede hacer usando código, haciendo recorset u operaciones con sql desde Visual Basic. Aunque para mi seria mucho el usar código para algo como esto.
Un Consejo:
Crea tu Consulta para calcular, crea una de creación de tabla y crea una para actualizar los datos, luego crea un botón en un formulario que realice estas tres operaciones secuencialmente y ya, ni lo notaras.
O también puedes,
En el formulario donde estén los diferentes pesos a calcular crar un cuadro de texto y en ese cuadro coloca el código, luego le puedes decir que lo pase automáticamente a la tabla.
Ojala te sirva, si decides realizar alguna de esta operaciones que te pongo como consejo solo dime que con gusto te ayudo. Suerte.
Con relación a la consulta de actualización, en access lamentablemento no puedes usar una expresión como esta para ser añadida en una tabla inmediatamente ya que access solo puede añadir datos desde una tabla que contenga datos ya existentes y no calcular y añadir todo al mismo tiempo. Es una pena. Se puede hacer usando código, haciendo recorset u operaciones con sql desde Visual Basic. Aunque para mi seria mucho el usar código para algo como esto.
Un Consejo:
Crea tu Consulta para calcular, crea una de creación de tabla y crea una para actualizar los datos, luego crea un botón en un formulario que realice estas tres operaciones secuencialmente y ya, ni lo notaras.
O también puedes,
En el formulario donde estén los diferentes pesos a calcular crar un cuadro de texto y en ese cuadro coloca el código, luego le puedes decir que lo pase automáticamente a la tabla.
Ojala te sirva, si decides realizar alguna de esta operaciones que te pongo como consejo solo dime que con gusto te ayudo. Suerte.
Hola, muchas gracias.
Voy a utilizar el código para los cálculos que me has enviado y explicado entonces.
Con respecto a la consulta, ¿me gustaría saber como seria el código en el cuadro de texto para que me envíe el dato a otra tabla?
Saludos
Voy a utilizar el código para los cálculos que me has enviado y explicado entonces.
Con respecto a la consulta, ¿me gustaría saber como seria el código en el cuadro de texto para que me envíe el dato a otra tabla?
Saludos
Suponiendo que posees una tabla llamada Medidas la cual posee los campos K1, k2 y k3 y que posees un formluario llamada FormMedidas el cual procede de esa tabla.
Bien lo que debes de hacer es crear un campo en la tabla Medidas llamado Promedio, preferiblemente numérico y en el formulario FormMedidas debes añadir el campo Promedio junto con todos los demás datos de la tabla y debes de crear un cuadro de texto llamado Calculo de Promedio en el formulario, en el pondrás el siguiente código.
=Val(Nz(Suma([k1]))+Nz(Suma([k2]))+Nz(Suma([k3])))/Val(DCont('[k1]','Medidas','[k1]<>0')+DCont('[k2]','Medidas','[k2]<>0')+DCont('[k3]','Medidas','[k3]<>0'))
Luego en las propiedades de los campos k1, k2, y k3 en las pestañas Eventos en la fila llamada Después de actualizar, en generarador de código debes de colocar la linea siguienste Me. Refresh (recuerda hacer esto con cada uno) luego en el formulario en la sección llamada detalles debes de ir a sus propiedades y en la pestaña Eventos en la fila Al mover el mouse debes de colocar el siguiente código
Dim var As Variant
var = Me.Calculo_de_Promedio.Value
If IsNull(var) Then Exit Sub
Me.Promedio.Value = Me.Calculo_de_Promedio.Value
Leccion
Lo que hará Me. Refresh es que cada ves que añadas un registro nuevo y pases a otro el calculara el promedio, y el código
Dim var As Variant
var = Me.Calculo_de_Promedio.Value
If IsNull(var) Then Exit Sub
Me.Promedio.Value = var
Es que cada ves que te muevas con el mouse sobre la sección detalle de tu formulario este
Crea una variable llamada var la Variable toma el valor del campo que realiza el calculo Si el campo calculado es nulo pues no hace nada Si no es nulo toma el valor y lo coloca en el campo Promedio.
Tal vez sea bueno que coloques el campo Promedio como invisible y solo veas el que realiza el calculo. Si necesitas algo más estoy por aquí cerca. Suerte.
Bien lo que debes de hacer es crear un campo en la tabla Medidas llamado Promedio, preferiblemente numérico y en el formulario FormMedidas debes añadir el campo Promedio junto con todos los demás datos de la tabla y debes de crear un cuadro de texto llamado Calculo de Promedio en el formulario, en el pondrás el siguiente código.
=Val(Nz(Suma([k1]))+Nz(Suma([k2]))+Nz(Suma([k3])))/Val(DCont('[k1]','Medidas','[k1]<>0')+DCont('[k2]','Medidas','[k2]<>0')+DCont('[k3]','Medidas','[k3]<>0'))
Luego en las propiedades de los campos k1, k2, y k3 en las pestañas Eventos en la fila llamada Después de actualizar, en generarador de código debes de colocar la linea siguienste Me. Refresh (recuerda hacer esto con cada uno) luego en el formulario en la sección llamada detalles debes de ir a sus propiedades y en la pestaña Eventos en la fila Al mover el mouse debes de colocar el siguiente código
Dim var As Variant
var = Me.Calculo_de_Promedio.Value
If IsNull(var) Then Exit Sub
Me.Promedio.Value = Me.Calculo_de_Promedio.Value
Leccion
Lo que hará Me. Refresh es que cada ves que añadas un registro nuevo y pases a otro el calculara el promedio, y el código
Dim var As Variant
var = Me.Calculo_de_Promedio.Value
If IsNull(var) Then Exit Sub
Me.Promedio.Value = var
Es que cada ves que te muevas con el mouse sobre la sección detalle de tu formulario este
Crea una variable llamada var la Variable toma el valor del campo que realiza el calculo Si el campo calculado es nulo pues no hace nada Si no es nulo toma el valor y lo coloca en el campo Promedio.
Tal vez sea bueno que coloques el campo Promedio como invisible y solo veas el que realiza el calculo. Si necesitas algo más estoy por aquí cerca. Suerte.
- Compartir respuesta
- Anónimo
ahora mismo