Leggere in inglese

Raccolta di errori

Completato

Il codice AL può acquisire più errori e visualizzarli nell'interfaccia utente. Questa funzione, denominata errori raccoglibili, può semplificare gli scenari di convalida. In particolare, può semplificare gli scenari in cui agli utenti viene presentato un elenco di errori da correggere.

In genere, quando si verifica un errore in una procedura, la procedura si interrompe al primo errore che incontra. L'uso di errori raccoglibili in sostanza posticipa la gestione degli errori al termine della chiamata di procedura. L'implementazione del codice AL non si interrompe in caso di errori. Viceversa, prosegue fino al termine e raccoglie gli errori man mano che si verificano.

AL include diversi metodi, proprietà e attributi progettati specificamente per la funzione degli errori raccoglibili.

Il metodo AddAction accetta tre parametri:

  • Didascalia: la stringa di testo che appare come didascalia dell'azione nell'interfaccia utente dell'errore.

  • CodeunitID: l'ID della codeunit da eseguire quando l'azione viene avviata dall'interfaccia utente dell'errore. La codeunit deve contenere almeno un metodo globale che deve essere chiamato dall'azione di errore. Il metodo globale deve avere un parametro di tipo di dati ErrorInfo per accettare l'oggetto ErrorInfo.

  • Nome metodo: il nome del metodo nella codeunit, specificato dal parametro CodeunitID, che si desidera eseguire per l'azione.

I metodi seguenti sono disponibili nel tipo di dati System per la gestione degli errori raccolti. È possibile richiamare questi metodi usando la sintassi di accesso alle proprietà.

Se si cancella l'elenco degli errori raccolti, le modifiche apportate al database non verranno ripristinate. Pertanto, nella maggior parte dei casi, è opportuno combinare l'operazione di cancellazione con un'istruzione if Codeunit.Run then ...

L'attributo ErrorBehavior specifica il comportamento degli errori raccoglibili all'interno dell'ambito del metodo. L'aggiunta di [ErrorBehavior(ErrorBehavior.Collect)] a una procedura consente di raccogliere e gestire gli errori generati nell'ambito della procedura.

L'esempio di codice seguente illustra come usare gli errori raccoglibili. È costruito attorno alla codeunit DoPost che imposta i criteri di base relativi a cosa può o non può essere incluso nei campi della tabella. Questa procedura si interromperà quando si verificano errori.

Le procedure PostWithErrorCollect () e PostWithErrorCollectCustomUI () mostrano alcuni modi per raccogliere e presentare questi errori applicando l'attributo ErrorBehavior(ErrorBehavior::Collect).

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