Forum Użytkownikow Subiekt GT
InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: xeon235 w Październik 02, 2018, 19:10:45
-
jak zrobić trigger, ktory zsumuje wagi z wszystkich pozycji na dokumencie podczas jego zapisywania, wiem ze tam zielony plus czy jaki tam sumuje wagi (mam go) ale interesuje mnie wykonanie akcji w zaleznosci od zsumowanej wagi wszystkich pozycji na dokumencie, moglbym zrobic aby sumowalo wage po kazdym insercie do dok_Pozycja, ale interesuje mnie tylko wyzwalacz po dodaniu ostatniego rekordu do dok_Pozycja przy zapisywaniu dokumentu
-
ale gdzie ma byc ta suma zapisana?
-
nie chce zapisywac sumy, chce zrobic, trigger ktory, by sprawdzal czy na podstawie wagi wszystkich pozycji zostala zafakturowana odpowiednia ilosc paczek w zaleznosci od metody wysylki co rownierz jest dodawane jako pozycja na dokumencie
-
Może źle pamiętam, sle podsuma masy jest dynamiczna w trakcie dodawania pozycji.
-
Logika podpowiada wykorzystanie nagłówka dokumentu... Zobacz co robi program i wszystko powinno się wyjaśnić.
-
a jak sa powiazane opakowania w waga?
-
poptrzylem sobie profilerem co robi sie w bazie podczas zapisu dokumentu, i zobaczylem ze po insercie do dok_Pozycja wszystki pozycji jest wykonywany jeszcze update na tabeli dok__Dokument, czy tak sie dzieje przy kazdym dokumencie i kazdym warunku czy nie, bo tego nie wiem i czy jezeli trigger by mial nastepujaca postac to by to dzialalo?:
USE [testowy_pelny]
GO
/****** Object: Trigger [dbo].[us_kredyt_test] Script Date: 2018-10-03 19:37:07 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[us_kredyt_test]
ON [dbo].[dok__Dokument]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF(EXISTS(SELECT dok_Typ FROM inserted WHERE dok_Typ IN(2,21)))
BEGIN
DECLARE @waga MONEY;
DECLARE @dopuszczalna_waga MONEY;
DECLARE @id_dok INT;
SET @id_dok = (SELECT dok_Id FROM inserted);
SET @waga = (SELECT SUM(ob_Ilosc*tw_Masa) FROM dok_Pozycja LEFT JOIN tw__Towar ON tw_Id=ob_TowId WHERE ob_DokHanId=@id_dok AND NOT EXISTS(SELECT TOP 1 tw_Id FROM tw__Towar WHERE tw_IdGrupa=217 AND tw_Id=ob_TowId));
SET @dopuszczalna_waga = (
SELECT SUM(
CASE ob_TowId
WHEN 258 THEN 10
WHEN 1212 THEN ob_Ilosc*30
WHEN 1214 THEN 30
WHEN 7260 THEN 5
...
ELSE 3000
END
) FROM dok_Pozycja WHERE ob_DokHanId=@id_dok AND EXISTS(SELECT TOP 1 tw_Id FROM tw__Towar WHERE tw_IdGrupa=217 AND tw_Id=ob_TowId)
);
IF(@waga > @dopuszczalna_waga)
RAISERROR('<msg>Waga wszystki pozycji przekracza dopuszczalną wagę dla wybranych kurierów</msg>', 16, 1)
END
END
-
Nie zawsze zadziała, "inserted" to przecież tabela, a tabela może posiadać więcej niż jeden wiersz.
-
to w jaki sposob pobiera sie wartosc danej kolumny w insertowanym lub updatowanym wierszu? bo do tej pory myslalem ze takie rozwiazanie jest poprawne
-
Proponuję poczytać, w sieci jest dość materiałów o triggerach, przecież nikt nie będzie tu pisał wykładu.
To nie jest tak że dla dopisywanego rekordu jest wywoływany trigger a w inserted są dane tego jednego rekordu.
Kiedy dodawane jest wiele wierszy w inserted jest tyle rekordów ile wierszy jest dodawanych i trzeba potrzebną operację trzeba wykonać dla każdego z nich.
-
a czy teraz tak bedzie poprawnie:
ALTER TRIGGER [dbo].[us_kredyt_test]
ON [dbo].[dok__Dokument]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @dok_Id INT
DECLARE @dok_Typ INT
DECLARE @waga MONEY
DECLARE @dopuszczalna_waga MONEY
DECLARE csr_DokId CURSOR FOR SELECT dok_Id, dok_Typ FROM inserted
OPEN csr_DokId
FETCH NEXT FROM csr_DokId INTO @dok_Id, @dok_Typ
WHILE @@FETCH_STATUS = 0
BEGIN
IF(@dok_Typ IN(2,21))
BEGIN
SET @waga = (SELECT SUM(ob_Ilosc*tw_Masa) FROM dok_Pozycja LEFT JOIN tw__Towar ON tw_Id=ob_TowId WHERE ob_DokHanId=@dok_Id AND NOT EXISTS(SELECT TOP 1 tw_Id FROM tw__Towar WHERE tw_IdGrupa=217 AND tw_Id=ob_TowId));
SET @dopuszczalna_waga = (
SELECT SUM(
CASE ob_TowId
WHEN 258 THEN 10
WHEN 1212 THEN ob_Ilosc*30
WHEN 1214 THEN 30
WHEN 7260 THEN 5
...
ELSE 3000
END
) FROM dok_Pozycja WHERE ob_DokHanId=@dok_Id AND EXISTS(SELECT TOP 1 tw_Id FROM tw__Towar WHERE tw_IdGrupa=217 AND tw_Id=ob_TowId)
);
IF(@waga > @dopuszczalna_waga)
RAISERROR('<msg>Waga wszystki pozycji przekracza dopuszczalną wagę dla wybranych kurierów</msg>', 16, 1)
END
FETCH NEXT FROM csr_DokId INTO @dok_Id, @dok_Typ
END
CLOSE csr_DokId
DEALLOCATE csr_DokId
END
-
a tak trudno sprawdzic na kopii?