ApiAutomator przykład 5 - masowe przekształcanie zamówień ZS do faktur FS

Program do automatyzacji pracy administratora i użytkowników systemu ERP XL
Awatar użytkownika
mikey
Site Admin
Posty: 99
Rejestracja: 25 lis 2007, 23:42
Rola: Administrator CDN XL
Wersja: 2016
Lokalizacja: Wielkopolska

ApiAutomator przykład 5 - masowe przekształcanie zamówień ZS do faktur FS

Post autor: mikey »

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:

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
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:

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
Jak widać, wykorzystaliśmy tu dodatkowe kolumny
  • _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
Dodatkowego wyjaśnienia wymaga procedura statusu, w tym przypadku tworzymy domyślną procedurę, która steruje AA, decydując jak w przypadku błędów ma się zachować automat. Czy ma się przelogować, kontynuować, wyjść itp.. Procedura obsługi błędów może być bardziej rozbudowana, ale w tym przypadku pokazuję jak obsłużyć deadlocki i błędy sesji.

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
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

ODPOWIEDZ