InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty przez: Maciek w Listopad 23, 2017, 14:53:01

Tytuł: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 14:53:01
utknąłem na tworzeniu warunku, który będzie wyświetlał komunikat o błędzie, jeżeli na dokumencie sprzedaży pojawią się towary z różnych grup.
Powinno być tak, że jeżeli jeden z towarów będzie miał grupę 27 i jakikolwiek inny będzie z grupy różnej od 27, to ma się wyświetlić komunikat błędu.
Trigger jest na tabeli dok_Pozycja

SELECT @pid = ob_DokHanId FROM inserted
SELECT @tow = ob_TowId FROM inserted
SELECT @typ = dok_Typ from dok__Dokument where dok_Id = @pid
SELECT @dhan = ob_DokHanLp from INSERTED
SELECT @dkat = dok_KatId FROM dok__Dokument where dok_DoDokId = @pid
SELECT @grup = tw_IdGrupa FROM tw__Towar WHERE tw_Id = @tow

IF (@typ = 21 OR @typ = 2)
AND
(@dhan = 1 OR @dhan = 2 OR @dhan = 3) AND (@grup = 27 AND @grup <> 27)
RAISERROR('<msg>Dla towaru Komisowego, na dokumencie mogą być tylko telefony z Komisu.</msg>', 16, 1)

czyli, jeżeli mam towar na pozycji 1,2 lub 3 i któryś z tych towarów jest grupy 27 a inny z różnej od 27, to jest błąd. Tym czasem błąd chyba robię na tym (@grup = 27 AND @grup <> 27). Ktoś mnie naprowadzi?
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: micha w Listopad 23, 2017, 15:09:38
(@grup = 27 AND @grup <> 27)
To nigdy nie jest prawdą. :-)
Pokombinuj z select count > 1.
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: candy w Listopad 23, 2017, 15:22:12
Trudno komentować urywki, ale oprócz tego co słusznie zauważył micha to:
- czy jesteś pewien że w INSERTED będzie zawsze tylko jeden wiersz?
- czy jak grupa się powtórzy na pozycji 4 lub kolejnej to już OK?

Myślę że w warunku należałoby skorzystać z EXISTS
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 15:59:49
Dziękuję za podpowiedzi, próbuję je właśnie wykorzystać
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 17:03:34
Trudno komentować urywki, ale oprócz tego co słusznie zauważył micha to:
- czy jesteś pewien że w INSERTED będzie zawsze tylko jeden wiersz?
- czy jak grupa się powtórzy na pozycji 4 lub kolejnej to już OK?

Myślę że w warunku należałoby skorzystać z EXISTS

1. jestem pewien, że nie zawsze będzie jeden
2. nie, ogólnie towary z jednej grupy (27) nie mogą być sprzedawane z pozostałymi grupami jednym dokumentem.

Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 17:16:27
(@grup = 27 AND @grup <> 27)
To nigdy nie jest prawdą. :-)
Pokombinuj z select count > 1.

nic mi sensownego z tym count nie wychodzi. Dobrze rozumiem, że  powinien mi zliczać towary na dokumencie z każdej grupy i jeśli dla obu jednocześnie jest wartość większa od zera, to wywołuje błąd? Tyle, że on mi zlicza, takie mam wrażenie towary z tabeli tw__Towary, a nie te z "ob_TowId FROM inserted" mimo, że chyba zrobilem dobrze...
IF (@typ = 21 OR @typ = 2)
AND
(SELECT Count (*) FROM tw_Towary where tw_IdGrupa = 27 and tw_Id = @tow)  > 0
AND
(SELECT Count (*) FROM tw_Towary where tw_IdGrupa <> 27 and tw_Id = @tow)  > 0

na logikę powinno być ok, czyli jeżeli na dokumencie jest towarów z obu grup jednocześnie więcej niż 0 to jest błąd, w przeciwnym razie warunek się nie powinien wykonać...

Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: birds22 w Listopad 23, 2017, 17:42:09
(@grup = 27 AND @grup <> 27)
To nigdy nie jest prawdą. :-)
Pokombinuj z select count > 1.

nic mi sensownego z tym count nie wychodzi. Dobrze rozumiem, że  powinien mi zliczać towary na dokumencie z każdej grupy i jeśli dla obu jednocześnie jest wartość większa od zera, to wywołuje błąd? Tyle, że on mi zlicza, takie mam wrażenie towary z tabeli tw__Towary, a nie te z "ob_TowId FROM inserted" mimo, że chyba zrobilem dobrze...
IF (@typ = 21 OR @typ = 2)
AND
(SELECT Count (*) FROM tw_Towary where tw_IdGrupa = 27 and tw_Id = @tow)  > 0
AND
(SELECT Count (*) FROM tw_Towary where tw_IdGrupa <> 27 and tw_Id = @tow)  > 0

na logikę powinno być ok, czyli jeżeli na dokumencie jest towarów z obu grup jednocześnie więcej niż 0 to jest błąd, w przeciwnym razie warunek się nie powinien wykonać...

Na logikę właśnie nie powinno być OK. Cały czas sprawdzasz przecież jeden towar a nie towary znajdujące się na dokumencie.
Jeden towar nie może być i nie być jednocześnie w grupie 27.
Tytuł: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: candy w Listopad 23, 2017, 18:01:10
Ja Ci piszę żebyś użył EXISTS a Ty babrzesz się w COUNT... Ehh
Po co Ci wolniejsze COUNT skoro chcesz sprawdzić czy istnieje problem, a nie w ilu miejscach wystąpił?
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Aldo w Listopad 23, 2017, 18:26:53
Wiem tylko to, co napisałeś, ale co będzie jak na fakturze znajdą się towary z innych grup oraz z grupy 27, a faktura będzie dla detalisty?
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 20:28:24
Wiem tylko to, co napisałeś, ale co będzie jak na fakturze znajdą się towary z innych grup oraz z grupy 27, a faktura będzie dla detalisty?

typ dokumentu jest dla mnie wtórny, muszę stworzyć mechanizm, który nie pozwoli w dokumencie sprzedaży (ale także MM) umieścić jednocześnie towarów komisowych (w praktyce telefony, każdy wprowadzony z jedną grupą i symbolami = IMEI) oraz pozostałych towarów jakie sprzedajemy. Mamy 20 magazynów, na każdym sprzedaje po kilka osób, w tym sporo stażystów, nie dam fizycznie rady na bieżąco tego sprawdzać i poprawiać, żeby później WZ w Rewizorze miały prawidłowe wartości dla towarów.

No nic, spróbuję z EXISTS
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Biniew w Listopad 23, 2017, 20:41:43
a gdyby telefon byl kompletem a nie towarem to moze rewizor by sobie sam poradzil?
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: micha w Listopad 23, 2017, 20:51:54
A czy ten komis to może nie tyle komis, co raczej VAT marza? Bo jak tak, to jest w Subiekcie standardowy mechazm niepozwalający mieszać.
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 22:03:50
nie, to jest taka sytuacja, że na każdym magazynie są telefony komisowe i towar zakupiony. Oba "schodzą" WZ-tkami do PA lub FS, które księgowane powinny być na koncie komisowym (poza bilansowym) dla tych tel. komisowych i na koncie magazynowym bilansowym dla towarów zakupionych. Jeżeli teraz ktoś mi sprzeda telefon z komisu i np. futerał jednym rachunkiem, to księgowa nie będzie wiedziała, czy wartość WZ w całości jest kosztem firmy czy tylko w części związanej z tym futerałem. Sprzedawcy na sklepach (+ i CP) mają dosyć zajęć i muszę to zautomatyzować, żeby nie mieli kolejnej rzeczy do pamiętania.
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: micha w Listopad 23, 2017, 22:22:18
Skoro komis i tak jest pozabilansowy, to może rozwiązaniem byłoby używanie zerowej ceny magazynowej dla towarów komisowych? Wtedy nie byłoby czego odejmować.

Rozwiązanie z kompletem tez wydaje się Ok, jeżeli nie macie innych kompletów. Można zautomatyzować księgowanie wartości kompletów.
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 23, 2017, 23:13:35
Ja Ci piszę żebyś użył EXISTS a Ty babrzesz się w COUNT... Ehh
Po co Ci wolniejsze COUNT skoro chcesz sprawdzić czy istnieje problem, a nie w ilu miejscach wystąpił?

też mi to  nie wychodzi, z przykładów wynika, że po
IF EXISTS (SELECT * FROM dok_Pozycja WHERE ob_DokHanLP = @dhan AND @grup = 27)

jest
BEGIN
RAISERROR('<msg>Komunikat</msg>', 16, 1)
END

ale u mnie po spełnieniu pierwszego warunku powinien sprawdzić drugi, czyli czy na wstawionych pozycjach nie ma @grup<>27 i jeżeli oba warunki są spełnione to wyświetlać komunikat.
Tytuł: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: candy w Listopad 23, 2017, 23:39:36
Chyba robisz podstawowy błąd - nie bardzo wiesz co chcesz sprawdzić a już zaczynasz to pisać.
W ogóle nie wiem po co Ci nr pozycji.
Przecież wystarczy sprawdzić czy:
- Istnieje jakakolwiek pozycja z grupą X
I jednocześnie
- Istnieje jakakolwiek pozycja z grupą inna niż X.
Nie zapomnij że grupy może nie być.

I weź to po sprawdzaj najpierw na zwykłych, już zapisanych dokumentach, a nie w triggerze.
Tylko zrób sobie porządny zbiór testowych dokumentów.
Jak już opanujesz tego SELECTa to weź się za trigger.
Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 24, 2017, 11:24:22
Chyba robisz podstawowy błąd - nie bardzo wiesz co chcesz sprawdzić a już zaczynasz to pisać.
W ogóle nie wiem po co Ci nr pozycji.
Przecież wystarczy sprawdzić czy:
- Istnieje jakakolwiek pozycja z grupą X
I jednocześnie
- Istnieje jakakolwiek pozycja z grupą inna niż X.
Nie zapomnij że grupy może nie być.

I weź to po sprawdzaj najpierw na zwykłych, już zapisanych dokumentach, a nie w triggerze.
Tylko zrób sobie porządny zbiór testowych dokumentów.
Jak już opanujesz tego SELECTa to weź się za trigger.

no właśnie wiem co chcę sprawdzić (dokładnie to o czym piszesz) ale nie widzę/nie rozumiem, prawdopodobnie jakiegoś oczywistego błędu, który popełniam w składni, ponieważ ciągle wracam do punktu wyjścia, pierwszy warunek działa

SELECT @pid = ob_DokMagId FROM inserted
SELECT @grup = tw_IdGrupa FROM tw__Towar WHERE tw_Id = @tow
IF
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND @grup = 27)

czyli jeśli którykolwiek towar ma grupę 27, to wyświetla błąd
ale jak dodam drugi
AND
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND @grup <> 27)

to zapisuje każdy dokument, bez znaczenia jakie są w nim grupy. ob_DokMagId = @pid stosuję, żeby zapytanie działało tylko do bieżącego dokumentu a nie całej tabeli dok_Pozycja. Gdzie ja nie widzę błędu....?


Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: birds22 w Listopad 24, 2017, 12:52:04
Cały czas popełniasz ten sam błąd. Odnosisz się do jednej pozycji.

SELECT @grup = tw_IdGrupa FROM tw__Towar WHERE tw_Id = @tow

Do zmiennej @grup pobierasz identyfikator grupy towaru, który jest w inserted (na razie pomijam wiele rekordów w inserted)
Załóżmy, że @grup=15

Następnie sprawdzasz (podmieniam zmienną @grup na założoną wartość):
IF
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND 15 = 27)
AND
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND 15 <> 27)

Jakim cudem coś może być jednocześnie równe oraz różne od określonej wartości?


Tytuł: Odp: Trigger blokujący zapis dokumentu
Wiadomość wysłana przez: Maciek w Listopad 24, 2017, 13:28:48
Cały czas popełniasz ten sam błąd. Odnosisz się do jednej pozycji.

SELECT @grup = tw_IdGrupa FROM tw__Towar WHERE tw_Id = @tow

Do zmiennej @grup pobierasz identyfikator grupy towaru, który jest w inserted (na razie pomijam wiele rekordów w inserted)
Załóżmy, że @grup=15

Następnie sprawdzasz (podmieniam zmienną @grup na założoną wartość):
IF
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND 15 = 27)
AND
EXISTS (SELECT * from dok_Pozycja where ob_DokMagId = @pid AND 15 <> 27)

Jakim cudem coś może być jednocześnie równe oraz różne od określonej wartości?

Dziękuję :) dopiero na Twoim przykładzie zrozumiałem błąd. Po zmianie jak niżej wszystko działa :))

AND
EXISTS (SELECT * from dok_Pozycja JOIN tw__Towar ON ob_TowId = tw_Id AND ob_DokMagId = @pid AND tw_IdGrupa = 27)
AND
EXISTS (SELECT * from dok_Pozycja JOIN tw__Towar ON ob_TowId = tw_Id AND ob_DokMagId = @pid AND tw_IdGrupa <> 27)