Files
BE_IBL/sql/manual_changes/2026-05-24-fix-order-location-duplicates.sql
2026-05-24 10:22:09 +07:00

47 lines
1.7 KiB
SQL

-- Make fn_get_location tolerate duplicate active rows and clean existing duplicates.
-- Applied on one_lab.
DROP FUNCTION IF EXISTS fn_get_location;
DELIMITER $$
CREATE FUNCTION fn_get_location(PT_SampleStationID INT, PT_OrderHeaderID INT) RETURNS INT
READS SQL DATA
BEGIN
DECLARE RTN INT DEFAULT 0;
SELECT T_OrderLocationM_LocationID INTO RTN
FROM t_order_location
WHERE T_OrderLocationT_OrderHeaderID = PT_OrderHeaderID
AND T_OrderLocationT_SampleStationID = PT_SampleStationID
AND T_OrderLocationIsActive = 'Y'
ORDER BY T_OrderLocationID DESC
LIMIT 1;
IF RTN = 0 THEN
SELECT M_LocationID INTO RTN
FROM m_location
WHERE M_LocationIsActive = 'Y'
AND M_LocationT_SampleStationID = PT_SampleStationID
AND M_LocationPriority = (
SELECT MAX(M_LocationPriority)
FROM m_location
WHERE M_LocationT_SampleStationID = PT_SampleStationID
AND M_LocationIsActive = 'Y'
)
LIMIT 1;
END IF;
RETURN RTN;
END$$
DELIMITER ;
-- Cleanup duplicate active rows so each order + sample station keeps only the newest active row.
UPDATE t_order_location current_row
JOIN t_order_location newest_row
ON newest_row.T_OrderLocationT_OrderHeaderID = current_row.T_OrderLocationT_OrderHeaderID
AND newest_row.T_OrderLocationT_SampleStationID = current_row.T_OrderLocationT_SampleStationID
AND newest_row.T_OrderLocationIsActive = 'Y'
AND newest_row.T_OrderLocationID > current_row.T_OrderLocationID
SET current_row.T_OrderLocationIsActive = 'N',
current_row.T_OrderLocationLastUpdated = NOW()
WHERE current_row.T_OrderLocationIsActive = 'Y';