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