Recupero dei dati dal database con le istruzioni AL
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('-')eRecord.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 chiamataTOP Xdi ottimizzazione automatica, doveXpuò cambiare nel tempo, in base alle statistiche del numero di righe lette. Di seguito sono riportati esempi di scenari in cui è necessario usare la funzioneFind('-')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.FindSetnon si implementa emettendo una chiamataTOP X.Record.FindFirsteRecord.FindLastsono ottimizzati per trovare il primo o l'ultimo record singolo nel filtro e nell'intervallo specificati.Record.Nextpuò essere chiamato in qualsiasi momento. Tuttavia, se non si chiamaRecord.Nextcome parte del recupero di un set di risultati continuo, Business Central chiama un'istruzione SQL separata per trovare il record successivo.