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;
Trigger, który aktualizuje atrybut na ZS po dodaniu faktury końcowej
Moderator: mikey
Re: Trigger, który aktualizuje atrybut na ZS po dodaniu faktury końcowej
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
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
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:
Wystarczy, że zrobisz
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:
i to
nigdy się w Twoim zapytaniu nie spełni (no chyba, że gidnumer jakiegoś zamówienia pokryje się z gidnumerem jakiegoś dokumentu handlowego)
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
Kod: Zaznacz cały
FROM inserted fs
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
Kod: Zaznacz cały
JOIN CDN.Zamnag ON ZaN_GIDNumer = Atr_ObiNumer