ApiAutomator
ApiAutomator to narzędzie administratora systemu ERP XL. Program obsługuje wszystkie udostępnione funkcje API, wywołuje je na podstawie danych zwracanych przez Serwer SQL. Pozwala więc na sterowanie systemem z poziomu zapytań SQL.
AA eliminuje konieczność niskopoziomowego programowania i pozwala administratorom na szybkie prototypownie i wdrażanie nowych rozwiązań funkcjonalnych. Do typowych zastosowań wystarczy podstawowa znajomość SQL i umiejętność dostosowania procedury danych przekazującej dane do bezobsługowego przetwarzania wsadowego. Bardziej zaawansowane rozwiązania, takie jak:
- integracja danych z innymi systemami,
- wsadowe przekształcanie dokumentów,
- benchmark wydajności,
- czy symulacja pracy operatora – w tle
- …
są realizowane z wykorzystaniem 2 lub 3 procedur sterujących, których zastosowanie zaprezentujemy w kolejnych przykładach.
Szybki start
W kolejnych krokach przydatna będzie baza danych, która nie jest całkiem pusta i zawiera logiczne informacje o kontrahentach, towarach, magazynach, transakcjach, rozliczeniach, księgowaniach itp., dlatego na początku ApiAutomator możemy wykorzystać do szybkiego stworzenia fikcyjnych – losowych zamówień ZZ.
Krok 1: procedura sql
Procedura postępowania w tym przypadku to symulacja pracy operatora, który wykonuje poniższe funkcje API w kolejności:
- XLNowyDokumentZam – utworzenie nowego dokumentu zamówienia
- XLDodajPozycjeZam – dodanie towaru – pozycji zamówienia
- XLDodajPozycjeZam – dodanie towaru – pozycji zamówienia
- XLZamknijDokumentZam – zamknięcie zamówienia
Wskazane funkcje wymagają podania odpowiednich parametrów, za przekazanie tych informacji odpowiada Procedura Danych. To nie jest konieczne, ale zanim ją stworzymy warto jest utworzyć osobny schemat dla ApiAutomatora, aby później łatwiej zarządzać jego procedurami:
create schema [aa];
Teraz tworzymy naszą procedurę aa.TestoweZZDane :
create procedure [aa].[TestoweZZDane] @Gid int = 0 as begin declare @MagNr int; -- losowy magazyn - zmienna declare @KliNr int; -- losowy klient - zmienna select top 1 @MagNr=mag_gidnumer from cdn.magazyny order by newid();-- losowy magazyn select top 1 @KliNr=knt_gidnumer from cdn.kntkarty order by newid();-- losowy magazyn -- **************** nagłówek **************** select top 1 'XLNowyDokumentZam' as _komenda, /* _komenda API którą trzeba wywołać */ 5 as Typ, -- 5 ZZ, 6 ZS ... knt_gidtyp as KntTyp, knt_gidnumer as KntNumer, mag_kod as Magazyn from cdn.kntkarty inner join -- połączenie z magazynem, ale bez relacji, tylko pobieramy kod potrzebny dla funkxji XLDodajPozycjeZam cdn.magazyny on knt_gidnumer=@KliNr and mag_gidnumer=@MagNr -- **************** pozycje **************** select top 2 'XLDodajPozycjeZam' as _komenda, /* _komenda API którą trzeba wywołać */ format(abs(checksum(newid()) % 240) + 12,'G','pl-PL') as Ilosc, /* ilość w formacie tekstowym np. 1.52 */ format(TwC_Wartosc,'G','pl-PL') as CenaOferowana, /* centa jako tekst - wymagane przez API */ twr_gidtyp as TwrTyp, twr_gidnumer as TwrNumer from cdn.twrkarty inner join cdn.twrceny on TwC_TwrNumer = Twr_GIDNumer where twc_twrlp=1 and twc_wartosc > 0 -- pobieraj tylko tewary, które mają przypisaną cenę order by newid() -- **************** zamknięcie **************** select 'XLZamknijDokumentZam' as _komenda, /* _komenda API którą trzeba wywołać */ 2 as TrybZamkniecia -- 0 zamknięcie, 1 usunięcie, 2 potwierdzenie ... end
Aby sprawdzić efekt działania procedury wystarczy wykonać z poziomu Sql Managera komendę:
exec aa.RandomZZData;
Efektem jej działania będzie zestaw 3 recordsetów, dających łącznie ciąg poleceń dla AA. Wykonanie tych poleceń spowoduje powstanie odpowiedniego zamówienia ZZ w systemie.
Po przygotowaniu procedury danych, należy uruchomić program ApiAutomator z parametrami, które wskażą na procedurę jaka ma być wywołana.
Krok 2: uruchomienie programu
Niezbędne informacje jakie trzeba przekazać do AA aby uruchomił przetwarzanie właściwej procedury to:
- nazwa bazy danych – wybierana przy logowaniu do systemu (tutaj 3lance)
- login do systemu – (ADMIN)
- hasło do systemu – tu brak
- nazwa bazy SQL („DRIVER={SQL Server};Server=cdnsrv\ex14;Database=ERPXL_3lance”)
- użytkownik SQL (sa)
- hasło do bazy SQL (aaaaaa)
- nazwa procedury danych (aa.TestoweZZDane)
aa.exe -z=n:1,aa.TestoweZZDane -u=sa -p=aaaaaa -l=ADMIN -c=3lance -n="DRIVER={SQL Server};Server=cdnsrv\ex14;Database=ERPXL_3lance"
Wynikiem wykonania tej komendy z linii poleceń jest stworzenie nowego dokumentu ZZ w systemie.
Więcej i bardziej rozbudowane przypadki zastosowań znajdziecie na forum https://cdn.3lance.pl/.
Procedury sterujące
ApiAutomator jest sterowany przez procedury SQL, są trzy rodzaje procedur, każdy z nich pełni inne zadanie:
- Procedura Danych – obowiązkowa – to lista czynności wraz z danymi jakie należy wykonać w systemie.
- Procedura Kolejki – opcjonalna – służy do rozdzielenia jednego procesu na niezależne podprocesy – wykonywane równolegle lub kolejności.
- Procedura Statusu – opcjonalna – służy do sterowania przebiegiem programu, obsługi błędów, logowania postępów i analizy wydajności.
Procedura Danych
Program wymaga do pracy co najmniej jednej procedury, zwracającej instrukcje sterowania. Procedura danych powinna zwracać jeden lub więcej recordset’ów z danymi zawierającymi nazwy funkcji API i dane do wykonania tych funkcji. Lista komend zwracanych przez tę procedurę, nie musi ograniczać się do jednego obiektu czy dokumentu, może przy jednym wywołaniu przekazać dane do wykonania wielu różnych operacji na obiektach ERP XL.
Definicja zwracanych danych
Wynik działania procedury danych jest przetwarzany przez AA w kolejności w jakiej jest generowany, czyli najpierw pierwszy recordset, a w nim pierwszy rekord, potem kolejne rekordy, a jeśli istnieją, to kolejne recordsety.
Kolumna | Stan | Rola |
---|---|---|
_komenda | obowiązkowa | wskazuje która funkcja API ma być uruchomiona, pole tekstowe, np XLNowyDokument, XLZamknijDokument, XLDodajVAT … jedna z 219 funkcji opisanych w dokumentacji API |
_status | opcjonalna | nazwa i parametry wywołania dla Procedury Statusu |
_log | opcjonalna | Tekst, który pojawi się w logu tekstowym tworzonym przez program, w wierszu podsumowującym efekty funkcji API. Może zawierać pola ze struktur API, które czasem są uzupełniane przez funkcje. Np. przy wywołaniu funkcji XLDodajPozycjeZam API uzupełnia pole tekstowe Towar, które można wyświetlić wprowadzając tu: {Towar} |
[Pole] [Pole] [Pole] … |
opcjonalna/ obowiązkowa | Kolejne pola ze struktury API z dokumentacji, ich opcjonalność lub obowiązkowość jest zdefiniowana w dokumentacji API. Należy pamiętać, że API obsługuje tylko 2 rodzaje danych – liczbowa LONG i tekstowa CSTRING. W takim formacie jak w dokumentacji należy przekazać dane, czyli np. zamienić wartości cen na Varchar() |
Przykład procedury
Dla każdej funkcji API dokumentacja definiuje tzw. Parametry obowiązkowe, czyli np. dla funkcji:
XLNowyTowar(Sesja AS LONG, IDTowaru AS LONG, TowarInfo As XLTowarInfo) AS LONG
mamy parametry:
- Wersja
- Typ
- Kod
- Nazwa
- Jm
Oczywiście pełna struktura zawiera wiele więcej informacji, ale te powyższe wystarczą by założyć kartotekę.
Tworzymy prosty select zwracający w kolumnach wskazane pola (kolumnę Wersja pomijamy, jest wypełniana automatycznie przez AA):
select 1 as Typ, 'NOWYTOWAR1' as Kod, 'Nazwa nowego towaru' as Nazwa, 'szt' as Jm
Dodajemy kolumnę z komendą API – XLNowyTowar:
select 'XLNowyTowar' as _komenda, 1 as Typ, 'NOWYTOWAR1' as Kod, 'Nazwa nowego towaru' as Nazwa, 'szt' as Jm
i mamy dane niezbędne do utworzenia nowej kartoteki towaru przez API, teraz wystarczy „opakować” ten select w proceduę (CREATE PROCEDURE) by móc wywołać ją z poziomu ApiAutomatora.
Procedura Kolejki
Zadaniem procedury kolejki jest poprawa wydajności pracy, którą uzyskujemy przez rozbicie zadań AA na mniejsze elementy i umożliwienie pracy konkurencyjnej kilku instancji programu jednocześnie. Procedura kolejki sprawia również, że AA wykorzystuje licencję ERP XL tylko w sytuacji gdy ma jakieś zadania do przetworzenia. W sytuacji gdy w danej chwili żadna licencja nie jest dostępna ApiAutomator może czekać na zwolnienie się licencji i wtedy automatycznie będzie kontynuował przetwarzanie.
Procedura kolejki przekazuje odpowiedni numer GID danych, który program wykorzysta do pobrania instrukcji z procedury danych. Procedura może blokować wybrany GID, tak by nie dopuścić do przetwarzania tych samych dych przez wiele sesji ApiAutomatora.
Kolumna | Stan | Rola |
---|---|---|
gid | obowiązkowa | podaje numer kolejny, który posłuży do wywołania procedury danych z tym numerem |
procedura | obowiązkowa | nazwa procedury danych, która ma być wywołana z parametrem @gid |
Procedura Statusu – callback
Procedura spełnia dwie funkcje, zapisuje efekty działania funkcji API, decyduje też o dalszych krokach jakie podejmie program po wykonaniu każdej funkcji. Jest więc interfejsem zwrotnym przekazującym serwerowi SQL informacje o wyniku wykonania żądanej funkcji.
Kolumna | Stan | Rola |
---|---|---|
decyzja | opcjonalna | Decyduje o dalszych krokach podejmowanych przez ApiAutomator, może być uzależniona do parametru @Res zwracanego przez funkcję API (czyli nr błędu). |
ApiAutomator rozpoznaje następujące decyzje:
[Continue]
– kontynuacja przetwarzania (domyślna decyzja)[Repeat]
– powtórzenie ostatniej operacji[NextGid]
– przejście do następnej pozycji kolejki[Logout]
– wylogowanie z systemu, ponowne zalogowanie jeśli są kolejne pozycje do przetworzenia[Exit]
– wylogowanie i wyjście niezależnie od tego czy są kolejne pozycje
Parametry wywoływane standardowo jako argumenty procedury:
- @res – wynik wywołania funkcji API – int – zazwyczaj = 0 – inny nr oznacza błąd
- @flagi – flagi zwracane przez funkcję API – int – j.w. – zazwyczaj = 0 – inny nr oznacza ostrzeżenie
- @czas – czas wykonania fukcji w milisekundach – int
- @komenda – nazwa wywołanej funkcji API – varchar(40)
- @proba – numer próby (przydatne gdy z powodu błędów daną funkcję chcemy powtórzyć) – int
- @Sesja – numer sesji ERP XL – int
- @opis – dodatkowe informacje tekstowe ze środowiska uruchomieniowego (nazwa koputera, użytkownik)
- @login – login CDN
Nazwę Procedury Statusu przekazujemy do AA w Procedurze Danych w kolumnie _status
. AA wywołuje ją z zadanymi parametrami po wykonaniu każdej funkcji API, dla której tę kolumnę zdefiniowano.
Sterowanie programem z linii poleceń
Po uruchomieniu programu z opcją –help, uzyskamy następujący ekran pomocy:
Poszczególne elementy oznaczają:
E:\CDN>aa --help Usage: aa [options] ApiAutomator - mechanizm automatyzacji pracy ERP XL przykład użycia: c:\aa.exe -z=p:dbo.GetGid -u dbo -p pass -l ADMIN -w PASS -c CDN_XL Options: -?, -h, --help Displays this help. -s, --symulacja Symulacja działania, bez uruchamiania API program pokazuje czynności jakie wykona należy pamiętać, że w tym trybie także uruchamia procedury SQL -v, --wersja Pokazuje informację o wersji -z, --zrodlo <parametry> Dane sterujące do pobrania, moze przybrac wartosci n:[nr],[procedura danych]... gid i PROCEDURA DANYCH po przecinku p:[procedura kolejki] PROCEDURA KOLEJKI - zwracajaca kolumne gid x:[plik xml] ~nieaktywne~ nazwa pliku xml zawierającyego komendy API --logFile <plik> plik logu --logInfo <parametry> parametry logowania programu -u, --dbUser <login> nazwa użytkownika bazy danych -p, --dbPass <pass> hasło użytkownika bazy danych -n, --dbString <odbc Connection String> połączenie danych ODBC -l, --cdnLogin <login> użytkownik cdn -w, --cdnPass <password> hasło cdn -c, --cdnName <baza> baza cdn
Program przyjmuje pewne wartości domyślne, wyświetla je przy starcie przetwarzania.
Praca z Logami
Czasem zachodzi potrzeba znalezienia przyczyny jakiegoś problemu z bazą lub API, w tym celu AA udostępnia kilka metod logowania efektów swojej pracy. Logi są generowane automatycznie i mogą być:
- wyświetlane w konsoli
- zapisywane do pliku
- zapisywane w bazie danych – z wykorzystaniem Procedury Statusu
Program rozpoznaje kilka kategorii logowanych informacji, są to:
- api.func – informacje związane z wykonywaniem funkcji API
- api.strk – informacje o strukturze danych przekazywanych do API
- prc.func – informacje sterujące głównego procesu AA
- sql.conn – informacje o połączeniu z bazą danyuch MsSQL
- sql.quer – informacje związane z zapytaniami wysyłanymi na serwer
- sql.resp – dane zwracane przez serwer
Każda kategoria może zwracać informację o różnym poziomie szczegółowości:
- debug najwięcej szczegółów
- info informacje podstawowe
- warning gdy pojawi się problem, np. funkcja API zwróci kod błędu
- critical gdy pojawi się problem i nie można kontynuować
Na podstawie powyższych informacji, można wybrać jakie informacje nas interesują i przekazać je do AA za pomocą parametru --loginInfo
. Konstrukcja może zawierać znak gwiazdki „*” oznaczający dowolną kategorię lub typ informacji, natomiast średnik „;” oddziela kolejne kryteria. Przykłady:
--logInfo="*.*=false"
- wyłączenie wszystkich komunikatów
--logInfo="*.*=true"
- włączenie wszystkich komunikatów
--logInfo="*.debug=false;api.strk.debug=true"
- wyłączenie wszystkich szczegółowych komunikatów, włączenie komunikatów szczegółowych o strukturze danych API
--logInfo="*.debug=false;*.info=true"
- wyłączenie wszystkich szczegółowych komunikatów, włączenie komunikatów informacyjnych
Konsola
Poniższy przykład pokazuje informacje generowane przez program przy wystawianiu Zamówienia Zakupu z procedury aa.TestoweZZDane:
Pliki
Nazwę pliku log podajemy w parametrze --logFile
przy wywołaniu AA. Program stworzy wtedy plik o nazwie podanej w parametrze dodając sufix w postaci daty, tak, że codziennie tworzy się osobny log, nie nadpisując logów z dnia poprzedniego. Dodatkowo, jeśli w trakcie pracy pojawi się błąd, powstaje jeszcze jeden plik – również z datą, ale też z kolejnym sufixem „err”, co przydaje się w sytuacji gdy chcemy szybko zweryfikować, czy po jakimś okresie pojawiły się błędy przetwarzania.
Wersje API
Wraz z kolejnymi wersjami systemu ERP XL zmieniają się funkcjonalności i struktury danych, kolejne wersje systemu definiują kolejne wersje API. ApiAutomator jest przypisany do konkretnej wersji jednak obsługa wersjonowania pozwala mu bezbłędnie działać na wersjach wyższych, tzn. że ApiAutomator z wbudowaną obsługą API 20160 poprawnie będzie wystawiał dokumenty w systemie w wersji 2018.5. Natomiast nie ma możliwości by AA działał poprawnie na wersjach niższych niż wbudowana.
Wersję wbudowanego API można podejrzeć wydając komendę:
aa.exe --wersja
Jeśli konieczne jest by ApiAutomator obsługiwał jakąś konkretną wersję, to proszę to zgłosić przez formularz kontaktowy.