ApiAutomator przykład 5 - masowe przekształcanie zamówień ZS do faktur FS
: 12 sie 2018, 15:21
Podobnie jak w przykładzie z ZZ i PZ zajmiemy się teraz przekształcaniem ZS do FS, oczywiście tę samą funkcjonalność wykorzystujemy do wystawiania dokumentów WZ, ZW, czy paragonów.
Jest to jednak pierwszy przykład, w którym użyjemy Procedurę Statusu do obsługi błędów przetwarzania i logowania podstawowych informacji w bazie danych.
Przekształcamy wszystkie dostępne ZS - zakładając też, że cały czas "wpadają nowe" - i obsługujemy jednocześnie kilka sytuacji w których API zwraca błędy, np. DeadLock, błędy sesji, błędy sql itp.. Procedura Kolejki w tym przypadku wygląda więc następująco:
Jak widać, oznaczamy sobie w polu zan_url (lepiej to zrobić w osobnej tabeli, ale na potrzeby tego przykładu możemy użyć pola, które nie jest wykorzystywane) które zamówienie jest aktualnie przetwarzane. Pomijamy zamówienia, które ktoś akurat otworzył w ERP XL, wybieramy też tylko te, które są potwierdzone.
Następnie tworzymy procedurę danych:
Jak widać, wykorzystaliśmy tu dodatkowe kolumny
Jednocześnie procedura statusu tworzy tabelę aa.Log zawierającą historię wszystkich wykonań funkcji API ERP XL, co pozwala później na weryfikację, czy cały proces przebiegł prawidłowo. Przy setkach dokumentów nieodzowna jest możliwość późniejszej weryfikacji, jaki był przebieg kolejnych procesów przetwarzania danych.
źródła skryptów dostępne są tutaj
bazę danych zawierającą podstawowe dane przydatne do testowania funkcjonalności można pobrać tutaj
darmową wersję ApiAutomatora tutaj
Jest to jednak pierwszy przykład, w którym użyjemy Procedurę Statusu do obsługi błędów przetwarzania i logowania podstawowych informacji w bazie danych.
Przekształcamy wszystkie dostępne ZS - zakładając też, że cały czas "wpadają nowe" - i obsługujemy jednocześnie kilka sytuacji w których API zwraca błędy, np. DeadLock, błędy sesji, błędy sql itp.. Procedura Kolejki w tym przypadku wygląda więc następująco:
Kod: Zaznacz cały
if OBJECT_ID('aa.ZStoFSKolejka') is not null drop procedure aa.ZStoFSKolejka;
go
create procedure [aa].[ZStoFsKolejka]
as
begin
declare @Gid as int;
select
top 1
@Gid=zan_gidnumer
from
cdn.zamnag
where
zan_gidtyp=960 and /* zamówienia */
ZaN_Stan=3 and /* potwierdzone */
ZaN_Aktywny=0 and /* nie jest w tej chwili edytowany */
ZaN_ZamTyp=1280 and /* ZS */
zan_url not like 'aa start%' /* nie jest w tej chwili pobierany */
if(@Gid is not null)
update cdn.zamnag set zan_url='aa start ' + convert(varchar(20), getdate(),120) where zan_gidnumer=@Gid;
else
set @Gid=0;
select @Gid as gid, 'aa.ZStoFSDane' as procedura
end
Następnie tworzymy procedurę danych:
Kod: Zaznacz cały
if OBJECT_ID('aa.ZStoFSDane') is not null drop procedure aa.ZStoFSDane;
go
create procedure [aa].[ZStoFsDane] @Gid int = 0
as
begin
select
'XLNowyDokument' as _komenda, /* _komenda API którą trzeba wywołać */
'aa.Status' as _status,
cdn.nazwaobiektu(zan_gidtyp, zan_gidnumer,0,2) as _log,
2033 as Typ,
zan_gidtyp as ZamTyp, /* powiązanie FS z ZS */
zan_gidnumer as ZamNumer,
zan_gidlp as ZamLp
from
cdn.zamnag
where
zan_gidnumer=@Gid;
-- **************** pozycje ****************
select
'XLDodajPozycje' as _komenda, /* _komenda API którą trzeba wywołać */
'aa.Status' as _status,
zae_twrkod as _log,
zae_gidtyp as ZamTyp, /* powiązanie pozycji FS z pozycją ZS */
zae_gidnumer as ZamNumer,
zae_gidlp as ZamLp
from
cdn.zamelem
where
zae_gidnumer=@gid
-- **************** zamknięcie ****************
select
'XLZamknijDokument' as _komenda, /* _komenda API którą trzeba wywołać */
'aa.Status' as _status,
0 as Tryb
end
- _status - wskazuje na procedurę statusu, która jest uruchamiana po każdym wywołaniu funkcji API
- _log - powodujemy, że w logu wyświetla nam się aktualnie przetwarzane zamówienie
Kod: Zaznacz cały
CREATE procedure [aa].[Status]
@res int=0,
@flagi int=0,
@czas int=0,
@komenda varchar(40)='',
@proba int=0,
@sesja int=0,
@opis varchar(100)=''
as
begin
if OBJECT_ID('aa.log') is null
create table aa.Log (
aa_res int not null default 0,
aa_flagi int not null default 0,
aa_czas int not null default 0,
aa_komenda varchar(40),
aa_proba int,
aa_sesja int,
aa_opis varchar(100)
);
declare @decyzja varchar(20);
if @komenda='XLNowyDokument'
begin
if @res=0 set @decyzja='Continue'; --ok - następny krok
else if @res=2 set @decyzja='NextGid'; --błąd blokowania tabel - pomiń to zamówienie
else if @res=61 set @decyzja='Logout'; --błąd sesji - konieczne ponowne zalogowanie
else if @res=106 set @decyzja='Repeat'; --deadlock, spróbuj jeszcze raz
else set @decyzja='Exit'; -- nieopisany błąd - wyjdź
end
else if @komenda='XLDodajPozycje'
begin
if @res=0 set @decyzja='Continue'; --ok - następny krok
else if @res=106 set @decyzja='Repeat'; --deadlock, powtórz operację
else set @decyzja='Continue' --pomijamy pozycje - następny krok
end
else if @komenda='XLZamknijDokument'
begin
if @res=0 set @decyzja='Continue'; --ok - następny krok
else if @res=106 set @decyzja='Repeat'; --deadlock
else set @decyzja='Exit' --pomijamy pozycje
end
insert into aa.Log(aa_res, aa_flagi, aa_czas, aa_komenda, aa_proba, aa_sesja, aa_opis)
values(@res, @flagi, @czas, @komenda, @proba, @sesja, @opis);
select @decyzja as decyzja;
end
źródła skryptów dostępne są tutaj
bazę danych zawierającą podstawowe dane przydatne do testowania funkcjonalności można pobrać tutaj
darmową wersję ApiAutomatora tutaj