Recueillir les erreurs

Effectué

Le code AL peut capturer plusieurs erreurs et les afficher dans l’interface utilisateur. Ces erreurs sont appelées des erreurs récupérables. Cette fonctionnalité permet de simplifier les scénarios de validation. Plus précisément, elle permet de simplifier les scénarios dans lesquels les utilisateurs reçoivent une liste d’erreurs à corriger.

En général, lorsqu’une erreur survient dans une procédure, la procédure s’arrête à la première erreur qu’elle rencontre. En substance, l’utilisation d’erreurs récupérables permet de reporter la gestion des erreurs à la fin de l’appel de procédure. L’implémentation du code AL ne s’arrêtera pas aux erreurs. À la place, elle continue jusqu’à la fin et rassemble les erreurs au fur et à mesure qu’elles surviennent.

AL inclut plusieurs méthodes, propriétés et attributs conçus spécifiquement pour la fonctionnalité des erreurs récupérables.

La méthode AddAction accepte trois paramètres :

  • Légende : chaîne de texte qui s’affiche comme légende de l’action dans l’IU d’erreur.

  • CodeunitID : ID du codeunit à exécuter lorsque l’action est lancée à partir de l’IU d’erreur. Le codeunit doit comporter au moins une méthode globale à appeler par l’action d’erreur. La méthode globale doit avoir un paramètre de type de données ErrorInfo pour accepter l’objet ErrorInfo.

  • Nom de la méthode : nom de la méthode dans le codeunit spécifié par le paramètre CodeunitID que vous souhaitez exécuter pour l’action.

Les méthodes suivantes sont disponibles sur le Type de données système pour gérer les erreurs recueillies. Vous pouvez appeler ces méthodes à l’aide de la syntaxe d’accès aux propriétés.

Si vous effacez la liste des erreurs recueillies, les modifications apportées à la base de données ne sont pas annulées. Par conséquent, dans la plupart des cas, il est logique de combiner l’opération effacer avec une instruction if Codeunit.Run then ...

L’attribut ErrorBehavior spécifie le comportement des erreurs récupérables dans l’étendue de la méthode. L’ajout de l’attribut [ErrorBehavior(ErrorBehavior.Collect)] à une procédure permet de collecter et de gérer les erreurs qui sont déclenchées dans l’étendue de la procédure.

L’exemple de code suivant illustre l’utilisation des erreurs récupérables. Il est conçu autour du codeunit DoPost qui définit des critères de base concernant ce qui peut ou ne peut pas être inclus dans les champs de table. Cette procédure s’arrête lorsque des erreurs se produisent.

Les procédures PostWithErrorCollect () et PostWithErrorCollectCustomUI () vous montrent comment collecter et présenter ces erreurs en appliquant l’attribut ErrorBehavior(ErrorBehavior::Collect).

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;
}