Strona 1 z 1
COM - Insert Powoduje Konflikt
: 22 mar 2020, 09:11
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.
Re: COM - Insert Powoduje Konflikt
: 22 mar 2020, 10:04
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
Re: COM - Insert Powoduje Konflikt
: 22 mar 2020, 11:23
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);
}
Re: COM - Insert Powoduje Konflikt
: 22 mar 2020, 15:27
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
Re: COM - Insert Powoduje Konflikt
: 22 mar 2020, 15:40
autor: kluchol
Ok dziękuję bardzo już zmieniam. Będę wiedział lada moment czy wszystko gra.
Re: COM - Insert Powoduje Konflikt
: 22 mar 2020, 17:56
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
Re: COM - Insert Powoduje Konflikt
: 23 mar 2020, 11:15
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
Re: COM - Insert Powoduje Konflikt
: 23 mar 2020, 11:33
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.
Re: COM - Insert Powoduje Konflikt
: 26 mar 2020, 10:00
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 :/