Forum Użytkownikow Subiekt GT

InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: xeon235 w Październik 02, 2018, 19:10:45

Tytuł: Trigger waga
Wiadomość wysłana 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
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: Biniew w Październik 02, 2018, 19:37:00
ale gdzie ma byc ta suma zapisana?
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: xeon235 w Październik 02, 2018, 19:53:52
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
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: Aldo w Październik 02, 2018, 19:55:45
Może źle pamiętam, sle podsuma masy jest dynamiczna w trakcie dodawania pozycji.
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: dkozlowski w Październik 02, 2018, 19:57:10
Logika podpowiada wykorzystanie nagłówka dokumentu... Zobacz co robi program i wszystko powinno się wyjaśnić.
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: Biniew w Październik 02, 2018, 19:57:54
a jak sa powiazane opakowania w waga?
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: xeon235 w Październik 03, 2018, 19:41:54
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
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: dkozlowski w Październik 03, 2018, 20:08:43
Nie zawsze zadziała, "inserted" to przecież tabela, a tabela może posiadać więcej niż jeden wiersz.
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: xeon235 w Październik 03, 2018, 20:32:42
to w jaki sposob pobiera sie wartosc danej kolumny w insertowanym lub updatowanym wierszu? bo do tej pory myslalem ze takie rozwiazanie jest poprawne
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: candy w Październik 03, 2018, 21:09:28
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.
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: xeon235 w Październik 04, 2018, 18:03:08
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
Tytuł: Odp: Trigger waga
Wiadomość wysłana przez: Biniew w Październik 04, 2018, 18:35:40
a tak trudno sprawdzic na kopii?