DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getMinacum`(IN vWarehouseFk TINYINT, IN vDatedFrom DATETIME, IN vRange INT, IN vItemFk INT) BEGIN /** * Cálculo del mínimo acumulado, para un item/almacén especificado, en caso de * NULL para todo. * * @param vWarehouseFk -> warehouseFk * @param vDatedFrom -> fecha inicio * @param vRange -> número de días a considerar * @param vItemFk -> Identificador de item * @return tmp.itemMinacum */ DECLARE vDatedTo DATETIME; SET vDatedFrom = TIMESTAMP(DATE(vDatedFrom), '00:00:00'); SET vDatedTo = TIMESTAMP(TIMESTAMPADD(DAY, vRange, vDatedFrom), '23:59:59'); DROP TEMPORARY TABLE IF EXISTS tmp.itemCalc; CREATE TEMPORARY TABLE tmp.itemCalc (INDEX (itemFk, warehouseFk)) SELECT sub.itemFk, sub.dated, CAST(SUM(sub.quantity) AS SIGNED) quantity, sub.warehouseFk FROM (SELECT s.itemFk, DATE(t.shipped) dated, -s.quantity quantity, t.warehouseFk FROM sale s JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped BETWEEN vDatedFrom AND vDatedTo AND s.quantity != 0 AND (vItemFk IS NULL OR s.itemFk = vItemFk) AND (vWarehouseFk IS NULL OR t.warehouseFk = vWarehouseFk) UNION ALL SELECT b.itemFk, t.landed, b.quantity, t.warehouseInFk FROM buy b JOIN entry e ON e.id = b.entryFk LEFT JOIN travel t ON t.id = e.travelFk WHERE t.landed BETWEEN vDatedFrom AND vDatedTo AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) AND !e.isExcludedFromAvailable AND b.quantity != 0 AND (vItemFk IS NULL OR b.itemFk = vItemFk) UNION ALL SELECT b.itemFk, t.shipped, -b.quantity, t.warehouseOutFk FROM buy b JOIN entry e ON e.id = b.entryFk LEFT JOIN travel t ON t.id = e.travelFk WHERE t.shipped BETWEEN vDatedFrom AND vDatedTo AND (vWarehouseFk IS NULL OR t.warehouseOutFk = vWarehouseFk) AND !e.isExcludedFromAvailable AND b.quantity != 0 AND (vItemFk IS NULL OR b.itemFk = vItemFk) AND !e.isRaid ) sub GROUP BY sub.itemFk, sub.warehouseFk, sub.dated; CALL item_getAtp(vDatedFrom); DROP TEMPORARY TABLE tmp.itemCalc; DROP TEMPORARY TABLE IF EXISTS tmp.itemMinacum; CREATE TEMPORARY TABLE tmp.itemMinacum (INDEX(itemFk)) ENGINE = MEMORY SELECT i.itemFk, i.warehouseFk, i.quantity amount FROM tmp.itemAtp i HAVING amount != 0; END$$ DELIMITER ;