Autor Wątek: Trigger na ZK blokujący edycję FS  (Przeczytany 7649 razy)

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

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Trigger na ZK blokujący edycję FS
« dnia: Czerwiec 23, 2016, 15:54:05 »
Witam,

Chciałem skonstruować trigger, który aktualizuje pole własne rozszerzone, gdy zmieniana jest data realizacji zamówienia.
Niestety, gdy go włączam, niemożliwe jest edytowanie Faktur Sprzedażowych (FS) - po zapisaniu.
Czy może ktoś ma wiedzę dlaczego "gryzą się" te dwa elementy, gdy w IF jest wybrany Typ= 16 (ZK)?

ALTER TRIGGER [dbo].[Aktualizacja_Kolejnosci_ZK_Po_Zmianie_Terminu_Realizacji]

   ON  [dbo].[dok__Dokument]
   AFTER UPDATE
   
AS
IF (SELECT dok_Typ FROM inserted) = 16 AND (SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted)) >0
BEGIN
DECLARE  @termin int,  @priorytet int, @pwdid int
SET @termin = (SELECT CONVERT(INT, dok_TerminRealizacji) FROM inserted) -- Termin ZK
SET @priorytet =  (SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted))
SET @pwdid = (SELECT dok_Id FROM inserted) -- ID rekordu w tabeli pw_Dane

UPDATE dbo.pw_Dane
SET dbo.pw_Dane.pwd_Liczba01 = (CASE WHEN @priorytet in (29) THEN 3
WHEN @priorytet in (31) THEN 1
WHEN @priorytet in (32) THEN 2
WHEN @priorytet in (33,34,36,37,38,39,40,42,43,45,46) THEN 4
WHEN @priorytet in (47) THEN 6
ELSE 0 END )*100000000
+100000000-@termin*100
+@priorytet -- ustalenie kolejnosci kolumna #99Kolejność
WHERE dbo.pw_Dane.pwd_IdObiektu= @pwdid AND pwd_TypObiektu = -8
END

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9235
  • Reputacja +1306/-21
  • Wersja programu: Najnowsza
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #1 dnia: Czerwiec 23, 2016, 16:42:51 »
Nie analizowałem triggera, ale od razu nasuwa się pytanie. Co się dzieje, jeżeli aktualizowany jest więcej niż 1 rekord?
Co wtedy jest w inserted?
Sławek, Zduńska Wola

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #2 dnia: Czerwiec 23, 2016, 18:58:05 »
@birds22, Dzięki za uwagę! ;)
Generalnie mam założenie, że trigger działa tylko i wyłącznie w momencie zapisu otwartego ZK, więc zawsze powinien być to pojedynczy wiersz w inserted.

Offline candy

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4919
  • Reputacja +173/-11
Trigger na ZK blokujący edycję FS
« Odpowiedź #3 dnia: Czerwiec 23, 2016, 19:14:47 »
A jak zapewniasz że trigger działa "tylko i wyłącznie w momencie zapisu otwartego ZK"?
Na pierwszy rzut oka wydaje mi się że tylko siłą woli ;)
Nie pytaj co rząd może zrobić dla Ciebie. Spytaj czy mógłby tego nie robić.

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17255
  • Reputacja +800/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #4 dnia: Czerwiec 23, 2016, 19:32:42 »
Kolejny podstawowy błąd to odwoływanie się do tabeli pw_Dane po identyfikatorze obiektu zamiast po identyfikatorze i typie obiektu (tabela ta zawiera dane dla wszystkich typów obiektów).
Daniel, Białystok.

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9235
  • Reputacja +1306/-21
  • Wersja programu: Najnowsza
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #5 dnia: Czerwiec 23, 2016, 20:20:02 »
@birds22, Dzięki za uwagę! ;)
Generalnie mam założenie, że trigger działa tylko i wyłącznie w momencie zapisu otwartego ZK, więc zawsze powinien być to pojedynczy wiersz w inserted.

Twój trigger działa przy zdarzeniu update na tabeli dok__dokument, a nie przy zdarzeniu zapisu ZK. Wykonuje się przy update każdego dokumentu, który jest w tej tabeli. Dopiero w samym triggerze decydujesz co i kiedy będzie się działo.
Sławek, Zduńska Wola

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #6 dnia: Czerwiec 23, 2016, 23:31:05 »
Dzięki Panowie za uwagi :)

Kolejny podstawowy błąd to odwoływanie się do tabeli pw_Dane po identyfikatorze obiektu zamiast po identyfikatorze i typie obiektu (tabela ta zawiera dane dla wszystkich typów obiektów).
Założyłem, że identyfikator jest unikalny dla każdego wiersza (wg tego co widzę Pwd_id jest kluczem w tej tabeli).  Czy się mylę?

@birds22, Dzięki za uwagę! ;)
Generalnie mam założenie, że trigger działa tylko i wyłącznie w momencie zapisu otwartego ZK, więc zawsze powinien być to pojedynczy wiersz w inserted.

Twój trigger działa przy zdarzeniu update na tabeli dok__dokument, a nie przy zdarzeniu zapisu ZK. Wykonuje się przy update każdego dokumentu, który jest w tej tabeli. Dopiero w samym triggerze decydujesz co i kiedy będzie się działo.

Rzeczywiście mam IF na zmianę na ZK (dok_Typ =16) Myślałem, że jeżeli nie jest spełniony ten warunek, to SQL nie podejmuje działa... Czy uważacie, że powinienem użyć jakiegoś ELSE?

Offline candy

  • Zaawansowany użytkownik
  • ****
  • Wiadomości: 4919
  • Reputacja +173/-11
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #7 dnia: Czerwiec 23, 2016, 23:39:49 »
Kolejny podstawowy błąd to odwoływanie się do tabeli pw_Dane po identyfikatorze obiektu zamiast po identyfikatorze i typie obiektu (tabela ta zawiera dane dla wszystkich typów obiektów).
Założyłem, że identyfikator jest unikalny dla każdego wiersza (wg tego co widzę Pwd_id jest kluczem w tej tabeli).  Czy się mylę?
Unikalny jest pwd_Id, a nie pwd_IdObiektu, który nie tylko nie jest unikalny, ale może odnosić się do różnych tabel.
Krótko mówiąc to:
SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted)wcale nie musi dać jednego rekordu
Nie pytaj co rząd może zrobić dla Ciebie. Spytaj czy mógłby tego nie robić.

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #8 dnia: Czerwiec 23, 2016, 23:55:21 »
(...)
Założyłem, że identyfikator jest unikalny dla każdego wiersza (wg tego co widzę Pwd_id jest kluczem w tej tabeli).  Czy się mylę?
Unikalny jest pwd_Id, a nie pwd_IdObiektu, który nie tylko nie jest unikalny, ale może odnosić się do różnych tabel.
Krótko mówiąc to:
SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted)wcale nie musi dać jednego rekordu

Dzięki candy! :)
Chyba łapię. Czyli powinienem dodać "AND  [pwd_TypObiektu]=-8 ", żeby dotyczyło to Rozszerzonego pola ZK, tak? =>
SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted) AND  [pwd_TypObiektu]=-8

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17255
  • Reputacja +800/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #9 dnia: Czerwiec 23, 2016, 23:55:47 »
@birds22, Dzięki za uwagę! ;)
Generalnie mam założenie, że trigger działa tylko i wyłącznie w momencie zapisu otwartego ZK, więc zawsze powinien być to pojedynczy wiersz w inserted.

Twój trigger działa przy zdarzeniu update na tabeli dok__dokument, a nie przy zdarzeniu zapisu ZK. Wykonuje się przy update każdego dokumentu, który jest w tej tabeli. Dopiero w samym triggerze decydujesz co i kiedy będzie się działo.

Rzeczywiście mam IF na zmianę na ZK (dok_Typ =16) Myślałem, że jeżeli nie jest spełniony ten warunek, to SQL nie podejmuje działa... Czy uważacie, że powinienem użyć jakiegoś ELSE?

Ciągle nie łapiesz, przecież napisałem, że błędnie odwołujesz się do tabeli pd_Dane, a robisz to już w warunku, więc na już na etapie jego sprawdzania zapewne jest generowany błąd.
Daniel, Białystok.

Offline dkozlowski

  • Ekspert
  • *****
  • Wiadomości: 17255
  • Reputacja +800/-27
  • Wersja programu: GT/Navireo/nexo
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #10 dnia: Czerwiec 23, 2016, 23:58:23 »
Chyba łapię. Czyli powinienem dodać "AND  [pwd_TypObiektu]=-8 ", żeby dotyczyło to Rozszerzonego pola ZK, tak? =>
SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted) AND  [pwd_TypObiektu]=-8

Tak i piszę o tym od początku, a poprawne odwołanie miałeś już przecież w przedostatniej linii w pierwszym zamieszczonym kodzie...
Daniel, Białystok.

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #11 dnia: Czerwiec 24, 2016, 00:05:58 »
Chyba łapię. Czyli powinienem dodać "AND  [pwd_TypObiektu]=-8 ", żeby dotyczyło to Rozszerzonego pola ZK, tak? =>
SELECT pwd_Fk01 FROM  pw_Dane WHERE pwd_IdObiektu = (SELECT dok_Id FROM inserted) AND  [pwd_TypObiektu]=-8

Tak i piszę o tym od początku, a poprawne odwołanie miałeś już przecież w przedostatniej linii w pierwszym zamieszczonym kodzie...
Dzięki Danielu, chyba wcześniej Cię nie zrozumiałem :)

Dziękuję wszystkim za cierpliwość i spokojne wytłumaczenie. No i zarazem podejście, w którym mogłem się nauczyć czegoś nowego, a nie tylko dostać odpowiedź! Super!  :D

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9235
  • Reputacja +1306/-21
  • Wersja programu: Najnowsza
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #12 dnia: Czerwiec 24, 2016, 00:23:26 »



Rzeczywiście mam IF na zmianę na ZK (dok_Typ =16) Myślałem, że jeżeli nie jest spełniony ten warunek, to SQL nie podejmuje działa... Czy uważacie, że powinienem użyć jakiegoś ELSE?

Tu nie chodzi o dodatkowy warunek. Inserted to tabela i niekoniecznie musi mieć jeden rekord. Może być zmienione jednocześnie wiele wierszy, więc musisz wykonać to na wszystkich (jeżeli jest ich więcej niż 1)

Sławek, Zduńska Wola

Offline lkozlowski

  • Nowy użytkownik
  • *
  • Wiadomości: 22
  • Reputacja +0/-0
  • Wersja programu: 1.37 SP3
Odp: Trigger na ZK blokujący edycję FS
« Odpowiedź #13 dnia: Czerwiec 24, 2016, 10:36:36 »



Rzeczywiście mam IF na zmianę na ZK (dok_Typ =16) Myślałem, że jeżeli nie jest spełniony ten warunek, to SQL nie podejmuje działa... Czy uważacie, że powinienem użyć jakiegoś ELSE?

Tu nie chodzi o dodatkowy warunek. Inserted to tabela i niekoniecznie musi mieć jeden rekord. Może być zmienione jednocześnie wiele wierszy, więc musisz wykonać to na wszystkich (jeżeli jest ich więcej niż 1)
???Przed UPDATE dodać
IF EXISTS (SELECT pwd_IdObiektu FROM dbo.pw_Dane WHERE dbo.pw_Dane.pwd_IdObiektu=@pwdid)??...

Offline birds22

  • Ekspert
  • *****
  • Wiadomości: 9235
  • Reputacja +1306/-21
  • Wersja programu: Najnowsza
Trigger na ZK blokujący edycję FS
« Odpowiedź #14 dnia: Czerwiec 24, 2016, 10:51:22 »
Chyba zupełnie nie łapiesz o czym piszę...

Masz w swojej procedurze:

(SELECT dok_Typ FROM inserted) = 16

Jeżeli w tabeli inserted będzie więcej niż 1 rekord to ten test wywoła błąd.
Musisz to obsłużyć.
« Ostatnia zmiana: Czerwiec 24, 2016, 11:38:36 wysłana przez birds22 »
Sławek, Zduńska Wola

Forum Użytkownikow Subiekt GT

Trigger na ZK blokujący edycję FS
« Odpowiedź #14 dnia: Czerwiec 24, 2016, 10:51:22 »