Tal cual como propones en el post #14.
Saludos.
Posted 01 June 2017 - 08:19 AM
Saludos.
Gracias enecumene por el feedback. Solo por curiosidad para que otros puedan aprovecharse de esta situación, ¿Cómo quedó el código del SP?
Perdón Rolphy, pero de todos modos, aunque no me marca error, nos hemos dado cuenta de que no está descontando o sumando, estuve viendo sobre MERGE, no sé qué tan efectivo es:
MERGE INTO stock USING buy ON stock.item_id = buy.item_id WHEN MATCHED THEN UPDATE SET balance = balance + buy.volume WHEN NOT MATCHED THEN INSERT VALUES (buy.item_id, buy.volume);
¿Hay alguna otra forma?
Posted 01 June 2017 - 08:33 AM
Por si las moscas, el SP quedó así:
CREATE OR ALTER PROCEDURE ACTUALIZA_STOCK ( SALIDA INTEGER, TIPO VARCHAR(3)) AS DECLARE variable ID_INSUMO INTEGER; DECLARE variable CANTIDAD FLOAT; BEGIN FOR SELECT sad.ins_cantidad, ins.ins_id FROM insumos ins JOIN salidas_almacen_detalles sad ON ins.ins_id = sad.is_id WHERE sad.sal_id = :salida FOR UPDATE INTO :cantidad, :id_insumo do BEGIN IF (:tipo = 'in') THEN UPDATE insumos SET ins_existencia = ins_existencia + :cantidad WHERE ins_id = :id_insumo; IF (:tipo = 'out') THEN UPDATE insumos SET ins_existencia = ins_existencia - :cantidad WHERE ins_id = :id_insumo; /*suspend;*/ END END
Posted 01 June 2017 - 10:25 AM
Me acabo de dar cuenta que me he equivocado en la forma en que he estructurado el inventario, lo he hecho con la mentalidad de un sistema monousuario, que en la tabla de productos tenemos un campo que muestra la cantidad en existencia y se actualiza directamente, por eso el deadlock, en realidad lo que debí hacer ó debería de hacer era una tabla aparte con el id del producto, cantidad y tipo de saldo, algo así:
ID cant tipo
1 11 salida
2 2 devolucion
50 9 salida
345 500 Entrada
ahi se va insertando todos los movimientos (me Faltó poner la fecha así poder hacer cortes), así separamos lo que es consulta y actualizaciones, porque siempre será un insert.
Ya tengo suficiente trabajo que hacer.
Saludos.