API i promocje - problemy

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

Moderator: mikey

Smallsoso
Posty: 131
Rejestracja: 25 wrz 2008, 13:31
Rola: Inny
Wersja: 9.5

API i promocje - problemy

Post autor: Smallsoso »

Witam,

W swojej firmie męczę aplikację w .NET do zarządzania promocjami w CDN XL.
No i oczywiście napotykam na problemy.
1. Przy wywoływaniu funkcji API program zajmuje coraz więcej miejsca w pamięci (wg programów do analizowania pamięci programów wszystko to przez unmanaged code. Przy wielu promocjach i towarach do dodania to w krótkim czasie mam już ponad 1GB użycia pamięci i tylko czekam na OutOfMemory Exception ;)
2. Drugi problem jest poważniejszy od tych wycieków. Otóż wszystko jest fajnie do momentu zrobienia XLLogout() - w tym momencie z CDN znikają wszystkie promocje przeze mnie wprowadzone :( . Zakładam te promocje z poziomu kodu jako niepotwierdzone (prm_Stan = 0), aby operator mógł je sprawdzić i ręcznie zatwierdzić. No ale niestety - nigdy ich nie zauważy u siebie...
Może komuś przydadzą się poniższe informacje do pomocy:

Kod: Zaznacz cały

XLLoginInfo_17 LoginInfo = new XLLoginInfo_17();
LoginInfo.Baza = XLBaza;
LoginInfo.OpeHaslo = "";
LoginInfo.OpeIdent = XLOpeIdent;
LoginInfo.ProgramID = "ImportPromocji";
LoginInfo.Winieta = -1;
LoginInfo.SerwerKlucza = SerwerKlucza;
LoginInfo.UtworzWlasnaSesje = 1;
LoginInfo.TrybWsadowy = 1;
LoginInfo.Wersja = XLWersja;

int ret = cdn_api.cdn_api.XLLogin(LoginInfo, ref XlSesja);
Program raz odpala XLLogin, później XLNowaPromocja lub XLOtworzPromocja, następnie zależnie od potrzeb XLDodajTowarDoPromocji, XLUsunTowarZPromocji i inne, później

Kod: Zaznacz cały

 cdn_api.XLZamkniecieDokumentuPrmInfo_17 dok = new XLZamkniecieDokumentuPrmInfo_17();
dok.ID = prmID;
dok.Stan = (int)stan; // stan = 0
dok.Tryb = 2; //Tryb wsadowy
dok.Wersja = (int) wersja;
int res = cdn_api.cdn_api.XLZamknijPromocje((int)sesja, prmID, dokZamkniecia);
i res = 0 po wykonaniu zamknięcia.
Na samym końcu grzecznie wykonuję XLLogout (który powoduje tyle zamieszania).

Jak dla mnie powyższa ścieżka pracy z API jak najbardziej odpowiada temu, co Comarch zawarł w dokumentacji API w "Algorytmie postępowania".

P.S. O pomoc z powyższymi problemami poprosiłem Comarch via asysta_xl, ale wydaje mi się, że z waszej strony mogę liczyć na pomoc.

Marcin

Smallsoso
Posty: 131
Rejestracja: 25 wrz 2008, 13:31
Rola: Inny
Wersja: 9.5

Re: API i promocje - problemy

Post autor: Smallsoso »

Może ktoś przetestować u siebie, czy też przy korzystaniu z API do promocji i wylogowaniu znikają mu dane z systemu?

Czy jest sposób na to, by z aplikacji "wyciąć" swoją sesję z CDN? Bo jak pozamykam swoje promocje i wytnę sesję, to one pozostaną w CDN.

Poniżej zamieściłem fragment kodu w C# - wystarczy zamienić XXX na odpowiednie wartości. W kodzie sugeruję wstawienie breakpointa przed wywołaniem XLLogout w celu sprawdzenia, czy promocję widać w systemie.

Kod: Zaznacz cały

XLLoginInfo_17 LoginInfo = new XLLoginInfo_17();
int ret;

LoginInfo.Baza = Baza;
LoginInfo.OpeHaslo = "XXX";
LoginInfo.OpeIdent = "XXX";
LoginInfo.ProgramID = "testowe";
LoginInfo.Winieta = -1;
LoginInfo.SerwerKlucza = "XXX";
LoginInfo.UtworzWlasnaSesje = 1;
LoginInfo.TrybWsadowy = 1;

LoginInfo.Wersja = 17;
int xlsesja = 0; ;

ret = cdn_api.cdn_api.XLLogin(LoginInfo, ref xlsesja);

XLDokumentPrmNagInfo_17 prm = new XLDokumentPrmNagInfo_17();
prm.Wersja = 17;
prm.Akronim = "TESTOWA PROMOCJA";
prm.Priorytet = 100;
int id = 0;
ret = cdn_api.cdn_api.XLNowaPromocja(xlsesja, ref id, prm);
XLKontrahentPrmInfo_17 knt = new XLKontrahentPrmInfo_17();
knt.Akronim = "XXX";
knt.Wersja = 17;
knt.PrmID = prm.ID; // odwołanie przez prm.ID, ponieważ w id znajduje się jakaś losowa liczba (albo identyfikator czegoś innego)
ret = cdn_api.cdn_api.XLDodajKontrahentaDoPromocji(xlsesja, knt);
XLTowarPrmInfo_17 twr = new XLTowarPrmInfo_17();
twr.Kod = "XXX";
twr.PrmID = prm.ID;
twr.Wersja = 17;
twr.Wartosc = "1000";
ret = cdn_api.cdn_api.XLDodajTowarDoPromocji(xlsesja, twr);
/*Jak ktos chce, to może dodać jeszcze centrum do promocji
XLFrsPrmInfo_17 frs = new XLFrsPrmInfo_17();
frs.Wersja = 17;
frs.PrmID = prm.ID;
frs.FrsID = XXX;
ret = cdn_api.cdn_api.XLDodajCentrumDoPromocji(xlsesja, frs);
*/
XLZamkniecieDokumentuPrmInfo_17 zam = new XLZamkniecieDokumentuPrmInfo_17();
zam.ID = prm.ID;
zam.Wersja = 17;
zam.Tryb = 2;//Wsadowy
zam.Stan = 0;//Bufor - zatem nawet jak nie skasuje tej promocji, to nic nie powinna zmienić
ret = cdn_api.cdn_api.XLZamknijPromocje(xlsesja, prm.ID, zam);

//Tutaj sugeruję wstawienie breakpointa, aby sprawdzić, czy widać tę promocję w CDN

cdn_api.cdn_api.XLLogout(xlsesja);

//Po wykonaniu XLLogout nie ma u mnie tej promocji w CDN...
P.S. Mam nadzieję, że Comarch nie będzie się tłumaczył, że problem jest już im znany i został poprawiony w wersji xxx.xx.xx
Pozdrawiam,
Marcin
---------------------------------------------------------------------------------
Tako rzecze dokumentacja tabel CDN XL 7.1
TwrZasoby TwZ_DataP INTEGER Data przyjęcia towaru na magazyn Potrzebne przy podróżach w czasie.

Smallsoso
Posty: 131
Rejestracja: 25 wrz 2008, 13:31
Rola: Inny
Wersja: 9.5

Re: API i promocje - problemy

Post autor: Smallsoso »

Witam,

znalazłem przyczynę moich problemów z usuwaniem moich promocji po XLLogout i może kiedyś innym się to przyda przy walkach z API.
Otóż

Kod: Zaznacz cały

cdn_api.cdn_api.XLNowaPromocja(xlsesja, ref id, prm);
jako ref id zwraca wartość pola OBO_IdObiektu z tabeli cdn.ObiektyObce. Analogicznie ta wartość zwracana jest w funkcji cdn_api.XLOtworzPromocje.
Jak się okazuje, wartość tę należy podać w drugim parametrze w

Kod: Zaznacz cały

cdn_api.cdn_api.XLZamknijPromocje(xlsesja, id, zam);
- ja tutaj popełniałem błąd wstawiając tam prm_ID.
Dlaczego jednak Comarch nie mógł tego jasno napisać w dokumentacji API?
Cytuję dokumentację:
Prototyp i opis działania funkcji
XLNowaPromocja(SesjaID As Long, DokumentID As Long, DokumentPrmNagInfo As XLDokumentPrmNagInfo) As Long
Funkcja na podstawie przekazanej struktury DokumentPrmNagInfo tworzy promocję. W parametrze DokumentID zwraca identyfikator tworzonej promocji. Funkcja pozwala na dodanie promocji typu PRM, KNU i CEN.
Dlaczego w drugim zdaniu opisu nie mogli dodać informacji, co to dokładnie jest DokumentID?

Marcin
Pozdrawiam,
Marcin
---------------------------------------------------------------------------------
Tako rzecze dokumentacja tabel CDN XL 7.1
TwrZasoby TwZ_DataP INTEGER Data przyjęcia towaru na magazyn Potrzebne przy podróżach w czasie.

gorg
Posty: 8
Rejestracja: 31 paź 2009, 19:12
Rola: Administrator CDN XL
Wersja: 9.6

Re: API i promocje - problemy

Post autor: gorg »

Również mam problem z wyciekami pamięci podczas obsługi funkcji API. Serwis pracujący na serwerze przez całą dobę cyklicznie loguje się do bazy CDNXL, wystawia dokumenty a następnie wylogowuje się. Problem w tym, że po kilkudziesięciu godzinach pracy serwer dostaje czkawki by po jakimś czasie wysypać się całkiem. Analiza problemu wykazała wycieki pamieci - wykonanie XLLogout nie zwalnia całej pamieci. Dopiero zatrzymanie serwisu i ponowne jego uruchomienie uwalnia alokowaną pamięć. Problem rozwiązałem za pomocą innego serwisu, który zarząda głównym serwisem i "przeładowuje" go cyklicznie. Niestety jest to tylko obejście problemu a nie jego rozwiązanie. Czy zna ktoś przyczynę tych wycieków i metod rozwiązania problemu? Serwis skompilowany jest w DELPHI 6.
PS.
Do testów skompilowałem prostą aplikację wykonującą wyłącznie XLLogin i XLLogout w pętli na przykład 200 razy. Menedżer zadań dla procesu wyraźnie pokazuje rosnącą pamięć.

corso
Posty: 32
Rejestracja: 01 paź 2014, 07:55
Rola: Użytkownik CDN XL
Wersja: 8.0

Re: API i promocje - problemy

Post autor: corso »

Czy ten problem nadal występuje ?

ODPOWIEDZ