Trigger na rezerwacjach

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Dorota
Posty: 70
Rejestracja: 12 maja 2010, 12:17
Rola: Administrator CDN XL

Trigger na rezerwacjach

Post autor: Dorota »

Witam wszystkich serdecznie,

potrzebuję faktyczną datę aktualizacji/aktywacji rezerwacji a że nie znalazłam pola w bazie które za to odpowiada to utworzyłam sobie tabele dodatkową która uzupełniana jest triggerem i zapisuje fatyczną datę aktualizacji rezerwacji. Trigger ładujący dane do tabeli wygląda tak:

Kod: Zaznacz cały

 
 create TRIGGER [CDN].[DFO_RezDataWazn] ON [CDN].[Rezerwacje]
FOR INSERT, UPDATE
AS
BEGIN

	-- Rejestracja zmian daty ważności rezerwacji

	INSERT INTO cdn.DFOrezerwacje (Reztyp,RezNumer,TwrNumer,ZamNr,ZamLp,IloscRez,DataAktywacji, BeforeDataWaz,AfterDataWaz,UpdateDataWaz)
	select R1.Rez_Gidtyp, R1.Rez_Gidnumer, R1.Rez_TwrNumer, R1.Rez_Zrdnumer, R1.Rez_ZrdLp, R1.Rez_Ilosc, R1.Rez_DataAktywacji, R2.Rez_DataWaznosci, R1.Rez_DataWaznosci,
	GetDAte() from inserted R1 
	inner join deleted R2 on R1.Rez_Gidtyp=R2.Rez_GidTyp and R1.Rez_Gidnumer=R2.Rez_Gidnumer and 
	R1.Rez_Gidlp=R2.Rez_Gidlp 
	where 
	R1.Rez_gidTYp=2576
 
Wszystko działa bardzo ładnie wtedy kiedy mam jedną rezerwację pod elementem zamówienia. Kiedy mamy więcej pozycji rezerwacji to do mojej tabeli dodatkowej są ładowane wyłącznie dane dotyczące pierwszej pozycji, przykład w załączniku. Od razu zaznaczam że w przypadku kiedy mamy podpięte 2 różne dostawy działa to dokładnie tak samo.
Nie zadowalają mnie pola gotowe rez_datarezerwacji, Rez_TStamp na tabeli cdn.rezerwacje ponieważ one pokazują pierwotną datę założenia rezerwacji a mnie chodzi również o wyłapanie daty kiedy rezerwacja została zaktualizowana
Co robię źle i jak to naprawić?
Załączniki
2021-12-21_11h27_56.png
2021-12-21_11h27_56.png (50.34 KiB) Przejrzano 1808 razy
Ostatnio zmieniony 21 gru 2021, 20:11 przez Dorota, łącznie zmieniany 2 razy.

CDNP_KMK
Posty: 49
Rejestracja: 15 maja 2018, 11:56
Rola: Konsultant CDN XL
Wersja: 2023
Lokalizacja: CDNP Wrocław
Kontakt:

Re: Trigger na rezerwacjach

Post autor: CDNP_KMK »

Przy insercie tabela deleted jest pusta, więc inner join do deleted nie zadziała, a trigger nic nie zainsertuje.
Poszukuję konsultantów, administratorów, użytkowników ERP XL do pracy. Zachęcam do kontaktu!

CDNPartners sp. z o.o. z siedzibą we Wrocławiu - Partner Roku 2017, 2018, 2019, 2022

Kazimierz Michał Karaszewski - kierownik działu ERP XL

Dorota
Posty: 70
Rejestracja: 12 maja 2010, 12:17
Rola: Administrator CDN XL

Re: Trigger na rezerwacjach

Post autor: Dorota »

Trigger insertuje ale tylko pierwszą pozycje. W przypadku kiedy zatwierdzasz zamowienie (u mnie nastepuje wtedy rezerwacja towaru) i pod elementem zamówienia masz tylko jedna rezerwacje to dane w tabeli dodatkowej są zapisywane. Co ciekawe jak zmienisz datę realizacji zamowienia na zakładce ogólne to insertuje już wszystko (pierwszą i drugą pozycję).

CDNP_KMK
Posty: 49
Rejestracja: 15 maja 2018, 11:56
Rola: Konsultant CDN XL
Wersja: 2023
Lokalizacja: CDNP Wrocław
Kontakt:

Re: Trigger na rezerwacjach

Post autor: CDNP_KMK »

Nie ma w tym nic nadzwyczajnego jeżeli zamówienie tworzy rezerwacje już na etapie niepotwierdzonego - o ile dobrze interpretuję ten kod. Pierwsza pozycja jest insertowana (i nie wpada do tabeli), potem następuje rezerwacja więc zostaje zrobiony update (wpada do tabeli dodatkowej), a druga rezerwowana dostawa jest od razu zainsertowana z parametrami (bez update), wiec nie wpada do tabeli.

Link do przeczytania: https://stackoverflow.com/questions/741 ... -or-update
Poszukuję konsultantów, administratorów, użytkowników ERP XL do pracy. Zachęcam do kontaktu!

CDNPartners sp. z o.o. z siedzibą we Wrocławiu - Partner Roku 2017, 2018, 2019, 2022

Kazimierz Michał Karaszewski - kierownik działu ERP XL

Dorota
Posty: 70
Rejestracja: 12 maja 2010, 12:17
Rola: Administrator CDN XL

Re: Trigger na rezerwacjach

Post autor: Dorota »

CDNP_KMK pisze:
21 gru 2021, 12:49
Nie ma w tym nic nadzwyczajnego jeżeli zamówienie tworzy rezerwacje już na etapie niepotwierdzonego - o ile dobrze interpretuję ten kod. Pierwsza pozycja jest insertowana (i nie wpada do tabeli), potem następuje rezerwacja więc zostaje zrobiony update (wpada do tabeli dodatkowej), a druga rezerwowana dostawa jest od razu zainsertowana z parametrami (bez update), wiec nie wpada do tabeli.

Link do przeczytania: https://stackoverflow.com/questions/741 ... -or-update
W moim kodzie nie ma informacji że rezerwacje są robione na etapie niepotwierdzonego ZS.
W programie jest wręcz przeciwnie bo jest skonfigurowany tak że rezerwuje dopiero na etapie potwierdzania ZS a pomimo tego insert do mojej tabeli dodatkowej działa ale w taki sposób jak napisałam.
Podejrzewam że w kodzie CDNXL może być tak że dla niektórych rezerwacji program robi sam insert (bez updatu) a dla innych insert+update (i wtedy dane są ładowane do mojej tabeli dodatkowej).

...czyli faktycznie przyczyna może leżeć w joinie: inserted deleted
Ostatnio zmieniony 21 gru 2021, 20:12 przez Dorota, łącznie zmieniany 1 raz.

Dorota
Posty: 70
Rejestracja: 12 maja 2010, 12:17
Rola: Administrator CDN XL

Re: Trigger na rezerwacjach

Post autor: Dorota »

Link do przeczytania: https://stackoverflow.com/questions/741 ... -or-update
To mi bardzo pomogło rozwiązać problem. Zrobiłam osobny insert dla "IF EXISTS(SELECT * FROM DELETED)" i osobny dla " IF not EXISTS(SELECT * FROM DELETED)" wygląda na to że wszystko działa. Dziękuję za wskazówkę ;)

marceynowa
Posty: 341
Rejestracja: 29 lut 2008, 11:27
Rola: Administrator CDN XL
Wersja: 2022
Lokalizacja: Gdynia

Re: Trigger na rezerwacjach

Post autor: marceynowa »

Zapis w tabeli cdn.Rezerwacje odbywa się w ten sposób, przy potwierdzaniu ZS jest insertowany jeden rekord, jedna rezerwacja dla całej ilości pozycji zamówienia, bez rezerwacji zasobów, a potem, jeżeli zostało zaznaczone na ZS, jest robiona rezerwacja zasobowa - gdy jeden zasób: w cdn.Rezerwacje jest robiony UPDATE, a gdy więcej zasobów (np. 2 jak w przykładzie) - dla pierwszego jest UPDATE, dla reszty INSERT.

Trigger z joinem do deleted działa tylko przy UPDATE, zatem pierwszy wiersz jest zapisywany nie przy INSERT, lecz przy tworzeniu rezerwacji zasobowej (UPDATE). Pozostałe mają tylki INSERT, więc nie są zapisywane.
Zapis przy zmianach dat działa, gdyż wtedy na wszystkich wierszach jest UPDATE.

W kodzie join winien być typu LEFT JOIN, wtedy zapisywane będą i INSERTY i UPDATE'y. Dla INSERT dane Before będa puste, gdyż przy wstawianiu nie ma poprzednich wartosci.

ODPOWIEDZ