COM - Insert Powoduje Konflikt
Moderator: mikey
COM - Insert Powoduje Konflikt
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.
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.
Re: COM - Insert Powoduje Konflikt
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
-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
Re: COM - Insert Powoduje Konflikt
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);
}
Re: COM - Insert Powoduje Konflikt
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
Pozdrawiam,
Mateusz
Re: COM - Insert Powoduje Konflikt
Ok dziękuję bardzo już zmieniam. Będę wiedział lada moment czy wszystko gra.
Re: COM - Insert Powoduje Konflikt
Niestety to samo:
i dodatkowo: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 jeszcze:SKU: S36 Exception: %Par1%=SCHAR - QUADRITOS - wafelki w czekoladzie bezglut %Par2%=1.0000
naprawde nie wiem co to znaczy%s1%=S36%s2%=SCHAR - QUADRITOS - wafelki %s3%=MAG GL%s4%=2020-03-25%s5%=1.0000%s6%=OPAK
Re: COM - Insert Powoduje Konflikt
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
Pozdrawiam,
Mateusz
Re: COM - Insert Powoduje Konflikt
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.
Szukam dalej.
Dzięki jeszcze raz.
Re: COM - Insert Powoduje Konflikt
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 :/
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/
Gabriel Gabzdyl 511 403 091 gabrielg@elte-s.com
Firma: https://elte-s.com/ Sklep: https://sklep.elte-s.com/