Buen día.
Tengo una función a la cual le paso un item y su nuevo precio, la función debe
actualizar
1.- los detalles en donde se encuentra el item.
2.- las cabeceras de los detalles que actualizo en el paso 1.
3.- Actualizar el saldo en la tabla clientes de todos los clientes cuyas
cabeceras se actualizaron en el paso 2.
Aparentemente la función esta bien y debe actualizar las 3 tablas en una sola
ejecución.
Select * From ordenes.precio_actualiza_fnc('147', 86.58);
Pero cuando lo ejecuto por primera vez solo me actualiza la tabla detalles,
ejecuto una segunda vez se actualiza la tabla cabecera, ejecuto una tercera vez
actualiza la tabla clientes.
Las tablas involucradas no tiene trigger, sin resultados esperados cree un
trigger after en cada tabla para grabar los valores de los campos actualizados
en otra tabla.
Reviso los datos de los triggers.
Primera ejecución actualiza la tabla detalle los datos muestran la diferencia
en los datos new y old para esta tabla, para las dos restante los datos siguen
iguales como si el detalle nunca cambio.
tabla orden_detalle numero_orden: 0733 precio Old:6.58000 precio New:86.58000
subtotal Old:6.58 subtotal New:86.58
tabla orden_cabecera numero_orden: 0733 monto pendiente old:308.98 monto
pendiente new:308.98 monto_iva old:37.94 monto_iva new:37.94
tabla clientes codigo: 446 ordenes Old:308.98pedidos New:308.98
Segunda ejecución se ve que los datos para la tabla detalle son iguales, en la
tabla cabecera los datos cambian, pero no para la clientes no cambia siendo que
ese dato depende de las cabeceras.
tabla orden_detalle numero_orden: 0733 precio Old:86.58000 precio New:86.58000
subtotal Old:86.58 subtotal New:86.58
tabla orden_cabecera numero_orden: 0733 monto pendiente old:308.98 monto
pendiente new:400.18 monto_iva old:37.94 monto_iva new:49.14
tabla clientes codigo: 446 orden Old:308.98pedidos New:308.98
Tercera ejecución los datos para los primera tabla son iguales y para la tabla
clientes cambia.
tabla orden_detalle numero_pedido: 0733 precio Old:86.58000 precio
New:86.58000 subtotal Old:86.58 subtotal New:86.58
tabla orden_cabecera numero_pedido: 0733 monto pendiente old:400.18 monto
pendiente new:400.18 monto_iva old:49.14 monto_iva new:49.14
tabla clientes codigo: 446 orden Old:308.98pedidos New:400.18
Estoy trabajado con Postgreslq 9.4.5 64 bits sobre linux
No tengo idea de lo que puede estar pasando, le dejo la funcion a ver si me
ayudan a ver que esta mal
Saludos.
Mauricio
CREATE OR REPLACE FUNCTION ordenes.precio_actualiza_fnc(
IN p_item VARCHAR,
IN p_precio DECIMAL(15, 5)
)
RETURNS void AS
$BODY$
BEGIN
WITH t (numero_orden)
AS
(
UPDATE ordenes.orden_detalle d
Set precio = p_precio
, subtotal = round(d.pendiente * p_precio * .01 * (100 - d.descuento), 2)
Where d.item = p_item
And d.pendiente > 0
And d.estado = ''
RETURNING d.numero_orden
), s (numero_orden, subtotal_iva, iva)
As
(
Select ds.numero_orden, sum(ds.subtotal + round(ds.subtotal * ds.iva_porcentaje
* .01, 2)) As subtotal_iva
, sum(round(ds.subtotal * ds.iva_porcentaje * .01, 2)) iva
From ordenes.orden_detalle ds Inner Join
t On ds.numero_orden = t.numero_orden
Where ds.estado = ''
And ds.pendiente > 0
GROUP BY ds.numero_orden
), u (cliente_id)
As
(
UPDATE ordenes.orden_cabecera c
Set monto_pendiente = s.subtotal_iva
, monto_iva = s.iva
From s
Where c.numero_orden = s.numero_orden
RETURNING c.cliente_id
), v (cliente_id, monto_pendiente)
As
(
Select cv.cliente_id, sum(cv.monto_pendiente) As monto_pendiente
From ordenes.orden_cabecera cv Inner Join
u On cv.cliente_id = u.cliente_id
Where cv.pedido_tipo <> 'B'
And cv.estado = ''
GROUP BY cv.cliente_id
)
Update cta_x_cob.clientes cl
Set ordenes = v.monto_pendiente
From v
Where cl.cliente_id = v.cliente_id;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
-
Enviado a la lista de correo pgsql-es-ayuda ([email protected])
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda