Fehler sammeln
AL-Code kann mehrere Fehler erfassen und auf der Benutzeroberfläche anzeigen. Referenziert als Sammelbare Fehler kann diese Funktion Validierungsszenarien vereinfachen. Insbesondere kann sie Szenarien vereinfachen, in denen Benutzern eine Liste mit zu behebenden Fehlern angezeigt wird.
Wenn in einer Prozedur ein Fehler auftritt, stoppt die Prozedur in der Regel beim ersten Fehler, auf den sie stößt. Die Verwendung von sammelbaren Fehlern verschiebt die Fehlerbehandlung im Wesentlichen zum Ende des Prozeduraufrufs. Die AL-Code-Implementierung wird nicht bei Fehlern gestoppt. Stattdessen wird sie bis zum Ende fortgesetzt, und Fehler werden gesammelt, wenn sie auftreten.
AL umfasst mehrere Methoden, Eigenschaften und Attribute, die speziell für die Funktion für sammelbare Fehler entwickelt wurden.
ErrorInfo.Create(String [, Boolean] [, var Record] [, Integer] [, Integer] [, String] [, Verbosity] [, DataClassification] [, Dictionary of [Text, Text]]) – Erstellt ein neues Objekt ErrorInfo.
ErrorInfo.Callstack() – Gibt eine Aufrufliste an, in dem das Objekt ErrorInfo gesammelt wurde.
ErrorInfo.Collectible([Boolean]) – Legt fest, ob der Fehler sammelbar ist unter Verwendung von ErrorBehavior.Collect.
ErrorInfo.CustomDimensions([Dictionary of [Text, Text]]) – Ein Satz von Dimensionen, angegeben als Wörterbuch, das sich auf den Fehler bezieht.
ErrorInfo.FieldNo([Integer]) – Gibt die Feld-ID an, auf die sich der Fehler bezieht.
ErrorInfo.PageNo([Integer]) – Gibt die Seitennummer an, auf die sich der Fehler bezieht.
ErrorInfo.RecordId([RecordId]) – Gibt die Datensatz-ID an, auf die sich der Fehler bezieht.
ErrorInfo.SystemId([Guid]) – Gibt die System-ID an, auf die sich der Fehler bezieht.
ErrorInfo.TableId([Integer]) – Gibt die Tabellen-ID an, auf die sich der Fehler bezieht.
ErrorInfo.AddAction(Text, Integer, Text) – Gibt für den Fehler eine Aktion an.
Die Methode AddAction akzeptiert drei Parameter:
Untertitel: Die Textzeichenfolge, die als Beschriftung der Aktion in der Fehler-Benutzeroberfläche angezeigt wird.
CodeunitID: Die ID der Codeunit, die ausgeführt werden soll, wenn die Aktion über die Fehler-Benutzeroberfläche eingeleitet wird. Die Codeunit sollte mindestens eine globale Methode umfassen, die von der Fehleraktion aufgerufen wird. Die globale Methode muss einen Datentypparameter ErrorInfo zur Übernahme des Objekts ErrorInfo haben.
Methodenname: Der Name der Methode in der Codeunit, die durch das Parameter CodeunitID angegeben wird, den Sie für die Aktion ausführen möchten.
Die folgenden Methoden sind auf Systemdatentyp zum Umgang mit gesammelten Fehlern verfügbar. Sie können diese Methoden mit der Eigenschaftszugriffssyntax aufrufen.
System.HasCollectedErrors() – Ruft einen Wert ab, der angibt, ob im aktuellen Fehlersammlungsbereich Fehler erfasst wurden.
System.GetCollectedErrors([Boolean]) – Ruft alle gesammelten Fehler im aktuellen Erfassungsbereich auf.
System.ClearCollectedErrors() – Löscht alle gesammelten Fehler im aktuellen Erfassungsbereich.
In der Datenbank vorgenommene Änderungen werden nicht rückgängig gemacht, wenn Sie die Liste der gesammelten Fehler löschen. Daher ist es in den meisten Fällen sinnvoll, die Lösch-Operation mit einer Aussage if Codeunit.Run then ... zu kombinieren.
Das ErrorBehavior-Attribut gibt das Verhalten von sammelbaren Fehlern innerhalb des Methodenbereichs an. Einem Verfahren [ErrorBehavior(ErrorBehavior.Collect)] hinzuzufügen, ermöglicht das Sammeln und Behandeln von Fehlern, die im Bereich der Prozedur ausgelöst werden.
Das folgende Codebeispiel veranschaulicht, wie sammelbare Fehler genutzt werden. Es ist um die Codeunit DoPost gebaut, die grundlegende Kriterien dafür festlegt, was in Tabellenfelder aufgenommen werden kann oder nicht. Dieser Prozess wird beendet, wenn Fehler auftreten.
Die Verfahren PostWithErrorCollect () und PostWithErrorCollectCustomUI () zeigen Ihnen, wie Sie diese Fehler sammeln und darstellen können, indem Sie das Attribut ErrorBehavior(ErrorBehavior::Collect) verwenden.
pageextension 50100 CollectingErrorsExt extends "Customer List"
{
actions
{
addfirst(processing)
{
// This action doesn't collect errors. Any procedure will stop on the first error that occurs,
// and return the error.
action(Post)
{
ApplicationArea = All;
trigger OnAction()
var
i: Record Integer;
begin
i.Number := -9;
Codeunit.Run(Codeunit::DoPost, i);
end;
}
// This action collects errors. The PostWithErrorCollect procedure continues on errors,
// and displays the errors in a dialog to the user done.
action(PostWithErrorCollect)
{
ApplicationArea = All;
trigger OnAction()
begin
PostWithErrorCollect();
end;
}
// This action collects errors. The PostWithErrorCollectCustomUI procedure continues on errors,
// and displays error details in a list page when done.
// This implementation illustrates how you could design your own UI for displaying and
// troubleshooting errors.
action(PostWithErrorCollectCustomUI)
{
ApplicationArea = All;
trigger OnAction()
begin
PostWithErrorCollectCustomUI();
end;
}
}
}
[ErrorBehavior(ErrorBehavior::Collect)]
procedure PostWithErrorCollect()
var
i: Record Integer;
begin
i.Number := -9;
Codeunit.Run(Codeunit::DoPost, i);
// After executing the codeunit, there will be collected errors,
// and therefore an error dialog will be shown when exiting this procedure.
end;
[ErrorBehavior(ErrorBehavior::Collect)]
procedure PostWithErrorCollectCustomUI()
var
errors: Record "Error Message" temporary;
error: ErrorInfo;
i: Record Integer;
begin
i.Number := -9;
// By using Codeunit.Run, you ensure any changes to the database within
// Codeunit::DoPost are rolled back in case of errors.
if not Codeunit.Run(Codeunit::DoPost, i) then begin
// If Codeunit.Run fails, a non-collectible error was encountered,
// add this to the list of errors.
errors.ID := errors.ID + 1;
errors.Description := GetLastErrorText();
errors.Insert();
end;
// If there are collected errors, iterate through each of them and
// add them to "Error Message" record.
if HasCollectedErrors then
foreach error in system.GetCollectedErrors() do begin
errors.ID := errors.ID + 1;
errors.Description := error.Message;
errors.Validate("Record ID", error.RecordId);
errors.Insert();
end;
// Clearing the collected errors will ensure the built-in error dialog
// will not show, but instead show our own custom "Error Messages" page.
ClearCollectedErrors();
page.RunModal(page::"Error Messages", errors);
end;
}
codeunit 50100 DoPost
{
TableNo = Integer;
trigger OnRun()
begin
if Number mod 2 <> 0 then
Error(ErrorInfo.Create('Number should be equal', true, Rec, Rec.FieldNo(Number)));
if Number <= 0 then
Error(ErrorInfo.Create('Number should be larger than 0', true, Rec, Rec.FieldNo(Number)));
if Number mod 3 = 0 then
Error(ErrorInfo.Create('Number should not be divisible by 10', true, Rec, Rec.FieldNo(Number)));
// Everything was valid, do the actual posting.
end;
}