We wszystkich miejscach, w których istnieje możliwość definiowania zapytań SQL, możliwa jest również obsługa „Try-Catch”. Są to: edytory kontrolek (inicjowanie oraz obserwator kontrolek), oraz wyzwalacze: OnAfterDocumentCreated, OnAfterDocumentSave, OnBeforeDocumentShow, OnDocumentPropagation. W każdym z tych miejsc jest możliwe przechwycenie wyjątku rzuconego przez zapytanie i zaprezentowanie użytkownikowi zdefiniowanego przez nas komunikatu.
Na poniższym rysunku zostało zaprezentowane zapytanie, w którym może zaistnieć przypadek dzielenia przez zero. Sytuację taką można obsłużyć mechanizmem Try-Catch i wyświetlić użytkownikowi zdefiniowany komunikat.
Poniższy zrzut prezentuje efekt działania mechanizmu Try-Catch.
Mechanizm „Try-Catch” w założeniu służy do przechwytywania wyjątków, ale można go również wykorzystać do innych celów. Bardzo przydatną funkcją, jaka można zastosować w przypadku wyzwalaczy korzystających z „Try-Catch”, jest walidacja poprawności wprowadzonych informacji na karcie obiegu. W przypadku stwierdzenia nieprawidłowości rzucenie Throw spowoduje wyświetlenie komunikatu i cofnięcie transakcji. Wszelkie informacje wprowadzone na kartę obiegu zostaną zachowane, a operator nie będzie mógł zapisać dokumentu ewentualnie przekazać dokumentu do kolejnego etapu, jeżeli nie wprowadzi poprawnych danych.
ALTER PROCEDURE [do].[OnDocumentPropagation]
@WorkflowId as int = NULL, — DSH_ID z tabeli DF_ConfDSHead
@StageId as int = NULL,– DDS_ID z tabeli DF_ConfDSDictionary
@DocumentId as int = NULL, — DWD_ID z tabeli DF_Work
@PropagatedById as int = NULL, — DCD_ID z tabeli DF_ConfOSDictionary
@DocumentOwnerId as int = NULL, — DWD_DCDOwnerId z tabeli DF_Work
@IsAutomaticPropagation as bit = NULL
AS
BEGIN
begin try
if exists (
select * from do.RO_ObjectsTypes o
join do.RO_StageActive s on o.DFH_Id = s.DFH_Id
and s.DDS_Name = 'Weryfikacja kosztów’ — nazwa etapu
where o.DFH_Name = 'rozliczenie faktury’ — nazwa procesu (typu obiegu)
and s.DWD_ID = @DocumentId )
Begin
declare @KwotaNETTO decimal (24,2)
select @KwotaNETTO = c.DWC_ValueDecimal from do.RO_ControlsValueExpand c where c.DWD_ID = @DocumentId
and c.DKO_Name = 'Kwota NETTO do rozliczenia ’ — nazwa kontrolki
if @KwotaNETTO < 0
BEGIN
DECLARE @Err varchar(max) = 'Kwota netto jest mniejsza od zera!’;
THROW 50001, @Err ,1;
END
End
end try
begin catch
DECLARE @ErrorMessage varchar(max) = 'Błąd podczas przekazywania dokumentu: ’ + ERROR_MESSAGE();
THROW 50001, @ErrorMessage ,1;
end catch
END