Update kodów EAN (problem z duplikacją / troggerem)

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, API, Hydra, .NET

Moderator: mikey

Tyriado
Posty: 31
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Update kodów EAN (problem z duplikacją / troggerem)

Post autor: Tyriado »

Cześć,

Mam listę zapytań w stylu (czasem jest zapytanie bez kodu EAN, jeśli nie udostępnia go producent) :

Kod: Zaznacz cały

UPDATE CDN.TwrKarty SET Twr_Nazwa = 'NAZWA_PRODUKTU' , Twr_Ean = 'KOD_EAN' WHERE CDN.TwrKarty.Twr_Kod='KOD_PRODUKTU;
Jednak dla produktów, dla których EAN z bazie już jets podany wyrzuca mi error odnośnie jego zduplikowania związany jak podejrzewam z jego treści z trigerem TwrKartyEAN_InsertUpdateHandler :

Kod: Zaznacz cały

Msg 50000, Level 16, State 1, Procedure TwrKartyEAN_InsertUpdateHandler, Line 65
Zduplikowany EAN (5907577430856) 


Oczywiście cały wiersz nie robi UPDATEu, więc musze usunąc kod EAN z jego treści i wtedy jest ok.
Czy jest jakieś rozwiązanie na to?
Pomyślałem o wyłączeniu triggera z poziomu studia, bo chyba jest taka możliwość na czas wykonania UPDATEu, ale to chyba nie jest najlepszy pomysł. Druga opcja to rzeczywiście usunięcie tych kodów z zapytań, ale czy jest sposób, aby kolejne zapytania się wykonywały dalej i na końcu wyrzuciło listę wszystkich "błędów", łatwiej będzie poprawić to na koniec niż po kolei pojedynczo.

Pozdrawiam

StabiL
Posty: 47
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: StabiL »

Jest sobie parametr Kontroluj EAN w Konfiguracji > Sprzedaż>Kody EAN
masz sobie 'czeka', który włącza/wyłącza unikalność EANów.

Jakbym miał robić to przez tego właśnie checkboxa

EDIT
Z ciekawości popatrzyłem co on konkretnie włącza:

Kod: Zaznacz cały

ALTER TABLE CDN.TwrKarty ENABLE TRIGGER TwrKartyEAN_InsertUpdateHandler;  
ALTER TABLE CDN.TwrKody ENABLE TRIGGER TwrKodyEAN_InsertUpdateHandler;  
ALTER TABLE CDN.TwrZasoby ENABLE TRIGGER TwrZasobyEAN_InsertUpdateHandler;  
ALTER TABLE CDN.Dostawy ENABLE TRIGGER DostawyEAN_InsertUpdateHandler;

Tyriado
Posty: 31
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: Tyriado »

Dzięki, muszę to przetestować, bo jak napisałeś włącza lub wyłącza teiger i pewnie będzie działało ok na zasadzie.
1. Wyłączenie check
2. Update
3. Włączenie checka
Swoją drogą pewnie podobnie zadziałałoby wrzucenie przed updateami alter fablr na wyłączenie i potem na końcu na włączenie. Efekt powinien teoretycznie być podobny 😉

StabiL
Posty: 47
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: StabiL »

Jeszcze tak zapytam, bo nie wiem czy dobrze rozumiem. Ten duplikat to Ci blokuje na tym samym kodzie towarowym, czy przewidujesz ze różne kody towarowe mogą mieć ten sam EAN ?

Tyriado
Posty: 31
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: Tyriado »

Raczej na tym samym, bo:
1. Wyszukanie w studio po kodzie EAN w tabeli TwrKarty daje wynik tego kodu produktu (1 pozycja),
2. Wyszukanie w XLu po EAN też wyrzuca ten produkt (o tym kodzie z zapytania)
3. Nawet przed Update była kontrola, bo jak chciałem z ciekawości wstawić ten EAN do innego kodu bezpośrednio w XLu to wyrzuca komunikat, że towar o podanym kodzie istnieje.
Po tym wszystkim stwierdzam, że blokada jest na tym samym kodzie towarowym i EANy są unikalne.

Przy błędzie UPDATEu nazwa się nie zmienia, jak usunę EAN z UPDATEu nazwa się zmienia. Po prostu wygląda to tak, że jak towar ma wpisany taki sam EAN jak ten w zapytaniu to jest błąd odnośnie duplikatu.

StabiL
Posty: 47
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: StabiL »

To tak na szybko, ja bym się nie bawił w wyłączanie triggerów w takim razie. Nie wiem na podstawie czego robisz te update'y (skąd ta lista i czy sam możesz ja zbudować). Zakładając, że jest to jakiś EXCEL to bym go wrzucił do bazy i przy update dodał warunek, gdzie eanExcel <> eanZXLa albo eanZXLa jest pusty. Można by też dodać exists czy w ogóle taki EAN jest bazie na tej tabeli. Tym samym warunkiem ogarnąłbym update samych nazw.

Tyriado
Posty: 31
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: Tyriado »

Lista jest od producenta, więc jest prawidłowa. Fakt, że jets w EXCELu ale tam generuję masowo zapytania za pomocą "formuły" w ostatniej komórce arkusza. Potem kopiowałem całość do studia. Pomyślałem, że podmienię EAN, nawet jeśli jest wpisany identyczny dla danego kodu towaru (bo to go faktycznie i tak nie zmieni). Nie zastanowiłem się, że kontrola może tez wystąpić przy UPDATEcie bezpośrednio w bazie, tego nie przewidziałem.

Masz na myśli dodania w miejsce podmiany Twr_Ean w UPDATE czegoś w stylu(?):

Kod: Zaznacz cały

IF CDN.TwrKarty.Twr_Ean=='KOD OD PRODUCENTA' pomiń ELSE Twr_Ean='KOD OD PRODUCENTA'
W sumie świetny pomysł, tylko musiałbym znaleźć jakiś przykład na te IFy, bo w każdym innym wypadku jeśli EAN jets inny niż taki sam należy go zmienić (bo wtedy jets stary lub go nie ma). Jakbym to dobrze zrobił to dalej zapytania mógłbym sprytnie wygenerować w EXCELu, oczywiście po odpowiedniej zmianie formuły.

StabiL
Posty: 47
Rejestracja: 28 cze 2017, 15:41
Rola: Konsultant CDN XL

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: StabiL »

Co nie znaczy, że producent nie popełnia błędów :)

Tak na szybko posiłkując się Twoim zapytaniem dodałem warunek, przez który nie zrobi sie update, gdy EAN występuje gdziekolwiek w tabeli:

Kod: Zaznacz cały

UPDATE CDN.TwrKarty SET Twr_Nazwa = 'NAZWA_PRODUKTU' , Twr_Ean = 'KOD_EAN' WHERE CDN.TwrKarty.Twr_Kod='KOD_PRODUKTU' AND NOT EXISTS (SELECT * FROM CDN.TwrKarty WHERE Twr_Ean = 'KOD_EAN')
Niemniej jednak skoro to jakaś forma tabelki z usystematyzowaną strukturą, wrzucałbym to do bazy danych i w SSMS budował zapytanie.

Tyriado
Posty: 31
Rejestracja: 07 kwie 2023, 09:30
Rola: Użytkownik CDN XL
Wersja: 2023

Re: Update kodów EAN (problem z duplikacją / troggerem)

Post autor: Tyriado »

Oczywiście, że to nie oznacza błędów u producenta, ale zakładam, że bezpośrednio otrzymane od niego dane powinny być najbardziej aktualne.
StabiL pisze:
18 maja 2023, 15:43
Niemniej jednak skoro to jakaś forma tabelki z usystematyzowaną strukturą, wrzucałbym to do bazy danych i w SSMS budował zapytanie.
Nie dotarłem jeszcze do obsługi EXCELa w SSMS ;), chyba, że masz na myśli stworzenie dodatkowej tabeli w bazie, wrzucenia tam zawartości EXCELa i wtedy operacje bezpośrednio na tych dwóch tabelach. Chociaż w tym wypadku wydaje się to dłuższym rozwiązaniem - dane otrzymuje od każdego producenta w takiej samej postaci - właściwie identyczna struktura tabel, więc tu wklejam w pierwsza komórkę formułę, klikam dwa razy i właściwie mam ciąg zapytań , tak to wymyśliłem.

Co do Twojego zapytania, to czy warunek:

Kod: Zaznacz cały

AND NOT EXISTS (SELECT * FROM CDN.TwrKarty WHERE Twr_Ean = 'KOD_EAN')
Nie spowoduje, że zapytanie nie wykona się w ogóle? Tzn, nie zmieni się ani nazwa, ani EAN, jakby nie wytnie tylko Twr_Ean = 'KOD_EAN', ale nie wykona go w ogóle (zostanie pominięte). Jak dobrze rozumiem nie spełni się WHERE, więc nie wykona się zapytanie. Przez to mając powiedzmy w bazie już 100 kodów EAN wpisanych nie zmienię 100 nazw i w tym jest problem.

Nie wiem, coś w stylu :

Kod: Zaznacz cały

IF (NOT EXISTS (SELECT * FROM CDN.TwrKarty WHERE Twr_Ean = 'KOD_EAN'))
UPDATE CDN.TwrKarty SET Twr_Nazwa = 'NAZWA_PRODUKTU' , Twr_Ean = 'KOD_EAN' WHERE CDN.TwrKarty.Twr_Kod='KOD_PRODUKTU' 
ELSE
UPDATE CDN.TwrKarty SET Twr_Nazwa = 'NAZWA_PRODUKTU' WHERE CDN.TwrKarty.Twr_Kod='KOD_PRODUKTU'
, ale nie wiem czy to zadziała, tak wymyśliłem szczerze mówiąc na logikę to.

PS: Dzięki za dyskusję :)

ODPOWIEDZ