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