Strona 1 z 1

Trigger, który aktualizuje atrybut na ZS po dodaniu faktury końcowej

: 11 wrz 2023, 14:58
autor: kasia93
Cześć, chcę zrobić mój pierwszy trigger który aktualizuje atrybut na ZS, kiedy zostanie wystawiona faktura końcowa (S)FS. Ścieżka dokumentów ZS->FSL->WZ->(S)FS. Co robię nie tak?

USE [TEST]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [CDN].[StatusSync_Tranag]
ON [CDN].[Tranag]
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @GidNumer INT;
DECLARE @stan VARCHAR(255);

SET @GidNumer = (SELECT WZ.TrN_ZaNNumer FROM CDN.Tranag WZ
LEFT JOIN inserted fs ON fs.trn_gidnumer = WZ.Trn_spinumer
LEFT JOIN CDN.Zamnag ON ZaN_GIDNumer = WZ.TrN_ZaNNumer
WHERE WZ.TrN_GIDTyp = 2001);

IF UPDATE(TrN_Stan)
BEGIN
SET @GidNumer = (SELECT WZ.TrN_ZaNNumer FROM CDN.Tranag WZ
LEFT JOIN inserted ON fs.trn_gidnumer = WZ.Trn_spinumer
LEFT JOIN CDN.Zamnag ON ZaN_GIDNumer = WZ.TrN_ZaNNumer
WHERE WZ.TrN_GIDTyp = 2001);

BEGIN
UPDATE CDN.Atrybuty
SET Atr_Wartosc = 'zrealizowane'
FROM CDN.Atrybuty
JOIN inserted ON TrN_GIDNumer = Atr_ObiNumer AND TrN_GIDTyp = Atr_ObiTyp
JOIN CDN.AtrybutyKlasy a ON Atr_AtkId = Atr_Id
JOIN CDN.Zamnag ON ZaN_GIDNumer = Atr_ObiNumer
WHERE Atr_Nazwa = 'Status zamówienia';
END
END
END;

Re: Trigger, który aktualizuje atrybut na ZS po dodaniu faktury końcowej

: 21 wrz 2023, 13:35
autor: JakubK
Twoje polecenie UPDATE CDN.Atrybuty zaktualizuje atrybut na WZ lub FS niezależnie od tego która kolumna będzie zmodyfikowana
Update powinno być po IF UPDATE(TrN_Stan) BEGIN

i przede wszystkim musisz atrybuty joinować z zamnag a nie tranag

Twoje SET @GidNumer do niczego nie służy tylko dwa razy wpisuje gid zamówienia

Re: Trigger, który aktualizuje atrybut na ZS po dodaniu faktury końcowej

: 22 wrz 2023, 00:01
autor: StabiL
Nie powiem z głowy jak wykryć, że to faktura końcowa. Jak masz Crystala to można podejrzeć jakiś wydruk i sprawdzić formułę :)

Tak bardziej od strony technicznej - co do samego trigera to:

Kod: Zaznacz cały

SELECT WZ.TrN_ZaNNumer FROM CDN.Tranag WZ
LEFT JOIN inserted fs ON fs.trn_gidnumer = WZ.Trn_spinumer
Wystarczy, że zrobisz

Kod: Zaznacz cały

FROM inserted fs 
zamiast joina z tranaga do niego.

W samym update masz zły warunek łączenia do CDN.AtrybutyKlasy, powinno być: Atr_AtkId = Atk_id
Poza tym where po stringu nie jest wydajny. Skoro ten atrybut jest w bazie zdecydowanie lepiej jest 'wherować' się po AtkId.
Idąc dalej najlepiej byłoby uniknąć w ogóle joinów - znaleźć gidnumer zamówienia i go przypisać do zmiennej. Potem updejtować samo CDN.Atrybuty z warunkiem GidTyp,GidNumer.

Dodatkowo:

Kod: Zaznacz cały

JOIN inserted ON TrN_GIDNumer = Atr_ObiNumer AND TrN_GIDTyp = Atr_ObiTyp
i to

Kod: Zaznacz cały

JOIN CDN.Zamnag ON ZaN_GIDNumer = Atr_ObiNumer
nigdy się w Twoim zapytaniu nie spełni (no chyba, że gidnumer jakiegoś zamówienia pokryje się z gidnumerem jakiegoś dokumentu handlowego)