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