COM - Insert Powoduje Konflikt

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, obiekty COM .NET

Moderator: mikey

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

COM - Insert Powoduje Konflikt

Post autor: kluchol »

Cześć,

tworzę w Optimie przez COM Api dokumenty wz, jednak podczas dodawania towarów na dookument często mam błąd:

Instrukcja INSERT powoduje konflikt z ograniczeniem FOREIGN KEY „FK_TrETowar”. Konflikt występuje w bazie danych „CDN_optima” w tabeli „CDN.Towary”, column 'Twr_TwrId'.

Wiecie może jak ustrzec się tego błędu?

Pozdrawiam.

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: COM - Insert Powoduje Konflikt

Post autor: elmiq »

Opcje masz w zasadzie dwie:
-Sprawdzisz indeks FK_TreTowar i zobaczysz w swoim kodzie, co może powodować błąd.
-Wkleisz kod i ktoś zobaczy co powoduje błąd.

Bez kodu raczej nikt nie wywróży co jest nie tak jak trzeba :)

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

Re: COM - Insert Powoduje Konflikt

Post autor: kluchol »

Mój kod, w którym mam błąd:

Kod: Zaznacz cały

var query = "SELECT COUNT(TrN_TrNID) FROM CDN.TraNag Where TrN_NumerPelny = '" + message.data.shipmentDocument.request_id + "'";
                        object recs;
                        var connection = Session.Connection;
                        var Execute = connection.Execute(query, out recs);
                        int existDocument = 0;

                        for (int j = 0; j < Execute.RecordCount; j++)
                        {
                            existDocument = Execute.Fields[0].Value;
                        }

                        if (existDocument > 0)
                        {
                            throw new Exception("Document WZ For Orders Exist");
                        }


                        var con = Session.Connection.ConnectionString;
                        log.Info("Start crating Goodies Document");
                        CDNHlmn.DokumentyHaMag Rezerwacje = (CDNHlmn.DokumentyHaMag)Session.CreateObject("CDN.DokumentyHaMag", null);
                        CDNHlmn.IDokumentHaMag Rezerwacja = (CDNHlmn.IDokumentHaMag)Rezerwacje.AddNew(null);
                        string reference = message.data.order.id;
                        string shipmentDocumentId = message.data.order.shipment_document_id;
                        // int clientId = clientSetForDocument(message.data.order, reference);
                        CDNBase.ICollection Kontrahenci = (CDNBase.ICollection)(Session.CreateObject("CDN.Kontrahenci", null));
                        CDNHeal.IKontrahent Kontrahent = (CDNHeal.IKontrahent)Kontrahenci["Knt_Kod='DETALICZNY'"];
                        CDNHlmn.AtrybutHaMag Atrybuty = (CDNHlmn.AtrybutHaMag)Session.CreateObject("CDN.AtrybutHaMag", null);
                        Rezerwacja.Podmiot = (CDNHeal.IPodmiot)Kontrahent;
                        Rezerwacja.Rodzaj = 306000;
                        // WZ 
                        Rezerwacja.TypDokumentu = 306;
                        Rezerwacja.Bufor = 1;
                        Rezerwacja.MagazynZrodlowyID = configOptima.default_warehouse_id;
                        DateTime localDate = DateTime.Now;
                        Rezerwacja.DataDok = localDate;
                        Rezerwacja.Export = 0;
                        Rezerwacja.WalutaSymbol = "PLN";
                        Rezerwacja.TypNB = 2;
                        CDNBase.ICollection Pozycje = Rezerwacja.Elementy;
                        string order_id = message.data.order.id;
                        string carrier = message.data.order.carrier;
                        bool cod = message.data.order.cod;
                        foreach (dynamic item in message.data.shipmentDocument.items)
                        {
                            try
                            {
                                decimal priceGross = 0;
                                foreach (dynamic it in message.data.order.items)
                                {
                                    if (item.sku == it.sku)
                                    {
                                        priceGross = Convert.ToDecimal(it.price_gross);
                                        break;
                                    }
                                }
                                CDNHlmn.IElementHaMag Pozycja = (CDNHlmn.IElementHaMag)Pozycje.AddNew(null);
                                double quantity = Convert.ToDouble(item.quantity);
                                string sku = item.sku;
                                // decimal priceNet = Convert.ToDecimal(item.price_net);

                                Pozycja.TowarKod = sku;
                                Pozycja.Ilosc = quantity;
                                Pozycja.Cena0 = decimal.Round(priceGross, 2);
                                Pozycja.Rabat = 0;

                            }
                            catch (System.Runtime.InteropServices.COMException ex)
                            {
                                Session.Login.ClearState();
         a tego try mam błąd ---> 
                                string errorMsg = "Can't Add item to document: " + item.description + " SKU: " + item.sku + " Exception: " + ex.Message;
                                LogServices.sendLogToQueue(order_id, errorMsg, "", "", "ERROR");
                                string ooNumber = message.data.order.number;
                                string cccNumber = message.data.order.client_order_number;
                                log.Error(errorMsg);
                            }
                        }

                        decimal shipmentPrice = message.data.order.shipment_price;
                        try
                        {
                            if (shipmentPrice > 0)
                            {
                                int ItemId = (cod) ? 2149 : 2150; // Default GLS
                                string ups = @"UPS";
                                string dhl = @"DHL";
                                Match matchUPS = Regex.Match(carrier, ups, RegexOptions.IgnoreCase);
                                Match matchDHL = Regex.Match(carrier, dhl, RegexOptions.IgnoreCase);
                                if (matchUPS.Success)
                                {
                                    ItemId = (cod) ? 2147 : 2145;
                                }
                                if (matchDHL.Success)
                                {
                                    ItemId = (cod) ? 2974 : 2975;
                                }

                                try
                                {
                                    CDNHlmn.IElementHaMag Pozycja = (CDNHlmn.IElementHaMag)Pozycje.AddNew(null);
                                    CDNTwrb1.Towary Towary = (CDNTwrb1.Towary)Session.CreateObject("CDN.Towary", null);
                                    CDNTwrb1.ITowar Towar = (CDNTwrb1.ITowar)Towary["Twr_TwrId=" + ItemId];
                                    Pozycja.TowarID = Towar.ID;
                                    decimal stawka = (Towar.Stawka / 100) + 1;
                                    decimal price = shipmentPrice / stawka;
                                    Pozycja.Cena0 = decimal.Round(shipmentPrice, 2);
                                    Pozycja.Rabat = 0;
                                }
                                catch (System.Runtime.InteropServices.COMException ex)
                                {
                                    IsWorking = false;
                                    Session.Login.ClearState();
                                    log.Error("1: " + ex.Message);
                                    LogServices.sendLogToQueue(order_id, "1 Item error: " + ex.Message, "", "", "ERROR");
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            IsWorking = false;
                            Session.Login.ClearState();
                            log.Error(ex.Message);
                            LogServices.sendLogToQueue(order_id, "Error create document in Optima: " + ex.Message, "", "", "ERROR");
                            string ooNumber = message.data.order.number;
                            string ccNumber = message.data.order.client_order_number;
                        }
                        Rezerwacja.Uwagi = message.data.order.number + "[" + message.data.order.client_order_number + "]";
                        Session.Save();
                        if (orderType != "Sieci")
                        {
                            sendGoodsDispathToLinker(message.data.order, Rezerwacja.NumerPelny);
                            clearFolder(SpoolerPath);
                        }
                        string orderNumber = message.data.order.number;
                        string documentNumber = Rezerwacja.NumerPelny;
                        string cNumber = message.data.order.client_order_number;
                        LogServices.sendLogToQueue(order_id, "Goods dispatch document create in Optima for order [%orderNumber%] document number [%documentNumber%]", orderNumber, documentNumber);
                    }

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: COM - Insert Powoduje Konflikt

Post autor: elmiq »

Nie podajesz wszystkich wymaganych pól dla dodawanego towaru - po prostu ustawiasz sam kod na pozycji. Sugeruje skorzystać z interface CDNTwrb1.Towar i obiekt takiego typu przypisywać do Pozycja.Towar.

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

Re: COM - Insert Powoduje Konflikt

Post autor: kluchol »

Ok dziękuję bardzo już zmieniam. Będę wiedział lada moment czy wszystko gra.

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

Re: COM - Insert Powoduje Konflikt

Post autor: kluchol »

Niestety to samo:
Instrukcja INSERT powoduje konflikt z ograniczeniem FOREIGN KEY „FK_TrETowar”. Konflikt występuje w bazie danych „CDN_BAZA” w tabeli „CDN.Towary”, column 'Twr_TwrId'.
i dodatkowo:
SKU: S36 Exception: %Par1%=SCHAR - QUADRITOS - wafelki w czekoladzie bezglut %Par2%=1.0000
i jeszcze:
%s1%=S36%s2%=SCHAR - QUADRITOS - wafelki %s3%=MAG GL%s4%=2020-03-25%s5%=1.0000%s6%=OPAK
naprawde nie wiem co to znaczy

elmiq
Posty: 1025
Rejestracja: 23 sie 2010, 10:04
Rola: Administrator CDN XL
Lokalizacja: Warszawa

Re: COM - Insert Powoduje Konflikt

Post autor: elmiq »

Generalnie ciężko mi się wypowiadać, bo do końca nie wiem co i jak robisz. Obiekt masz nazwany Rezerwacja, ale tworzysz WZ. Do tej WZ dodajesz element i w momencie gdy go dodajesz dostajesz błąd z poziomu SQL o tym, że poszedł insert na TraElem dla którego próbowałeś do Tre_TwrId wrzucić ID nieistniejące w CDN.Towary. Pierwszy krok, to zrobienie breakpointa przed dodaniem pozycji i sprawdzenie jakie ID towaru jest w obiekcie który utworzyłeś za pomocą interface. Następnie sprawdzasz czy masz to w bazie, ewentualnie patrzysz w profiler co on próbuje dodać w tym insercie. Tak do końca nie umiem debugować na forum, więc przepraszam jeśli napisałem zbyt ogólnie.

Pozdrawiam,
Mateusz
Mateusz Świerkosz

http://elmiq.blogspot.com/

kluchol
Posty: 11
Rejestracja: 28 lut 2019, 10:18
Rola: Inny
Wersja: 2019

Re: COM - Insert Powoduje Konflikt

Post autor: kluchol »

Dzięki, wiem kod słabo czytelny. Jednak wiem że, ten kod nie jest winny w samej Optimie coś jest nie hallo. Po restarcie serwera działa, wszystko, dodaj się dokumenty bez problemu. Aż coś się dzieje na któryms użytkowniku i nagle nie możę stworzyć żadnego dokumentu WZ, niezależnie od towaru który na nim jest. Po restarcie serwera SQL wszystko wraca do normy.

Szukam dalej.
Dzięki jeszcze raz.

Gabik
Posty: 26
Rejestracja: 05 sty 2019, 23:46
Rola: Inny
Wersja: 2018

Re: COM - Insert Powoduje Konflikt

Post autor: Gabik »

Pierwsza kwestia. Przepnij się na biblioteki Optimy 2020.3. są czytelniejsze komunikaty błędów
Sprawdź czy za każdym razem jak uruchamiasz metodę dodania dokumentu to tworzysz nową sesje a stara jest usunięta.
Jeśli masz sesję utworzoną godzinę temu ktoś w międzyczasie doda towar z poziomu Optimy to może się pojawić tego typu błąd.
Musiałbym us siebie uruchomić kod żeby to lepiej przeanalizować, ale teraz nie mam czasu :/
Pozdrawiam
Gabriel Gabzdyl 511 403 091 gabrielg@elte-s.com
Firma: https://elte-s.com/ Sklep: https://sklep.elte-s.com/

ODPOWIEDZ