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@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a