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

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

Moderator: mikey

kasia93
Posty: 1
Rejestracja: 02 gru 2022, 10:26
Rola: Konsultant CDN XL

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

Post 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;

JakubK
Posty: 76
Rejestracja: 09 lis 2009, 12:22
Rola: Administrator CDN XL

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

Post 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

StabiL
Posty: 48
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

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

Post 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)

ODPOWIEDZ