Uso di diverse funzioni di campo in AL

Completato

Quando si usano i dati del database in AL, è necessario usare altre istruzioni usate per i campi, ad esempio:

  • CalcFields

  • CalcSums

  • FieldError

  • Init

  • TestField

  • Validate

Istruzioni CalcFields e SetAutoCalcFields

Quando si recuperano elementi FlowFields nel codice AL, il relativo valore è sempre zero. Si ottiene questo valore perché la formula di calcolo di FlowFields non viene eseguita nel codice AL. Quando si usano elementi FlowFields in una pagina, l'elemento FlowField viene calcolato automaticamente, ma non nel codice AL. Di conseguenza, è necessario usare la funzione CalcFields. La funzione CalcFields consente di specificare quali elementi FlowFields devono essere calcolati durante l'implementazione del codice.

Nell'esempio seguente, vengono calcolati solo gli elementi FlowFields Saldo e Saldo periodo. Gli elementi FlowFields non vengono più calcolati fuori dall'istruzione repeat until, ma solo all'interno del loro ambito.

customer.SetRange("Date Filter", 0D, Today());

// Using CALCFIELDS
if customer.FindSet() then
    repeat
        customer.CalcFields(Balance, "Net Change");
       // Do some additional processing
    until customer.Next() = 0;

Se si desidera calcolare sempre determinati elementi FlowFields (nell'ambito della funzione), è possibile usare la funzione SetAutoCalcFields.

// Using SETAUTOCALCFIELDS
customer.SetAutoCalcFields(Balance, "Net Change");
if customer.FindSet() then
    repeat
    // Do some additional processing
    until customer.Next() = 0;

Istruzione CalcSums

La funzione CalcSums consente di calcolare un totale per un campo specifico, in base ai filtri del set di dati.

Nell'esempio che segue, la tabella SalesInvoiceHeader viene filtrata in base al campo Bill-to Customer No. tra 10000 e 50000 e al campo Document Date tra 0D (inizio) fino a Today. La funzione CalcSums riepiloga tutti i campi Amount.

salesInvoiceHeader.SetCurrentKey("Bill-to Customer No.");
salesInvoiceHeader.SetRange("Bill-to Customer No.", '10000', '50000');
salesInvoiceHeader.SetRange("Document Date", 0D, Today());
salesInvoiceHeader.CalcSums(Amount);

Message('The total is %1', salesInvoiceHeader.Amount);

Istruzione FieldError

La funzione FieldError interrompe l'implementazione del codice, causando un errore di runtime, e crea un messaggio di errore per un campo specifico. Il campo è visualizzato con un bordo rosso e indica che si è verificato un errore con il valore del campo stesso.

if item."Unit Price" < 10 then
    item.FieldError("Unit Price", 'must be greater than 10');

Istruzione Init

L'approccio migliore è iniziare usando il comando Init sul record. Questa azione inizializza tutti i campi del record.

Per inizializzazione si intende che ogni campo riceve il suo valore predefinito (0 per i tipi di dati numerici, stringa vuota per il testo e così via). Se tuttavia si è specificato un elemento InitValue sul campo nella tabella, la funzione Init inizializza il campo con quel valore e non con il valore predefinito.

customer.Init();
customer.Name := 'John Doe';
customer."E-Mail" := 'john.doe@contoso.com';
customer.Insert(true);

Istruzione TestField

Con la funzione TestField è possibile controllare se un campo ha un valore o se è vuoto. Se il campo è vuoto, la funzione TestField genera un errore di runtime.

customer.TestField("Salesperson Code");

Si può anche usare la funzione TestField per verificare se un campo contiene un valore specifico o meno. Se non lo contiene, il campo genera un errore. Nell'esempio seguente, la funzione TestField verifica se Salesperson Code contiene il valore ZX. In questo caso, non contiene il valore perché il valore è impostato su DK.

customer."Salesperson Code" := 'DK';
customer.TestField("Salesperson Code", 'ZX');

Istruzione Validate

Quando si assegna un valore a un campo, il trigger OnValidate di quel campo non viene eseguito. Per eseguire il trigger OnValidate, usare la funzione Validate.

Customer."Phone No." := '1234567891234'
customer.Validate("Phone No.");

Si può usare la funzione Validate per assegnare un valore ed eseguire il trigger OnValidate.

customer.Validate("Phone No.", '1234567891234');