Recupero dei dati dal database con le istruzioni AL

Completato

Le funzioni di accesso ai dati consentono di recuperare dati dal database.

Per recuperare record, è possibile usare le funzioni di accesso ai dati seguenti:

  • Get

  • Find, FindFirst, FindLast

  • Next

  • IsEmpty

Funzione Get

La funzione Get recupera un record in base alla chiave primaria. Se la tabella include una chiave primaria di un campo, è necessario specificare un parametro per la funzione Get. Se la chiave primaria è una chiave combinata di più campi, specificarli secondo l'ordine della definizione della chiave primaria.

L'esempio seguente recupera un record con chiave primaria 30000 della tabella Customer. Poiché la chiave primaria di una tabella Customer è di tipo Code[20], occorre specificare il valore come stringa. Il modo migliore di usare la funzione Get è all'interno di un'istruzione if.

Se il record non viene trovato e non si sta usando un'istruzione if per verificare il risultato dell'istruzione Get, si genera un errore nel codice.

var
    customer: Record Customer;
begin
    customer.Get('30000');

    if customer.Get('10000') then
        Message('%1', customer)
    else
        Error('Not found');

end;

Funzione Find

La funzione Find ha due funzioni derivate, ovvero FindFirst e FindLast. In alcuni casi di codifica standard si usano ancora le funzioni Find('-') e Find('+'). Queste funzioni erano usate nelle versioni precedenti di Business Central.

Il risultato di Find('-') e FindFirst è lo stesso, ma il modo in cui viene richiesto il risultato differisce. In Business Central, la funzione FindFirst chiede a SQL Server di recuperare il primo record nel database usando una query SQL SELECT TOP 1.

La funzione Find('-') richiede a SQL Server una query SELECT e recupera il primo record in Business Central. Questa elaborazione genera risultati insoddisfacenti ed è quindi opportuno usare le funzioni FindFirst e FindLast.

var
    customer: Record Customer;
begin
    customer.Find('-');
    // SELECT * FROM Customer
    Message('%1', customer.Name);

    customer.Find('+');
    // SELECT * FROM Customer Order By No. Desc
    Message('%1', customer.Name);

    customer.FindFirst();
    // SELECT TOP 1 * FROM Customer
    Message('%1', customer.Name);

    customer.FindLast();
    // SELECT TOP 1 * FROM Customer Order By No. Desc
    Message('%1', customer.Name);

Per recuperare tutti i record (o un set di record filtrato), è possibile usare la funzione FindSet.

customer.FindSet();
// SELECT * FROM Customer

Istruzione Next

L'istruzione Next consente di recuperare il record successivo in un set di record. In genere, si usa l'istruzione Next in un'istruzione repeat until. L'istruzione Next può includere un parametro facoltativo che definisce di quanti passi avanzare. Se si imposta il parametro su 3, la funziona recupera sempre un record ogni tre nell'elenco.

customer.FindSet();
// SELECT * FROM Customer
repeat
    // process record
    Message(customer.Name);
until customer.Next() = 0;

Funzione IsEmpty

Quando si intende controllare se esiste un record senza recuperarlo, è meglio usare la funzione IsEmpty.

Metodi e prestazioni del database AL in SQL Server

Il linguaggio AL offre diversi metodi per recuperare i dati dei record. In Dynamics 365 Business Central i record si recuperano usando più set di risultati attivi (MARS). In generale, il recupero dei record con MARS è più veloce rispetto ai cursori lato server. Inoltre, ogni funzione è ottimizzata per uno scopo specifico. Per ottenere prestazioni ottimali è necessario usare il metodo più adatto a un determinato scopo.

  • Record.Get è ottimizzato per ottenere un singolo record in base ai valori della chiave primaria.

  • Record.Find è ottimizzato per ottenere un singolo record in base alle chiavi primarie nel record e a eventuali filtri o intervalli impostati.

  • Record.Find('-') e Record.Find('+') sono ottimizzati per la lettura principalmente da una singola tabella quando l'applicazione potrebbe non leggere tutti i record. Find('-') si implementa emettendo una chiamata TOP X di ottimizzazione automatica, dove X può cambiare nel tempo, in base alle statistiche del numero di righe lette. Di seguito sono riportati esempi di scenari in cui è necessario usare la funzione Find('-') per ottenere risultati ottimali:

    • Prima di registrare un batch di registrazioni C/G, è necessario controllare la validità di tutte le righe del giornale di registrazione e verificare che tutte le righe siano in pareggio. Dopo la prima riga, quando si rileva un errore, non è necessario recuperare il resto delle righe.

    • Se si desidera evadere più ordini in sospeso da un acquisto recente, ma il numero di ordini coperti dall'acquisto non è noto.

  • Record.FindSet(ForUpdate, UpdateKey) è ottimizzato per leggere il set completo di record nel filtro e nell'intervallo specificati. Il parametro UpdateKey non influisce sull'efficienza di questo metodo in Dynamics 365 Business Central, come accadeva invece nelle versioni precedenti del prodotto. FindSet non si implementa emettendo una chiamata TOP X.

  • Record.FindFirst e Record.FindLast sono ottimizzati per trovare il primo o l'ultimo record singolo nel filtro e nell'intervallo specificati.

  • Record.Next può essere chiamato in qualsiasi momento. Tuttavia, se non si chiama Record.Next come parte del recupero di un set di risultati continuo, Business Central chiama un'istruzione SQL separata per trovare il record successivo.