DELIMITER $$ CREATE OR REPLACE DEFINER=`root`@`localhost` FUNCTION `srt`.`buffer_get`(vExpeditionFk INT) RETURNS int(11) NOT DETERMINISTIC READS SQL DATA BEGIN /** * Devuelve el buffer destino para una expedición * * @param vExpeditionFk Identificador de srt.expedition * @return Identificador de srt.buffer */ DECLARE vBufferToFk INT; DECLARE vBufferFromFk INT; DECLARE vBufferGroup INT; DECLARE vBufferStrapping INT; SELECT IFNULL(rm.bufferFk, c.bufferDefault), IFNULL(e.bufferFk,0) INTO vBufferToFk, vBufferFromFk FROM srt.expedition e LEFT JOIN vn.expedition e2 ON e2.id = e.id LEFT JOIN vn.ticket t ON t.id = e2.ticketFk LEFT JOIN vn.routesMonitor rm ON rm.routeFk = t.routeFk JOIN srt.config c WHERE e.id = vExpeditionFk; SELECT `group` INTO vBufferGroup FROM srt.bufferGroup WHERE bufferFk = vBufferToFk; SELECT bg.bufferFk INTO vBufferStrapping FROM srt.bufferGroup bg JOIN srt.buffer b ON b.id = bg.bufferFk JOIN srt.bufferType bt ON bt.id = b.typeFk WHERE bt.typeName = 'STRAPPING' AND bg.`group` = vBufferGroup LIMIT 1; IF vBufferGroup THEN SELECT sub.bufferFk INTO vBufferToFk FROM ( SELECT b.id bufferFk, count(DISTINCT e.id) expeditions, bs.description, bt.typeName, b.motors FROM srt.buffer b JOIN srt.bufferType bt ON bt.id = b.typeFk JOIN srt.bufferState bs ON bs.id = b.stateFk JOIN srt.bufferGroup bg ON bg.bufferFk = b.id LEFT JOIN srt.expedition e ON e.bufferFk = b.id LEFT JOIN srt.moving m ON m.bufferFromFk = b.id WHERE bg.`group` = vBufferGroup AND b.id != vBufferFromFk AND bt.isTarget AND m.id IS NULL GROUP BY b.id) sub JOIN srt.config c ORDER BY (sub.description = 'FREE') DESC, (sub.typeName = ('STRAPPING')) DESC, IF(c.isBalanced , sub.expeditions, -sub.expeditions), ABS(sub.bufferFk - vBufferStrapping) LIMIT 1; END IF; RETURN vBufferToFk; END$$ DELIMITER ;