Uso di identificatori, sintassi e variabili

Completato

Prima di poter iniziare a lavorare con variabili e funzioni, è necessario apprendere alcuni concetti importanti. Identificatori, sintassi e variabili sono concetti centrali di AL e di altri linguaggi di programmazione.

Un identificatore è il nome di un elemento di programmazione, mentre una variabile è una posizione in memoria in cui sono archiviati i dati. Usando un identificatore si può attribuire un nome a una variabile, in modo da poterla usare.

Syntax descrive le regole grammaticali per l'uso degli identificatori. La sintassi degli identificatori dipende dal linguaggio dell'applicazione e da alcune best practice.

Esistono alcune regole grammaticali per l'uso degli identificatori. All'interno di un oggetto, tutti gli identificatori devono essere univoci. Pertanto, all'interno di un oggetto, non è possibile dichiarare due variabili con lo stesso identificatore (o nome).

Quando si definisce una variabile tramite un identificatore, il primo carattere è preferibilmente un carattere di sottolineatura o una lettera. Quando nell'identificatore si usa un carattere speciale o uno spazio, è necessario racchiudere l'identificatore tra virgolette doppie.

Poiché il linguaggio dell'applicazione non fa distinzione tra maiuscole e minuscole, non distingue tra lettere maiuscole e minuscole negli identificatori. Si consiglia di creare identificatori con PascalCase. PascalCase è una notazione secondo cui il nome di ogni variabile inizia con la lettera maiuscola. Se il proprio nome è una combinazione di due parole, anche la seconda parola inizierà con una lettera maiuscola. Ad esempio, per denominare una variabile con cui archiviare il nome di un cliente, si può usare CustomerName, che è un esempio di notazione PascalCase.

Prima di lavorare con le variabili, è necessario dichiararle, il che significa che le variabili devono:

  • Avere un identificatore

  • Avere un ambito

  • Avere un tipo di dati

  • Essere inizializzate

La variabile deve anche avere un ambito, che definisce dove si può accedere alla variabile e usarla.

Una variabile può essere definita mediante un ambito globale o locale. Se la variabile viene definita mediante un ambito globale, sarà disponibile ovunque nell'oggetto. Pertanto, su ogni trigger, ovunque si desideri scrivere alcune istruzioni di codice, tale variabile sarà disponibile. Quando l'ambito è locale, è possibile accedere alla variabile solo nel trigger specifico della procedura in cui tale variabile è stata dichiarata.

Esempio di variabili di ambito globale e locale.

Nell'esempio precedente, la variabile Counter è stata dichiarata con un ambito globale e può essere usata in ogni trigger e funzione nella tabella MyTable. La variabile CustomerName è definita nel trigger OnInsert; ha quindi un ambito locale. La variabile è utilizzabile solo in questo trigger e non può essere chiamata da un altro trigger. Definire tutte le variabili con un ambito globale può essere più semplice, ma ciò significa che queste variabili saranno utilizzabili in ogni trigger. In ogni trigger quindi sarà possibile cambiare variabile, il che può portare a risultati indesiderati o imprevisti. Di conseguenza, quando si dichiarano le variabili, è importante pensare alla definizione dell'ambito, quindi scegliere quella corretta.

Esistono anche variabili definite dal sistema che vengono definite e gestite automaticamente dal sistema e anche il loro ambito è impostato dal sistema. Le variabili Rec e xRec sono esempi di variabili definite dal sistema. Rec offre accesso al record corrente e xRec al record precedente (ad esempio prima che si verificasse un aggiornamento).

Una variabile è sempre associata a un certo tipo di dati. Può trattarsi di un numero intero, un testo, un codice, una data, un'opzione e così via. Quando una variabile viene creata in memoria, viene inizializzata, il che significa che ha un valore iniziale predefinito prima che l'utente vi assegni un valore. Tale valore predefinito dipende dal tipo di dati della variabile.

Per le variabili con un tipo di dati numerico, per l'inizializzazione si usa un valore pari a zero. Le variabili stringa vengono inizializzate con una stringa vuota. Una variabile booleana ha un valore predefinito false.

Fino a poco tempo fa, ogni variabile doveva essere dichiarata su una propria riga. In oggetti più grandi, questo portava a pagine di dichiarazioni di variabili, anche se la maggior parte di queste erano dello stesso tipo.

Per ridurre lo scorrimento, migliorare la leggibilità e semplificare la visualizzazione e la dichiarazione di tipi correlati, è ora possibile aggiungere più dichiarazioni di variabili dello stesso tipo in una singola riga.

Dichiarare più variabili dello stesso tipo sulla stessa riga, usando una virgola per separare i nomi delle variabili.

Ad esempio:


var
        myInt, nextInt, thirdInt : Integer;
        isValid, doCheck : Boolean;

Variabili protette

La parola chiave protetta può essere utilizzata per rendere accessibili le variabili tra tabelle ed estensioni di tabella e tra pagine ed estensioni di pagina.

Se si desidera esporre solo alcune variabili come protette, è necessario creare due sezioni di dichiarazioni var. Vedere la sintassi di seguito.


protected var
        myInt: Integer; // protected var

var
        myLocalInt: Integer; // local var

L'esempio seguente illustra come dichiarare e usare una variabile protetta.


page 50100 MyPage
{
    SourceTable = Customer;
    PageType = Card;

    layout
    {
        area(Content)
        {
            group(General)
            {
                field(Name; Name)
                {
                    ApplicationArea = All;
                }
            }
            group(Advanced)
            {
                Visible = ShowBalance;

                field(Balance; Balance)
                {
                    ApplicationArea = All;
                }
            }
        }
    }

    protected var
        [InDataSet]
        ShowBalance: Boolean;
}

pageextension 50101 MyPageExt extends MyPage
{
    layout
    {
        addlast(Content)
        {
            group(MoreBalance)
            {
                Visible = ShowBalance; // ShowBalance from MyPage

                field("Balance (LCY)"; "Balance (LCY)")
                {
                    ApplicationArea = All;
                }
            }
        }

    }

    actions
    {
        addlast(Navigation)
        {
            action(ToggleBalance)
            {
                ApplicationArea = All;
                trigger OnAction()
                begin
                    ShowBalance := not ShowBalance; // Toggle ShowBalance from MyPage.
                end;
            }
        }
    }
}

Linee guida per l'inserimento del codice AL

Consigliamo le seguenti linee guida per il codice AL:

  • In genere, si scrive il codice in codeunit anziché sull'oggetto in cui opera. Questo approccio favorisce una concezione efficace e offre la possibilità di riusare il codice. Consente inoltre di migliorare la sicurezza. Ad esempio, gli utenti in genere non hanno accesso diretto alle tabelle che contengono dati sensibili, come la tabella Movimento C/G, né dispongono dell'autorizzazione per modificare gli oggetti.

  • Se si inserisce il codice che si applica alla contabilità generale in una codeunit, si concede alla codeunit l'accesso alla tabella e si autorizza l'utente a eseguire la codeunit, non si comprometterà la sicurezza della tabella e l'utente potrà accedervi.

  • Se si deve inserire codice su un oggetto anziché in una codeunit, posizionare il codice il più vicino possibile all'oggetto a cui si applica. Ad esempio, inserire il codice che modifica i record nei trigger dei campi della tabella.

Riuso del codice

Il riuso del codice rende lo sviluppo di applicazioni più veloce e più semplice. E, aspetto più importante, se si organizza il codice AL come suggerito, le applicazioni saranno probabilmente meno soggette a errori. Centralizzando il codice, non si creeranno incongruenze involontariamente eseguendo lo stesso calcolo in molti punti, ad esempio in diversi trigger che hanno lo stesso campo tabella della loro espressione di origine. Se si deve modificare il codice, si rischia di dimenticare alcuni di questi trigger o di commettere un errore quando se ne modifica uno.