blokada otwierania zamówień nie ze swojego centrum

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

blokada otwierania zamówień nie ze swojego centrum

Post autor: Dorota »

Próbuję stworzyć triggera który zablokuje mi możliwość otwierania zamówień w przypadku kiedy centrum zalogowanego operatora próbującego otworzyć dokument jest różne od właściciela zamówienia (zakładka nagłówek, pole "właściciel"). Trigger nie działa tak jak powinien. Obecnie wygląda to tak:

Kod: Zaznacz cały

SET NOCOUNT ON
IF UPDATE(ZaN_Stan)
BEGIN
	 IF EXISTS (SELECT * FROM inserted
		WHERE inserted.ZaN_Stan=2 and zan_frsid<>(SELECT SES_FRSID FROM inserted INNER JOIN CDN.Sesje ON SeS_SesjaId =zan_aktywny ))
				BEGIN
					RAISERROR('#CDN_BLAD/# #CDN_1=Zamówienie pochodzi z innego oddziału. Nie możesz otwierać zamówień z innych oddziałów!!!/#'
                               , 16, 1)
          		ROLLBACK TRAN
          		SET NOCOUNT ON
	RETURN
        END
END
 
Podejrzewam że problem jest gdzieś w sesji. Ktoś wie jak to poprawić żeby działało?

W ostateczności zastosuję rozwiązanie zastępcze: przyrównanie FRSID operatora modyfikującego zamówienie (centrum domyślne operatora) do FRSID właściciela zamówienia no ale będzie to działało troche koślawo w przypadkach kiedy mam operatora przypiętego do kilku centrów

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: blokada otwierania zamówień nie ze swojego centrum

Post autor: elmiq »

Hej, kilka uwag:

- trigger obecnie działa dla wszystkich obiektów w Zamnag (ZS,ZS,ZW,OS,OZ itp.)
- powinnaś sprawdzać tabelę deleted w ramach upewnienia się, że poprzedni stan jest > 2 (jeśli trigger ma działać dla ZS to raczej nie będzie to konieczne, ale w niczym nie zaszkodzi)
- nie ma potrzeby tworzenia podzapytania w ten sposób:

Kod: Zaznacz cały

IF EXISTS (SELECT * FROM inserted
		WHERE inserted.ZaN_Stan=2 and zan_frsid<>(SELECT SES_FRSID FROM inserted INNER JOIN CDN.Sesje ON SeS_SesjaId =zan_aktywny ))
prościej po prostu zrobić

Kod: Zaznacz cały

SELECT * 
		FROM inserted
		INNER JOIN CDN.Sesje ON SeS_SesjaId =zan_aktywny
		WHERE inserted.ZaN_Stan=2 
		and zan_frsid<> SES_FRSID
		and Zan_Aktywny <> 0
Co więcej, coś takiego jest poprawne nawet w sytuacji jakiegoś BULK-a, czyli w momencie gdy w tabeli inserted znajdzie się więcej niż jeden rekord, a kto wie kto jaki update kiedyś na tej tabeli wykona.

- być może warto korzystać z @@SPID i po tym robić wiązanie do CDN.Sesje (wymaga to przerobienia zapytań). Da Ci to pewność, że Zan_Aktywny nie jest/nie będzie zwalniany PRZED aktualizacją ZaN_Stan. Często operacje na nagłówku nie są uzupełniane jednym update, a kto wie jak to będzie działać w wersji X.Y.

-SET NOCOUNT ON po ROLLBACK TRAN jest zbędny. Zakładam, że chodziło o opcję OFF, ale i tak dodaj ją jeszcze tak, aby zawsze działała, a nie tylko w przypadku gdy warunek jest spełniony.

Ale się rozpisałem, za długo jadłem kanapkę chyba, czas wracać do pracy :)

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

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

Re: blokada otwierania zamówień nie ze swojego centrum

Post autor: Dorota »

Dziękuję za wyczerpującą odpowiedź :)

Trochę poszalałam z tą składnią. Dało się faktycznie prościej ;)

Tylko główny problem pozostał, trigger i tak nie działa. Wydaje mi się że problem może być w tym że podczas otwierania zamówienia nie uzupełnia się ID sesji w polu Zan_aktywny.

a przy rozwiązaniu zastępczym myślałam o czymś takim:

Kod: Zaznacz cały

 SELECT * FROM inserted INNER JOIN CDN.Opekarty ON Ope_gidnumer =ZaN_OpeNumerMod 
		WHERE inserted.ZaN_Stan=2 and zan_frsid<>ope_FRSID 

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: blokada otwierania zamówień nie ze swojego centrum

Post autor: elmiq »

Spróbuj tak:

Kod: Zaznacz cały


ALTER TRIGGER CDN._TEST_ZS ON CDN.Zamnag 
FOR UPDATE
AS 
BEGIN
SET NOCOUNT ON

IF UPDATE(ZaN_Stan)
BEGIN
	 IF(
	 EXISTS (SELECT * FROM inserted i
		INNER JOIN deleted d ON i.ZaN_GIDNumer = d.ZaN_GIDNumer
		INNER JOIN CDN.Sesje ON SES_Aktywna = 0 AND SES_SesjaID = CDN.PolaczenieInfo(3)
		WHERE 
		i.ZaN_ZamTyp=1280 
		AND i.ZaN_Rodzaj =4
		AND i.ZaN_Stan=2 
		AND d.ZaN_Stan > 2
		AND i.ZaN_FrSID <> SES_FrsID
		)
		AND 
		(SELECT COUNT(1) FROM inserted) = 1
	)
	BEGIN
			RAISERROR('#CDN_BLAD/# #CDN_1=Zamówienie pochodzi z innego oddziału. Nie możesz otwierać zamówień z innych oddziałów!!!/#', 16, 1)
          	ROLLBACK TRAN
          	SET NOCOUNT OFF
		RETURN
	END
END
SET NOCOUNT OFF


END
Mateusz Świerkosz

http://elmiq.blogspot.com/

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

Re: blokada otwierania zamówień nie ze swojego centrum

Post autor: Dorota »

Działa :) jesteś niesamowity ! Przyznam, że nie wiedziałam o istnieniu funkcji CDN.PolaczenieInfo

ODPOWIEDZ