Problema al sumar varios textbox independientes a uno en Access

mi problema se presenta en un formulario independiente en donde tengo varios textbox independientes enumerados del 1 al 5, donde les agrego registros numéricos de una consulta en listbox, cada vez que agrego un dato a estos textbox, necesito que en otro textbox independiente con otro nombre, me realice la suma insitu, pero no me resulta, en el Origen de control coloco este comando =Nz([VTroncal1];0)+Nz([VTroncal2];0), pero no me resulta, lo que hace es agregarme los números uno al lado del otro.

3 Respuestas

Respuesta
1

Hector, en principio la instrucción está bien. Prueba a poner en el evento Después de actualizar del cuadro de texto Vtroncal1

Cuadro2=nz([vtroncal1] + nz([vtroncal2])

Lo mismo en el evento Después de actualizar del cuadro de texto Vtroncal2 y comprueba que te hace la suma correctamente.

La instrucción Nz, originariamente, sólo transformaba los nulos en ceros ( de ahí NZ), por lo que no es necesario decirle lo de ;0

Otra cosa sería que quisieras transformar los nulos en, por ejemplo, 5. Entonces si deberías poner

Nz([vtroncal1],5)

o en una cadena de texto

Nz([vtroncal];"

Respuesta

El comportamiento que describe, donde los números se concatenan en lugar de sumarse, ocurre porque los valores en los TextBox están siendo tratados como texto en lugar de números. Esto es común en Access si los valores de los controles no están explícitamente convertidos a un tipo numérico.

Usr la función Val para convertir los valores

Modifica la expresión en el Origen de Control del TextBox que realiza la suma como sigue:

=Nz(Val([VTroncal1]), 0) + Nz(Val([VTroncal2]), 0) + Nz(Val([VTroncal3]), 0) + Nz(Val([VTroncal4]), 0) + Nz(Val([VTroncal5]), 0)

La función Val convierte el texto en un número válido. Si el contenido del TextBox no es numérico, el resultado será 0.

Validar en el evento AfterUpdate

Para asegurarte de que la suma se actualice en tiempo real cuando cambies el valor de alguno de los TextBox, puedes usar el evento AfterUpdate de cada uno. Por ejemplo:

Private Sub VTroncal1_AfterUpdate()
    Me.txtSuma = Nz(Val(Me.VTroncal1), 0) + Nz(Val(Me.VTroncal2), 0) + Nz(Val(Me.VTroncal3), 0) + Nz(Val(Me.VTroncal4), 0) + Nz(Val(Me.VTroncal5), 0)
End Sub

El 0 en Nz(Val(Me.VTroncal1), 0) no sobra, ya que asegura que si el valor del campo VTroncal1 es nulo (es decir, no contiene ningún dato), el resultado sea 0 en lugar de generar un error o un valor no deseado.

Explicación

  1. Función Nz:

    • Si el valor de Me. VTroncal1 es Null, entonces Nz() lo reemplaza por el segundo argumento (0 en este caso).
    • Si el valor no es nulo, devuelve el valor original.
  2. Función Val:

    • Convierte el valor del campo en un número. Si el valor es texto o algo que no puede ser convertido, devolverá 0.
  3. Por qué Nz(Val(Me. VTroncal1), 0) es importante:

    • Combina ambas funciones para manejar tanto valores Null como datos no numéricos. Si un campo es nulo o contiene algo no numérico, el resultado será 0, asegurando que no se generen errores.
Respuesta

Según lo publicado y el resultado obtenido me surge una duda:

¿Qué implica exactamente esto?:

-- ... Varios textbox independientes enumerados del 1 al 5, donde les agrego registros numéricos de una consulta en listbox,...

En un cuadro de texto se supone que se almacena un dato (un valor) y por el resultado que se obtiene pudiera ser que en lugar de un valor para utilizarlo posteriormente se añadiesen mas de uno dato (concatenándolos) lo que implicaría un texto y la 'suma (+)' de textos en la practica Access asume que es una concatenación (Access lo asume/permite al ser correcta en otros entornos).

Sobre la utilización volitiva del segundo parámetro en la función NZ no estoy de acuerdo.

Si bien es cierto que si no se utiliza Access por defecto devuelve un CERO (0), solo se cumple si es capar de deducir que el tipo de dato es numérico y (en multiples ocasiones, sobre todo en consultas) en las que no puede precisarlo da error.

Por ello es aconsejable que se le indique que se necesita como retorno, ya que puede devolver un cero -para un texto- en lugar de una cadena vacía, además de permitir un mensaje, por ejemplo:

= Nz([Cantidad];"Sin datos").

Al parecer las respuestas tardan un tiempo en ser publicadas y (mientras tanto) no se admiten ampliaciones, dejo ahora lo que antes me impidió publicar como adenda (ya que el forro no permite editar mensajes tras visualizar lo publicado):


Nota:

Al ser cuadros de texto independientes y obtener ese resultado, la opción aconsejable es utilizar la función VAL que convierte (si le es posible) un texto a numero:

=Val([un campo]) + Val([otro campo]) + ....

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas