API - dodawanie PZ z pliku XML

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

Moderator: mikey

marek1712
Posty: 21
Rejestracja: 25 mar 2011, 12:55
Rola: Inny
Wersja: 10

API - dodawanie PZ z pliku XML

Post autor: marek1712 »

Witam.
Kolejny temat i kolejne problemy xD.

Czytam sobie właśnie dokumentację do API i ciężko mi to rozgryźć w połączeniu z C#. O co chodzi?...
Piszę program do automatycznego importu FZ z plików. No i trochę mi się nie zgadza dokumentacja API z tym, co trzeba napisać.
Ot choćby algorytm postępowania:

Kod: Zaznacz cały

1 XLLogin - inicjalizacja bibliotek CDN-XL, login operatora do bazy danych
2 XLNowyDokument – otwarcie nagłówka nowego dokumentu; powoduje zapisanie w bazie danych otwartego nagłówka dokumentu (w omawianym przypadku jest to faktura sprzedaży)
3 XLDodajPozycje – dodanie pozycji do faktury; wywołanie tej funkcji może nastąpić wielokrotnie, jeżeli do dokumentu chdemy dopisać więcej niż jedną pozycję
4 XLDodajPlatnosc – zapis płatności do tworzonej faktury; wywołanie tej funkcji jest opcjonalne – jeżeli nie zostanie wywołana, system automatycznie wygeneruje płatność domyślną przy zamykaniu faktury; funkcjamoże być wołana wielokrotnie – np. w przypadku specyfikacji płatności ratalnej
5 XLZamknijDokument – zakończenie edycji i zamknięcie dokumentu; dokument może być zamykany w trybie normalnym (zapis bez możliwości późniejszej modyfikacji) lub w trybie „do bufora”
6 XLLogout – w obrębie jednej sesji otwartej funkcją XLLogin możemy wystawić dowolną ilość dokumentów. Wystawienie każdego z nich powinno zaczynać się wywołaniem funkcji XLNowyDokument i kończyć wywołaniem funkcji XLZamknijDokument. 
I tu są schody - bo widzę, że przykładowo trzeba użyć funkcji z klasy:
XLDokumentNagInfo_22 i XLDokumentElemInfo_22 - a one już nie są udokumentowane (Gdzie tu XLDodajPozycje?). No i jadę na czuja. Czy jakiś lepszy programista ode mnie może potwierdzić, czy idę w dobrym kierunku (pole akronim - wiem, do poprawy. To się rozwiąże):

Kod: Zaznacz cały

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                filepaths = Directory.GetFiles(@sciezka, "*.xml");
                foreach (string file in filepaths)
                {
                    ds.ReadXml(file);
                    
                    cdn_api.XLDokumentNagInfo_22 xldokumentnaginfo = new XLDokumentNagInfo_22();
                    xldokumentnaginfo.Wersja = 22;
                    xldokumentnaginfo.Typ = 1521;
                    xldokumentnaginfo.Akronim = ds.Tables[1].Rows[0].ToString(); //TU JEST BŁĄD!!!!!!!!! SKĄDŚ INDZIEJ BRAĆ AKRONIM

                    cdn_api.XLDokumentElemInfo_22 dokumenteleminfo = new XLDokumentElemInfo_22();
                    dokumenteleminfo.Wersja = 22;
                    dokumenteleminfo.Ilosc = ds.Tables[3].Rows.Count.ToString();


                    cdn_api.cdn_api.XLNowyDokument(sesjaID, ref IDokumentID, xldokumentnaginfo);

                    foreach (DataRow row in ds.Tables[1].Rows)
                    {

                        MessageBox.Show(row["NAZWA_DST"].ToString() + " " + row["ID_MAG"].ToString() + " " + row["ID_KLT_DST"].ToString() + 
                            " " + row["NAZWA"].ToString() + " " + row["KLT_NIP"].ToString());
                    }
                    foreach (DataRow row in ds.Tables[2].Rows)
                    {
                        MessageBox.Show(row["NR_DOK"].ToString() + " " + row["RAZEM_NETTO"].ToString() + " " + row["RAZEM_VAT"].ToString() +
                            " " + row["RAZEM_BRUTTO"].ToString() + " " + row["DATA_DOK"].ToString() + " " + row["FORMA_PLAT"].ToString() +
                            " " + row["TERMIN_PLAT"].ToString() + " " + row["NIP_SPR"].ToString() + " " + row["ADR_UL_SPR"].ToString() +
                            " " + row["ADR_KOD_SPR"].ToString() + " " + row["ADR_MIASTO_SPR"].ToString() + " " + row["TERMIN_DNI"].ToString() +
                            " " + row["KNT_MODEM"].ToString());
                    }
                    foreach (DataRow row in ds.Tables[3].Rows)
                    {
                        dokumenteleminfo.TowarEAN = row["EAN"].ToString();
                        cdn_api.cdn_api.XLDodajPozycje(IDokumentID, dokumenteleminfo);
                        MessageBox.Show(row["EAN"].ToString() + " " + row["NAZWA"].ToString() + " " + row["ILOSC_SZT"].ToString() + 
                            " " + row["ILOSC"].ToString() + " " + row["JM"].ToString() + " " + row["PRZELICZ_JM"].ToString() + 
                            " " + row["RABAT_POZ"].ToString() + " " + row["WART_NETTO"].ToString() + " " + row["WART_VAT"].ToString() + 
                            " " + row["WART_BRUTTO"].ToString() + " " + row["CENA_NETTO"].ToString() + " " + row["CENA_NETTO_SZT"].ToString() + 
                            " " + row["GRUPA_VAT"].ToString() + " " + row["STAWKA_VAT"].ToString() + " " + row["PKWIU"].ToString());
                    }
                    cdn_api.XLZamkniecieDokumentuInfo_22 zamknieciedokumentuinfo = new XLZamkniecieDokumentuInfo_22();
                    zamknieciedokumentuinfo.Wersja = 22;
                    cdn_api.cdn_api.XLZamknijDokument(IDokumentID, zamknieciedokumentuinfo);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Poważny błąd");
            }
        }
Takie definicje wstawiłem w samej klasie:

Kod: Zaznacz cały

Int32 sesjaID = 0;
        Int32 IDokumentID = 0;
        string[] filepaths;
        DataSet ds = new DataSet();
Wiem, że muszę jeszcze skorzystać z klasy XLPlatnoscInfo_22 (tej wersji api akurat używam).

EDIT: zmieniłem nazwę tematu bo o inny typ dokumentu chodzi
Ostatnio zmieniony 23 lip 2012, 09:38 przez marek1712, łącznie zmieniany 1 raz.

rafal
Posty: 48
Rejestracja: 02 paź 2009, 16:31
Rola: Inny

Re: API - dodawanie FZ z pliku XML

Post autor: rafal »

Dokumentacji struktur np XLDokumentNagInfo_22 szukaj w sekcjach "Szczegółowy opis pól" przy opisie funkcji w dokumentacji.
Algorytm postępowania masz dobry, ale proponuje dodać obslugę błędów każda funkcja Api zwraca kod błędu jeśli się nie uda jej wykonać.
Ogólnie api cdna jest dziurawe i nie zawsze zgodne z dokumentacją i zaskoczy Cię nie raz np zamiast błędu wyskoczy message.box z cdna;)

rafalW
Posty: 60
Rejestracja: 15 sty 2012, 14:13
Rola: Inny
Lokalizacja: Puławy

Re: API - dodawanie FZ z pliku XML

Post autor: rafalW »

Dla porzadku ustaw jeszcze

Kod: Zaznacz cały

xldokumentnaginfo.Tryb = 2
Tryb wsadowy, czyli XL nie bedzie Cie straszyc MsgBox'ami, w razie porazki zwroci numer bledu
No i wlasnie, jak juz wspomnial Rafal, nie sprawdzasz co zwracaja funkcje. Bardzo optymistyczne podejscie, niestety dosc nierozsadne w przypadku api :D

Kod: Zaznacz cały

int result = cdn_api.cdn_api.XLNowyDokument(sesjaID, ref IDokumentID, xldokumentnaginfo);
if (result != 0)
{
  MessageBox.Show(String.Format("XLNowyDokument failed: {0}", result));

  return; //wychodzimy, kazda kolejna metoda i tak zwroci blad 
}
Opisy bledow masz w sekcji "Zwracane wyniki"

marek1712
Posty: 21
Rejestracja: 25 mar 2011, 12:55
Rola: Inny
Wersja: 10

Re: API - dodawanie FZ z pliku XML

Post autor: marek1712 »

Koledzy - dziękuję za informacje :)
Podejście optymistyczne, bo to dopiero projekt programu ;) Planowałem to opakować w funkcje informujące o problemach - na razie chcę jednak dodać "gołe" wstawianie do bazy danych (oczywiście testowej). Udoskonalać będę potem - i pewnie będę dalej pytania zadawał.
Tak czy siak - jadę z robotą dalej. Na razie dzięki za informacje.

EDIT: a możecie troszkę bardziej rozpisać się nt. dziur w API? Comarch nie wie co i gdzie wstawić do bazy swojego programu? :P

rafal
Posty: 48
Rejestracja: 02 paź 2009, 16:31
Rola: Inny

Re: API - dodawanie FZ z pliku XML

Post autor: rafal »

Ciekawe przypadki w api:
-Api zwraca błędu, których nie ma w dokumentacji i tak np XLDodajPozycje potrafi zrócic błąd minus 11, którego api nie opisuje. Co ciekawe jak spróbuje dodać dokładnie ta sama pozycje po odczekaniu 1 sekundy api dodaje pozycje bez problemu

-Kolejnym problemem sa messageboxy z cdna jak wystąpi np deadlock występuja one nie zależnie od tego czy masz ustawiony tryb wsadowy czy nie po kliknieciu przycisku Ok oczywiscie dostaniesz odpowiedniu bład tj. 106.

-W funkcji XLNowyDokument uzupełniamy strukture XLDokumentNagInfo, ktora ma właściowość Typ - gdzie wprowadzany jest rodzaj dokumentu i tak wg dokumentacji api
FS to 3 lub 2033, żeby wystawić koretkę reczną Awista trzeba ustawić pola Korekta i Awista na 1 i nie podawać dokumentu źródłowego. Tylko że to działa tylko jak pole Typ ustawimy na 3 jak ustawimy na 2033 to już nie działa.

Może ktos jeszcze ma jakies ciekawe przypadki z api

lolek2
Posty: 100
Rejestracja: 23 gru 2011, 21:17
Rola: Administrator CDN XL
Wersja: 10
Kontakt:

Re: API - dodawanie FZ z pliku XML

Post autor: lolek2 »

W trybie wsadowym czasami dodając więcej sztuk towaru niż jest na magazynie zamiast wyrzucić błąd dodaje tyle sztuk ile jest na magazynie bez żadnego komunikatu.

Do tej pory nie udało mi się wyśledzić w jakim konkretnie przypadku się tak dzieje. Ponieważ zdarza się to około 1 na 10k dokumentów.

rafalW
Posty: 60
Rejestracja: 15 sty 2012, 14:13
Rola: Inny
Lokalizacja: Puławy

Re: API - dodawanie FZ z pliku XML

Post autor: rafalW »

lolek2, a IloscReq masz ustawione?

lolek2
Posty: 100
Rejestracja: 23 gru 2011, 21:17
Rola: Administrator CDN XL
Wersja: 10
Kontakt:

Re: API - dodawanie FZ z pliku XML

Post autor: lolek2 »

Mam :)

marek1712
Posty: 21
Rejestracja: 25 mar 2011, 12:55
Rola: Inny
Wersja: 10

Re: API - dodawanie FZ z pliku XML

Post autor: marek1712 »

Mała zmiana - przyjmowane są PZty, a dopiero one są spinane w (S)FZ :lol:
Mam dwa problemy:
- import wysypuje mi się w przypadku, gdy towaru o podanym EAN nie ma na magazynie - jak się mogę przed tym zabezpieczyć (istnieje możliwość wyrzucenia okienka z prośbą o dodanie towaru?)?
- dostaję komunikat (nie wiem czy od XLNowyDokument czy raczej od XLDodajPozycje) 174: "Nie ustalono kosztu dostawy". Co odpowiada za ten parametr?

marek1712
Posty: 21
Rejestracja: 25 mar 2011, 12:55
Rola: Inny
Wersja: 10

Re: API - dodawanie PZ z pliku XML

Post autor: marek1712 »

Witam po przerwie wakacyjnej :)
I od razu ponawiam pytanie:
XLDodajPozycje nadal nie działa jak należy - wczytuje pierwszy kod EAN i cały czas go trzyma - zupełnie jak w tym wątku. Zeruję zmienną po przebiegu pętli i nadal nic :(
Drugi problem jest jak z poprzedniego pytania - co zrobić, gdy towar importowany (a dokładnie EAN) nie istnieje na magazynie. Czy da się włączyć tryb interaktywny, by program otwierał okno z prośbą o dodanie nowego towaru?

ODPOWIEDZ