Funktionalität von try-catch-Anweisungen

An allen Stellen, an denen SQL-Abfragen definiert werden können, ist auch eine „try-catch“-Unterstützung möglich. Dies sind: Steuereditoren (Initialisierung und Beobachter von Steuerelementen) und Trigger: OnAfterDocumentCreated, OnAfterDocumentSave, OnBeforeDocumentShow, OnDocumentPropagation. An jeder dieser Stellen ist es möglich, die von der Abfrage ausgelöste Ausnahme abzufangen und dem Benutzer eine von uns definierte Nachricht darzustellen.

 

Beispiel:

Die folgende Abbildung zeigt eine Abfrage, bei der der Fall der Division durch Null auftreten kann. Eine solche Situation kann durch den „Try-Catch“ Mechanismus behandelt und dem Benutzer mit einer definierten Meldung angezeigt werden.

 

 

Das Bild unten zeigt die Wirkung des „Try-Catch“ Mechanismus.

 

 

Der try-catch-Mechanismus soll Ausnahmen abfangen, kann aber auch für andere Zwecke verwendet werden. Eine sehr nützliche Funktion, die bei Triggern, die „try-catch“ verwenden, verwendet werden kann, ist die Überprüfung der Richtigkeit der auf der Workflow-Karte eingegebenen Informationen. Bei Feststellung einer Anomalie verursacht das Auslösen von Throw eine Anweisung an und macht die Transaktion rückgängig. Alle auf der Workflow-Karte eingegebenen Informationen bleiben erhalten und der Betreiber kann das Dokument weder speichern noch zur nächsten Stufe weiterleiten, wenn er die richtigen Daten nicht eingibt.

 

Beispiel:

ALTER PROCEDURE [do].[OnDocumentPropagation]

@WorkflowId as int = NULL, — DSH_ID aus der Tabelle DF_ConfDSHead

@StageId as int = NULL,– DDS_ID aus der Tabelle DF_ConfDSDictionary

@DocumentId as int = NULL, — DWD_ID aus der Tabelle DF_Work

@PropagatedById as int = NULL, — DCD_ID aus der Tabelle DF_ConfOSDictionary

@DocumentOwnerId as int = NULL, — DWD_DCDOwnerId aus der Tabelle 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 = 'Kostenüberprüfung’ — Name der Stufe

where o.DFH_Name = 'Rechnungsbegleichung’ — Prozessname (Workflow-Typ)

and s.DWD_ID = @DocumentId )

Begin

 

declare @NETTOBetrag decimal (24,2)

select @NETTOBetrag = c.DWC_ValueDecimal from do.RO_ControlsValueExpand c where c.DWD_ID = @DocumentId

and c.DKO_Name = 'NETTOBetrag zur Abrechnung ’ — Name des Steuerelements

if @NETTOBetrag < 0

BEGIN

DECLARE @Err varchar(max) = 'Der Nettobetrag ist kleiner als Null!’;

THROW 50001, @Err ,1;

END

End

end try

begin catch

DECLARE @ErrorMessage varchar(max) = 'Fehler bei der Weiterleitung des Dokuments: ’ + ERROR_MESSAGE();

THROW 50001, @ErrorMessage ,1;

end catch

END