¿Cómo recalculo el total en todos los registros?

Tengo dos tablas, tblventa y tblVentaProducto, estas:

En el campo total de tblventa, recojo la Suma(cantidad * Precio) de tblVentaProducto, y la voy introduciendo automáticamente cuando cierro el formulario de entrada de datos. Asta ahí todo bien.

Lo que pasa es que luego tengo la opción de cambiar los Precios en tblVentaProducto pero por lotes. Lo hago mediante esta instrucción:

miSQL = "UPDATE tblVenta INNER JOIN (tblProducto INNER JOIN tblVentaProducto ON tblProducto.IdProducto = tblVentaProducto.Producto) ON tblVenta.IdVenta = tblVentaProducto.Venta SET tblVentaProducto.Precio = [PMedioIva]*(1+" & VALOR & "/100) WHERE (((tblVenta.Estado)=2) AND ((tblVenta.NTicket) Is Null))"

Basándome en eso he intentado hacerlo con esta expresión:

miSQL = "UPDATE tblVenta INNER JOIN tblVentaProducto ON tblVenta.IdVenta = tblVentaProducto.Venta SET tblVenta.Total = Suma([Precio]*[Cantidad]) WHERE (((tblVenta.Estado)=2) AND ((tblVenta.NTicket) Is Null))"

Pero me da el error de que la función suma no está definida en la expresión. ¿Alguien sabe como solucionarlo?

2 Respuestas

Respuesta
2

Si el error solo viene de ahí, porque no he repasado tu SQL, ciertamente has de poner >> Sum en lugar de Suma. Un saludo >> Jacinto

Muchas gracias por ayudarme, creo que algo más tengo mal, lo estoy intentado hacer desde el diseño de consulta, y con esta clausula veo los registros correctamente pero cuando los anexa me da error de infracciones de regla de validación, pero el campo total de tlbventas no tiene ninguna regla de validación.

INSERT INTO tblVenta ( TOTAL )
SELECT Sum(([CANTIDAD]*[PRECIO])) AS TOTAL
FROM tblVenta INNER JOIN tblVentaProducto ON tblVenta.IdVenta = tblVentaProducto.Venta
GROUP BY tblVenta.IdVenta;

¿Alguna idea?

Eloy: Me he despistado un poco con lo del INSERT..., ya que con eso no veo claro tu proceso.

Te comento lo que yo interpreto y me dices si es ese o bién me explicas en breve lo que pretendes hacer. Creo que cabe más el UPDATE que el INSERT, porque parto de que el Campo Total de una Venta ya tiene un valor de Inicio, como citas >> En el campo total de tblventa, recojo la Suma(cantidad * Precio) de tblVentaProducto...

Quieres actualizar el Campo total, cuando se den unas condiciones, que por lo que veo es que no tenga NTicket y que su Estado sea por inventarme algo de ese 2, En proceso de Preparación.

Ya me comentarás. Un saludo >> Jacinto

Gracias Jacinto, si en principio probé con el update pero como siempre me daba algún error probé con el insert pero tampoco.

Si lo que quiero es exactamente lo que dices, pero no consigo dar con la cláusula que lo haga.

Eloy: Personalmente y en éste caso, yo lo haría con una Consulta de datos agrupados y un procedimiento VBA que incluya un Recordset de lectura y otro de escritura. Como de antemano parece que suene un poco extraño, te preparo un ejemplo sencilo y te fcilito el enlace. Si puedo te lo preparo esta noche. Como máximo mañana. Un saludo >> Jacinto

Eloy: El enlace del ejemplo es >>

http://www.mediafire.com/file/p53ad25c59f8k3x/ActualizaIptePedidos.rar 

Un saludo >> Jacinto

¡Gracias! La he adaptado y me ha funcionado perfecto.

Hola Jacinto, perdona por molestarte de nuevo pero me he estado haciendo pruebas y hay un pequeño error.

Tengo este código:

Dim StrSQL As String, QryPrecAct As String
Dim rst As Dao.Recordset, RstPrecAct As Dao.Recordset
StrSQL = "SELECT Venta, Producto, PrecioReal, Precio FROM tblVentaProducto WHERE (((PrecioReal) Is Null))"
Set rst = CurrentDb.OpenRecordset(StrSQL, dbOpenDynaset)
If Not rst.EOF And Not rst.BOF Then
rst.MoveLast
rst.MoveFirst
Do While Not rst.EOF
QryPrecAct = "SELECT Venta, Precio FROM tblVentaProducto WHERE Venta = " & rst!Venta
Set RstPrecAct = CurrentDb.OpenRecordset(QryPrecAct, dbOpenSnapshot)
rst.Edit
rst!PrecioReal = RstPrecAct!Precio
rst.Update
RstPrecAct.Close
Set RstPrecAct = Nothing
rst.MoveNext
Loop
Else
End If
rst.Close
Set rst = Nothing

El caso es que el segundo select, no depende solo del campo "Venta" sino también del campo "Producto". ¿Cómo podría añadirlo a la expresión? he probado algo así pero no me funciona supongo que por la comillas

QryPrecAct = "SELECT Venta, Producto, Precio FROM tblVentaProducto WHERE Venta = " & rst!Venta AND Producto = " & rst!Producto

¿Se podría vincular por los dos campos? Gracias

Eloy: Ahora por cuestiones de tiempo, solo he mirado el final.

QryPrecAct = "SELECT Venta, Producto, Precio FROM tblVentaProducto WHERE Venta = " & rst!Venta AND Producto = " & rst!Producto

la terminación ha de ser >>

...WHERE Venta = " & rst!Venta & " AND " & "Producto = " & rst!Producto

Si el producto fuera texto en lugar de Número >>

...WHERE Venta = " & rst!Venta & " AND " & "Producto = '" & rst!Producto & "'"

Un saludo >> Jacinto

Respuesta
2

Vamos por partes

1º Si vas a actualizar el campo Precio de la tabla VentaProducto ¿Qué pinta la tabla Ventas en esto?

2º Si vas a actualizar el campo Total de la tabla Ventas ¿Qué pinta la tabla VentaProducto en esto?

3º ¿Dónde está el campo PmedioIva?

4º La relación entre las tablas, o mucho me equivoco, o está mal. Lo normal es que en una Venta se vendan varios productos, por tanto la relciñon lógica será de uno a varios.

5º Por el hecho de que una tabla (Ventaproducto) vaya a coger datos de otra tabla (Productos), como puede ser el producto o el precio no quiere decir que tengan que estar relacionadas.

6º Lo normal es que en la tabla VentaProducto haya un campo Subtotal donde se recoja el producto precio por cantidad y en algún evento, por ejemplo, al recibir el enfoque del cuadro de texto Subtotal, aunque yo lo haría en el de Después de actualizar del cuadro de texto Cantidad, puedes poner

Subtotal=precio*cantidad

docmd.runcommand accmdsaverecord

me.parent!total=dsum("subtotal","ventaproducto","idventa=" & me.idventa & "")

Con lo cual, a medida que vayas poniendo productos en el subformulario, en el cuadro de texto Total del formulario te irá poniendo la suma acumulada

Mira, si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] te mando un ejemplo con esas tablas(aunque no sé lo que es eso de Nticket, Estado y facturar) y sobre ella hablamos.

¡Gracias! Lo he solucionado con el ejemplo que me ha dado Jacinto. Es que en la imagen falta otra tabla de productos por eso no se ven esos campos.

El campo NTicket lo uso para los cierres trimestrales para que los registros sean consecutivos.

El campo estado es abierto o cerrado para permitir o no introducir datos

Y el campo facturar es un campo si/no que uso en otro formulario para facturar ventas por lotes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas