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