Actualizar resultados de formulario Access

Tengo una tabla de datos "Materiales" en la que ingreso el nombre y el precio por unidad de los materiales que utilizo. Desarrollé un formulario "Elaboración". Elijo en el formulario "Elaboración" todos aquellos materiales que utilizo para elaborar productos finales (Más de dos). Este formulario hace unos cálculos para dar un resultado del "costo final". Sin embargo, cuando cambio los precios de los materiales en la tabla "Materiales" no se cambia el "costo final", sino que mantiene como resultado el "costo final" que tenía antes del cambio de precio. Para solucionarlo, he tenido que eliminar el material en el formulario y volver a ingresarlo. Y ahí hace el cálculo correcto. Ha probado con "recalcular" y "refrescar" y no recalcula y no entrega el nuevo valor final, sino que mantiene aquel valor que tenía antes del cambio de "precio". ¿Tengo qué ingresar alguna instrucción para que recalcule? ¿No hay una función incorporada o algo similar que permita la actualización automática cada vez que se ingrese un valor nuevo?

2 Respuestas

Respuesta
2

Probablemente el problema radique en cómo tienes montado el formulario (y la tabla subyacente) y en cómo haces los cálculos, porque se me ocurren varias formas de cómo puedes tenerlo.

Dices que has probado con Recalc y con Refresh, ¿y probaste con Requery? Si así no te va, no existe ninguna función nativa que te actualice los cálculos, aunque siempre puedes crearte tú una en VBA y llamarla cuando la necesites.

Otra posible solución podría ser que en el evento "Al activar registro" del formulario le programes que te traiga el precio actualizado y te haga de nuevo los cálculos.

De nuevo, en función de cómo hayas montado tu sistema, deberías plantearte si lo que pretendes es lo más adecuado, porque si al cambiar un precio en "Materiales" vas a cambiarlo en todos los registros de "elaboraciones", estarás perdiendo información histórica.

Me explico: si tienes un material X que en 2018 cuesta 10, y tienes una elaboración en agosto que lleva 3 unidades de X, tendrá un costo total de 30.

Si en 2019 el coste de X sube a 20, y actualizas todos los registros de elaboraciones, cuando consultes la elaboración de agosto de 2018 verás que te muestra un costo de 60, lo que no sería correcto...

Otra alternativa que se me ocurre sería añadir un botón a tu formulario que al pulsarlo traiga el precio del artículo del material al registro activo y haga de nuevo el cálculo del precio total. De esta forma, solo actualizas el precio en los registros que quieres.

En fin, que posibilidades hay muchas, pero el uso de unas u otras dependerá en gran medida de cómo hayas estructurado tus tablas y formulario, y de si quieres o no mantener el registro histórico de precios.

Hola Sveinbjorn, gracias por la respuesta. Me gustó la opción que me indicas "Otra alternativa que se me ocurre sería añadir un botón a tu formulario que al pulsarlo traiga el precio del artículo del material al registro activo y haga de nuevo el cálculo del precio total. De esta forma, solo actualizas el precio en los registros que quieres". Hay algún código en VBA? Probé con Requery, pero no me funcionó. Mi formulario (Tabla Elaboración) sí actualiza el costo por cada tipo de material cuando cambio sus precios. Esta tabla sí suma los subtotales (es decir hace un "Costo Total" por medio de la suma de subtotales) y hasta ahí lo hace bien, pero el problema, es que cuando cambian los precios de los materiales y suma el total de subtotales, para obtener un nuevo "Costo Total", no lo hace bien, sino que mantiene el costo que tenía antes del nuevo precio de los materiales. Es decir la falla está en que no entrega el nuevo "Costo Total". Ne es necesario saber el costo que tenía antes del cambio (para que no te preocupes de encontrar cómo hacer eso). Gracias.

Es muy difícil ayudarte sin saber lo que tienes, porque las explicaciones que ofreces, poca información dan (haces unos cálculos, pero ¿cómo?, ¿Qué campos tienes?...)

Te lo explico suponiendo cosas:

1º/ En la tabla Materiales tienes los campos IDMaterial (autonumérico), Material (texto) y Precio (moneda)

2º/ En la tabla Elaboraciones (y en el formulario Elaboraciones) tienes, entre otros, los campos IDElaboracion (autonumerico), Material (numérico, relacionado con el IDMaterial de Materiales), CostoUnitario(moneda), Unidades (número) y CostoTotal(moneda)

3º/ En tu formulario pones un botón, y en su evento "Al hacer click" pones:

Me.CostoUnitario=DLookUp("Precio","Materiales","IDMaterial=" & Me.Material)
Me.CostoTotal=Me.CostoUnitario*Me.Unidades

Y así te cogerá el precio que tengas para ese material en la tabla materiales y te recalculará el coste total de ese material.

Respuesta
2

Vamos a ver si me explico, supongamos que tengo una tabla con materiales para la fabricación de cuadros, con el precio de cada componente

Tambien tengo una tabla donde voy a reflejar el nombre del producto elbaorado y su precio

Y una tabla donde voy a guardar los materiales que la componen

Con estas dos últimas hago un formulario con subformulario donde anoto

Los cálculos los hace directamente el código.

Vamos a suponer que ahora le cambio el precio a los materiales

Como no dices desde donde, ni como quieres actualizar, puedes crear una consulta de actualización con un nombre original, por ejemplo, Actualizar,

Con este diseño

Entonces, le añado un botón al formulario(es para que se vea bien, pero se podría hacer desde cualquier otro lado)

Si pulso el botón Actualizar precios

El código del botón es simplemente

Private Sub Comando8_Click()
DoCmd.OpenQuery "actualizar"
Me.Componentes.Form.Requery
Importe = DSum("subtotal", "componentes", "idelaboracion=" & Me.IdElaboracion & "")
End Sub

Las dos líneas de abajo no serían necesarias si lo actualizas desde otro sitio, pero he preferido que lo vieras.

Por si te queda algo de interés después del rollo que he puesto, el código del subformulario para que haga él los cálculos es

Private Sub Cantidad_AfterUpdate()
Subtotal = Precio * Cantidad
DoCmd.RunCommand acCmdSaveRecord
Me.Parent!Importe = DSum("subtotal", "componentes", "idelaboracion= " & Me.IdElaboracion & "")
End Sub
Private Sub IdMaterial_AfterUpdate()
Precio = DLookup("precio", "materiales", "idmaterial=" & Me.IdMaterial & "")
Cantidad.SetFocus
End Sub

Hola Icue: gracias por tu respuesta. Mi formulario (Tabla Elaboración) sí actualiza el costo ("subtotal") por tipo de material si cambio los precios de los materiales. Esta tabla sí suma los subtotales (hace un "Costo Total) y hasta ahí lo hace bien, pero el problema, es que cuando cambian los precios de los materiales y suma el total de subtotales, para obtener un nuevo "Costo Total", no lo hace bien, sino que mantiene el costo que tenía antes del nuevo precio de los materiales. Es decir la falla está en que no entrega el nuevo "Costo Total". Ne es necesario saber el costo que tenía antes del cambio (para que no te preocupes de encontrar cómo hacer eso). Gracias.

Por eso en el botón, le pongo

Importe=.....

Para que recalcule el importe de la elaboración.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas