Trigger - magazyn na korekcie

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

Moderator: mikey

dominiss1990
Posty: 10
Rejestracja: 19 cze 2020, 13:49
Rola: Administrator CDN XL
Wersja: 2019

Trigger - magazyn na korekcie

Post autor: dominiss1990 »

Potrzebuję małej pomocy w triggerze. Słowem wstępu - każdy oddział posiada dwa magazyny - zwykły (towary własnościowe) i depozytowy (towary w depozycie). Każdy magazyn depozytowy kończy się literą "D".

Trigger ma blokować możliwość zmiany magazynu na korekcie faktury/paragonu na magazyn depozytowy.
Trigger mam zrobiony i w zasadzie działa poprawnie, jednak na korekcie w miejscu "Magazyn docelowy" można wybrać magazyn <Oryginalny> - i problem się pojawia w przypadku gdy towar był sprzedany z magazynu depozytowego, po wyborze <Oryginalny> towar wraca na magazyn depozytowy i trigger tego nie blokuje.

Macie pomysł jak "uchwycić" ten wyjątek, aby również był blokowany?


Trigger:

Kod: Zaznacz cały

ALTER TRIGGER [CDN].[BlokadaKorektNaDepozyt]
   ON  [CDN].[TraNag]
   FOR UPDATE AS

BEGIN
IF EXISTS(
       SELECT 1 FROM inserted ins INNER JOIN deleted del ON ins.TrN_GIDNumer=del.TrN_GIDNumer AND ins.TrN_Stan>2 AND del.TrN_Stan<3 AND (ins.TrN_GIDTyp=2041 or ins.TrN_GIDTyp=2042) --MMW, MMP
       INNER JOIN CDN.Magazyny mag on ins.TrN_MagDNumer=mag.MAG_GIDNumer
       WHERE ((SUBSTRING(mag.MAG_Kod,len(mag.MAG_Kod),1)='D' ) OR mag.MAG_Kod='MAG')
		AND (mag.MAG_Kod<>'MGD'))
BEGIN
       RAISERROR('#CDN_BLAD/# #CDN_1=Korekty można dokonywać tylko na magazyny niedepozytowe. Wybierz prawidłowy magazyn docelowy. /# #CDN_3=Wybierz prawidłowy magazyn docelowy./#',16,1)
END
END

Awatar użytkownika
praiser
Posty: 1091
Rejestracja: 02 lip 2014, 12:22
Rola: Handlowiec CDN XL
Wersja: 2023

Re: Trigger - magazyn na korekcie

Post autor: praiser »

Podepnij subelementy transakcji żeby sprawdzić źródło magazynu a wybrany z ręki magazyn jako left join i powinno zagrać.

Kod: Zaznacz cały

IF EXISTS(
       SELECT 1 FROM inserted ins INNER JOIN deleted del ON ins.TrN_GIDNumer=del.TrN_GIDNumer AND ins.TrN_Stan>2 AND del.TrN_Stan<3 AND (ins.TrN_GIDTyp=2041 or ins.TrN_GIDTyp=2042) --MMW, MMP
	   join CDN.TrasElem elems on ins.TrN_GIDTyp=elems.TrS_GIDTyp AND ins.TrN_GIDNumer=elems.TrS_GIDNumer
       LEFT JOIN CDN.Magazyny mag on ins.TrN_MagDNumer=mag.MAG_GIDNumer
       WHERE 
	   (
			(SUBSTRING(mag.MAG_Kod,len(mag.MAG_Kod),1)='D' )
			OR mag.MAG_Kod='MAG'
			OR elems.TrS_MagNumer IN (select mag_check.Mag_GidNumer from CDN.Magazyny mag_check where (SUBSTRING(mag_check.MAG_Kod,len(mag_check.MAG_Kod),1)='D' ))
	   )
			AND (mag.MAG_Kod<>'MGD')
	)
--------------------------------
Pozdrawiam
WW

ODPOWIEDZ