Funkcjonalność komunikatów przechwytujących typu trycatch

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)
  • 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.

 

Przyklad

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.

 

Przyklad

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