Problema en actualización con CTE anidadas

From: mauricio pullabuestan <jmauriciopb(at)yahoo(dot)es>
To: Ayuda Esp PostgreSQL <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Problema en actualización con CTE anidadas
Date: 2017-03-27 21:48:22
Message-ID: 1661943440.8373800.1490651302985@mail.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message RAUL LOPEZ JIMENEZ 2017-03-28 09:57:53 Pg_restore
Previous Message baru gerardi 2017-03-27 17:50:39 Re: Substring y expresiones regulares