Autor Wątek: Trigger waga  (Przeczytany 2229 razy)

0 użytkowników i 1 Gość przegląda ten wątek.

Offline xeon235

  • Nowy użytkownik
  • *
  • Wiadomości: 39
  • Reputacja +0/-0
  • Wersja programu: 1.52
Trigger waga
« dnia: 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

Offline Biniew

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4095
  • Reputacja +275/-17
  • Wersja programu: GT i Nexo
Odp: Trigger waga
« Odpowiedź #1 dnia: Październik 02, 2018, 19:37:00 »
ale gdzie ma byc ta suma zapisana?

Offline xeon235

  • Nowy użytkownik
  • *
  • Wiadomości: 39
  • Reputacja +0/-0
  • Wersja programu: 1.52
Odp: Trigger waga
« Odpowiedź #2 dnia: 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

Offline Aldo

  • Ekspert
  • *****
  • Wiadomości: 10695
  • Reputacja +433/-13
  • Wersja programu: najnowsza
Odp: Trigger waga
« Odpowiedź #3 dnia: Październik 02, 2018, 19:55:45 »
Może źle pamiętam, sle podsuma masy jest dynamiczna w trakcie dodawania pozycji.

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17040
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Trigger waga
« Odpowiedź #4 dnia: Październik 02, 2018, 19:57:10 »
Logika podpowiada wykorzystanie nagłówka dokumentu... Zobacz co robi program i wszystko powinno się wyjaśnić.
Daniel, Białystok.

Offline Biniew

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4095
  • Reputacja +275/-17
  • Wersja programu: GT i Nexo
Odp: Trigger waga
« Odpowiedź #5 dnia: Październik 02, 2018, 19:57:54 »
a jak sa powiazane opakowania w waga?

Offline xeon235

  • Nowy użytkownik
  • *
  • Wiadomości: 39
  • Reputacja +0/-0
  • Wersja programu: 1.52
Odp: Trigger waga
« Odpowiedź #6 dnia: 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
« Ostatnia zmiana: Październik 03, 2018, 19:47:09 wysłana przez xeon235 »

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17040
  • Reputacja +798/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Trigger waga
« Odpowiedź #7 dnia: 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.
Daniel, Białystok.

Offline xeon235

  • Nowy użytkownik
  • *
  • Wiadomości: 39
  • Reputacja +0/-0
  • Wersja programu: 1.52
Odp: Trigger waga
« Odpowiedź #8 dnia: 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

Offline candy

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4871
  • Reputacja +172/-11
Odp: Trigger waga
« Odpowiedź #9 dnia: 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.
Nie pytaj co rząd może zrobić dla Ciebie. Spytaj czy mógłby tego nie robić.

Offline xeon235

  • Nowy użytkownik
  • *
  • Wiadomości: 39
  • Reputacja +0/-0
  • Wersja programu: 1.52
Odp: Trigger waga
« Odpowiedź #10 dnia: 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

Offline Biniew

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4095
  • Reputacja +275/-17
  • Wersja programu: GT i Nexo
Odp: Trigger waga
« Odpowiedź #11 dnia: Październik 04, 2018, 18:35:40 »
a tak trudno sprawdzic na kopii?

Forum Użytkownikow Subiekt GT

Odp: Trigger waga
« Odpowiedź #11 dnia: Październik 04, 2018, 18:35:40 »