Trigger na CDN.Zamnag

Problemy i pomysły związane z funkcjonowaniem modułu Sprzedaż

Moderator: mikey

m_pk
Posty: 47
Rejestracja: 20 wrz 2017, 13:39
Rola: Inny
Lokalizacja: ZST
Kontakt:

Trigger na CDN.Zamnag

Post autor: m_pk »

Witam,

Wróce do tematu.
Mam na bazie zrobiony trigger, który blokuję możliwość usunięcia zamówienia w buforze. Chciałbym go przebudować, abym ja mógł go usuwać.

Trigger wygląda tak:

Kod: Zaznacz cały

use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
	 ON [CDN].[ZamNag]   
	 INSTEAD OF DELETE
	 AS
	 RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
	 ROLLBACK TRANSACTION
	 END
Chciałem zrobić modyfikację, aby usuwający o identyfikatorze 'M_PK' miał prawo do usunięcia zamówienia.

Kod: Zaznacz cały

use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
	 ON [CDN].[ZamNag]   
	 INSTEAD OF DELETE
	 AS
	 BEGIN
	 IF EXISTS (
	 SELECT * from deleted as d
	 inner join cdn.sesje as s ON s.ses_sesjaid = d.ZaN_Aktywny
	 where s.ses_opeident <> 'M_PK'
	 )
	 RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
	 ROLLBACK TRANSACTION
	 END
No i niestety nic z tego. Nie wiem już co robię źle. Może mi ktoś pomóc?

Pzdr.
PK

Awatar użytkownika
viesiek1
Posty: 425
Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Trigger na CDN.Zamnag

Post autor: viesiek1 »

Ja to robię tak:

Kod: Zaznacz cały

AND inserted.ZaN_OpeNumerMod <> 77 -- GIDNumer operatora
Wiesław Świergała

tel: +48 33 829 54 50
e-mail: wieslaw.swiergala@hydro.com.pl

http://www.hydro.com.pl

m_pk
Posty: 47
Rejestracja: 20 wrz 2017, 13:39
Rola: Inny
Lokalizacja: ZST
Kontakt:

Re: Trigger na CDN.Zamnag

Post autor: m_pk »

Witam,

Zrobiłęm jak poniżej i też nie działa. Trigger blokuje dla wszystkich userów.

Kod: Zaznacz cały

use baza_erpxl
go
ALTER TRIGGER [CDN].[ZamNag_Delete]
	 ON [CDN].[ZamNag]   
	 INSTEAD OF DELETE
	 AS
	 BEGIN
	 IF EXISTS (
	 select * from deleted where zan_openumermod <> 707 -- GIDNumer usera M_PK
	 )
	 RAISERROR('#CDN_INFO/# #CDN_1=Zamówienia nie można usunąć. Prawidłowy sposób: potwierdź a następnie anuluj. /# #CDN_2=Wywołany został wyzwalacz na tabeli CDN.ZamNag uniemożliwiający usuwanie zamówień. Pytania proszę kierować na pomoc@prefix.pl /#',16,1);
	 ROLLBACK TRANSACTION
	 END

Misek
Posty: 40
Rejestracja: 09 wrz 2014, 08:39
Rola: Administrator CDN XL
Wersja: 2016
Lokalizacja: Wrocław

Re: Trigger na CDN.Zamnag

Post autor: Misek »

A sprawdź kto w takim zamówieniu jest Operatorem mdyfikującym?
Select zan_openumermod from cdn.zamnag where zan_gidnumer = ....
Na bank zan_openumermod <> 707

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

Re: Trigger na CDN.Zamnag

Post autor: elmiq »

Wiesz jak działają triggery Instead of, czy tak po prostu sobie taki wybrałeś? Przy operacji Delete, dane są tylko w tabeli deleted dla DML triggerów, więc jesteś pewien, że jest tam operator, który w danym momencie usuwa zamówienie?

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

m_pk
Posty: 47
Rejestracja: 20 wrz 2017, 13:39
Rola: Inny
Lokalizacja: ZST
Kontakt:

Re: Trigger na CDN.Zamnag

Post autor: m_pk »

Witam,

Wiem jak działają. To może inaczej, bo wiem gdzie robię błąd.
Chcę uzyskąć taki efekt, aby ope_ident = 'M_PK' mógł usuwać zamówienia, a pozostali nie mogli.
Jest to możliwe?

Pzdr.
PK

Awatar użytkownika
viesiek1
Posty: 425
Rejestracja: 03 maja 2011, 18:40
Rola: Administrator CDN XL
Wersja: 2023
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Trigger na CDN.Zamnag

Post autor: viesiek1 »

Mam napisany tylko trigger na UPDATE, który działa na 100%. Na DELETE nie mam. Poniżej cały kod - tak żeby było wiadomo co ten trigger robi i dlaczego. Może napiszesz sobie coś na wzór...

Kod: Zaznacz cały

ALTER  TRIGGER [CDN].[BlokadaZamknieciaZS] ON [CDN].[ZamNag] 
FOR UPDATE
AS
SET NOCOUNT ON
DECLARE @OpeMod INT, @OpePotw Int

SELECT @OpePotw = ZaN_OpeNumerP FROM deleted
SELECT @OpeMod  = ZaN_OpeNumerMod FROM inserted

IF 
    @OpePotw <> @OpeMod AND
    @OpeMod <> 77 AND -- ABC
    @OpeMod <> 38 AND -- XYZ
AND EXISTS
(
	SELECT * FROM inserted
	INNER JOIN deleted ON (inserted.ZaN_GIDNumer = deleted.ZaN_GIDNumer AND inserted.ZaN_GIDTyp = deleted.ZaN_GIDTyp)
	WHERE (inserted.ZaN_ZamTyp IN (1280) AND inserted.ZaN_Rodzaj IN (4)) 
	     AND
	     (
                 (inserted.ZaN_Stan = 53 AND deleted.ZaN_Stan = 5) OR
                 (inserted.ZaN_Stan = 51 AND deleted.ZaN_Stan = 3)
             )
	     AND
	     ( 
                inserted.ZaN_FrSID = 9  OR  -- X
                inserted.ZaN_FrSID = 12 OR  -- Y
	     )	          
)
BEGIN
	RAISERROR('#CDN_BLAD/# #CDN_1=Nie możesz zamknać ZS-a, który nie jest potwierdzony przez ciebie/# #CDN_2=/# #CDN_3=/#', 16, 1)
	ROLLBACK TRAN
END

SET NOCOUNT OFF
Wiesław Świergała

tel: +48 33 829 54 50
e-mail: wieslaw.swiergala@hydro.com.pl

http://www.hydro.com.pl

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

Re: Trigger na CDN.Zamnag

Post autor: elmiq »

Trigger Wieśka nie zadziała w twoim przypadku, ponieważ w momencie usuwania rekordu, nie ma wypełnionej tabeli inserted z informacją o użytkowniku, który dokonuje zmian (bo nie są to zmiany, tylko usunięcie rekordu). To co możesz zrobić, to spiąć tabelę deleted z tabelą CDN.Sesje i na tej podstawie identyfikować operatora, który usuwa rekord. Ewentualnie skorzystać z @@SPID, co również pozwoli na taką identyfikacje usera(z tym, że w tym przypadku nie jest to niezbędne, ponieważ masz pole Zan_Aktywny i pierwszy sposób będzie prostszy w implementacji).

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

se_bek
Posty: 20
Rejestracja: 10 maja 2010, 10:31
Rola: Konsultant CDN XL

Re: Trigger na CDN.Zamnag

Post autor: se_bek »

Możesz spróbować skorzystać z funkcji cdn.PolaczenieInfo()

Krótki opis (można znaleźć w necie)

Kod: Zaznacz cały

CREATE TRIGGER CDN.TraNag_PrzykladFunkcjiPolaczenieInfo  
ON [CDN].[TraNag]  FOR UPDATE
AS
SET
NOCOUNTON
--
"Blokada zmiany daty wystawienia WZ/FS na wcześniej szą niż bieżący miesiąc"  
IF UPDATE (rN_Data2)
	BEGIN
		IF EXISTS(SELECT * FROM inserted WHERE inserted.TrN_GIDTyp IN (2001,2033) AND MONTH(DATEADD(d,CAST(TrN_Data2 AS DECIMAL),'18001228'))<MONTH(GetDate())
--Wykluczeni operatorzy z działania triggera
		AND CDN.PlaczenieInfo(4) NOT IN ('ADMIN'))
		BEGIN
			RAISERROR('#CDN_BLADK/# #CDN_1=Data wystawienia z poprzedniego miesiąca./# #CDN_2=Na tym dokumencie data wystawienia nie może być wcześniejsza niż bieżący miesiąc./# #CDN_3=Zmień datę wystawienia na bieżący miesiąc lub poprośo zapisanie dokumentu osobę uprawnioną./#',16, 1)
			ROLLBACK TRAN
			SET
			NOCOUNT OFF
			RETURN
		END
	END
SET
NOCOUNT OFF

m_pk
Posty: 47
Rejestracja: 20 wrz 2017, 13:39
Rola: Inny
Lokalizacja: ZST
Kontakt:

Re: Trigger na CDN.Zamnag

Post autor: m_pk »

Witam,

Dziękuje za wszystkie odpowiedzi.

Teraz już na pewno sobie poradzę.

Pzdr.
PK

ODPOWIEDZ