DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`buy_getUltimate`( vItemFk INT, vWarehouseFk SMALLINT, vDated DATE ) BEGIN /** * Calcula las últimas compras realizadas hasta una fecha. * * @param vItemFk Id del artículo * @param vWarehouseFk Id del almacén * @param vDated Compras hasta fecha * @return tmp.buyUltimate */ CALL cache.last_buy_refresh(FALSE); CREATE OR REPLACE TEMPORARY TABLE tmp.buyUltimate (PRIMARY KEY (itemFk, warehouseFk), INDEX(itemFk)) ENGINE = MEMORY SELECT item_id itemFk, buy_id buyFk, warehouse_id warehouseFk, landing FROM cache.last_buy WHERE (warehouse_id = vWarehouseFk OR vWarehouseFk IS NULL) AND (item_id = vItemFk OR vItemFk IS NULL); IF vDated >= util.VN_CURDATE() THEN CALL buy_getUltimateFromInterval(vItemFk, vWarehouseFk, util.VN_CURDATE(), vDated); REPLACE INTO tmp.buyUltimate SELECT itemFk, buyFk, warehouseFk, landed landing FROM tmp.buyUltimateFromInterval WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) AND (itemFk = vItemFk OR vItemFk IS NULL) AND landed <= vDated AND NOT isIgnored; INSERT IGNORE INTO tmp.buyUltimate SELECT itemFk, buyFk, warehouseFk, landed landing FROM tmp.buyUltimateFromInterval WHERE (warehouseFk = vWarehouseFk OR vWarehouseFk IS NULL) AND (itemFk = vItemFk OR vItemFk IS NULL) AND landed > vDated ORDER BY isIgnored = FALSE DESC; END IF; END$$ DELIMITER ;