52 lines
1.6 KiB
SQL
52 lines
1.6 KiB
SQL
DELIMITER $$
|
|
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vAvailabled DATETIME)
|
|
BEGIN
|
|
/**
|
|
* Calcula el valor mínimo acumulado para cada artículo por almacén.
|
|
*
|
|
* @param vAvailabled Starting time for calculation
|
|
* @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
|
|
* @return tmp.itemAtp(itemFk, warehouseFk, quantity)
|
|
*/
|
|
CREATE OR REPLACE TEMPORARY TABLE tItemOrdered
|
|
(UNIQUE(itemFk, warehouseFk, dated))
|
|
ENGINE = MEMORY
|
|
SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity
|
|
FROM (
|
|
SELECT itemFk, warehouseFk, dated, quantity
|
|
FROM tmp.itemCalc
|
|
UNION ALL
|
|
SELECT itemFk, warehouseFk, vAvailabled, 0
|
|
FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
|
|
) t1
|
|
GROUP BY itemFk, warehouseFk, dated
|
|
ORDER BY itemFk, warehouseFk, dated;
|
|
|
|
SET @lastItemFk := 0;
|
|
SET @lastWareHouseFk := 0;
|
|
SET @lastQuantity := 0;
|
|
|
|
CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
|
|
(PRIMARY KEY (itemFk, wareHouseFk))
|
|
SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
|
|
FROM (
|
|
SELECT
|
|
itemFk,
|
|
IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk,
|
|
@lastQuantity := quantity,
|
|
@lastQuantity := @lastQuantity + quantity) quantityAccumulated,
|
|
wareHouseFk,
|
|
@lastItemFk := itemFk,
|
|
@lastWareHouseFk := wareHouseFk
|
|
FROM tItemOrdered
|
|
)sub
|
|
GROUP BY itemFk, wareHouseFk;
|
|
|
|
INSERT IGNORE INTO tmp.itemAtp(itemFk, warehouseFk, quantity)
|
|
SELECT DISTINCT ic.itemFk, ic.warehouseFk, 0
|
|
FROM tmp.itemCalc ic;
|
|
|
|
DROP TEMPORARY TABLE tItemOrdered;
|
|
END$$
|
|
DELIMITER ;
|