Kontynuujemy wątek: zakładam, że wszystkie nasze usługi mają już znacznik w polu USLUGA_ANULOWANA, oraz że jest on zawsze nadawany. Okazało się jednak, że możliwe jest anulowanie rezerwacji tak, że usługi pozostają aktywne (nie wiem w jaki sposób, ale w bazach znajdowałem takie wpisy). Aby temu zapobiec, wprowadzam w bazie zapadkę odpowiedzialną za anulowanie wszystkich usług rezerwacji, gdy rezerwacja jest anulowana (oraz przywrócenie, gdy rezerwacje przywracam). Zapadka nie anuluje usług, jeśli parametr KasujUslugi jest włączony.
Kod: Zaznacz cały
SET TERM ^;
CREATE OR ALTER TRIGGER AJP_FIX_REZERW_ANUL_USL
FOR REZERWACJA
ACTIVE AFTER UPDATE
AS
DECLARE VARIABLE CzyKasujUslugi INT = 0;
BEGIN
/* Jakub Posnik, AJPlus
v. 2017-09-26
Anulowanie i przywracanie uslug dla rezerwacji
*/
IF (OLD.REZERWACJA_AKTYWNA = 1 AND NEW.REZERWACJA_AKTYWNA = 0)
THEN
BEGIN
SELECT CAST(PARAM_WARTOSC AS INT) FROM PARAM WHERE PARAM_NAZWA = 'KasujUslugi' INTO :CzyKasujUslugi;
IF (CzyKasujUslugi = 0)
THEN UPDATE USLUGA U SET U.USLUGA_ANULOWANA = 1 WHERE U.REZERWACJA_ID = NEW.REZERWACJA_ID;
ELSE DELETE FROM USLUGA U WHERE U.REZERWACJA_ID = NEW.REZERWACJA_ID;
END
--przywracanie rezerwacji
IF(OLD.REZERWACJA_AKTYWNA = 0 AND NEW.REZERWACJA_AKTYWNA = 1)
THEN BEGIN
UPDATE USLUGA U SET U.USLUGA_ANULOWANA = 0 WHERE U.REZERWACJA_ID= NEW.REZERWACJA_ID;
END
END^
SET TERM ;^
commit;
Uwaga: Zapadka tylko anuluje i przywraca usługi. Jeśli np. używasz magazynu, masz parametr UslugiRecepcjiZmianiajaStan =1 i dodasz do rezerwacji jako usługę towar zmieniający stan, to stan magazynowy się zmniejszy, ale po anulowaniu rezerwacji stan magazynowy NIE zostanie zmieniony (powiększony o anulowaną usługę).