InsERT GT => Dodatki - zestawienia - sfera => Wątek zaczęty 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?
-
(@grup = 27 AND @grup <> 27)
To nigdy nie jest prawdą. :-)
Pokombinuj z select count > 1.
-
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
-
Dziękuję za podpowiedzi, próbuję je właśnie wykorzystać
-
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.
-
(@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ć...
-
(@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.
-
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ł?
-
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?
-
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
-
a gdyby telefon byl kompletem a nie towarem to moze rewizor by sobie sam poradzil?
-
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ć.
-
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.
-
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.
-
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.
-
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.
-
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....?
-
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?
-
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)