Znacznik USLUGA_ANULOWANA

Prosimy o uwagi i sugestie. Każdy może zamieścić swoja uwagi.
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Znacznik USLUGA_ANULOWANA

Post autor: AJP_Kuba »

W aktualizacji jest:

Kod: Zaznacz cały

ALTER TABLE USLUGA ADD USLUGA_ANULOWANA INTEGER;
UPDATE USLUGA SET USLUGA_ANULOWANA = 0 WHERE USLUGA_ANULOWANA IS NULL;
Później w niektórych częściach kodu (widok REC_POBYT_ROZLICZENIE) mamy

Kod: Zaznacz cały

... WHERE USLUGA_ANULOWANA = 0 OR USLUGA_ANULOWANA IS NULL 
. Niby poprawnie, ale trzeba o tym pamiętać przy każdym zapytaniu. Tuż po aktualizacji mamy wszędzie 0 lub 1, jednak już nie wszystkie sposoby dodania usługi wypełniają pole. Czy nie byłoby prościej wykonać

Kod: Zaznacz cały

 ALTER TABLE USLUGA ALTER COLUMN USLUGA_ANULOWANA SET DEFAULT 0;
? Wtedy w kodzie (i raportach) wystarczy

Kod: Zaznacz cały

...WHERE USLUGA_ANULOWANA = 0
, czyli wszędzie odpada test na wartość NULL.
Awatar użytkownika
jevkoo
Administrator
Posty: 482
Rejestracja: 2009-05-17, 19:28
Lokalizacja: Skoczów

Post autor: jevkoo »

Oczywista słuszność. Zaimplementowano.
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Anulowanie rezerwacji

Post autor: AJP_Kuba »

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ę).
ODPOWIEDZ