Daten mit AL-Anweisungen aus der Datenbank abrufen
Sie können Data-Access-Funktionen verwenden, um Daten aus der Datenbank abzurufen.
Sie können die folgenden Data-Access-Funktionen verwenden, um Datensätze abzurufen:
Get
Find, FindFirst, FindLast
Next
IsEmpty
Get-Funktion
Die Get-Funktion ruft einen Datensatz basierend auf dem Primärschlüssel ab.
Wenn Ihre Tabelle einen Primärschlüssel für ein Feld hat, müssen Sie einen Parameter für die Get-Funktion angeben. Wenn der Primärschlüssel ein kombinierter Schlüssel aus mehreren Feldern ist, müssen Sie diese in der Reihenfolge der Primärschlüsseldefinition angeben.
Im folgenden Beispiel ein Datensatz mit Primärschlüssel 30000 aus der Debitorentabelle abgerufen. Weil der Primärschlüssel einer Debitorentabelle vom Typ Code[20] ist, müssen Sie den Wert als Zeichenfolge angeben. Der beste Weg, um die Get-Funktion zu verwenden, ist innerhalb einer if-Anweisung.
Wenn der Datensatz nicht gefunden wird und Sie keine if-Anweisung verwenden, um das Ergebnis der Get-Anweisung zu überprüfen, generieren Sie einen Fehler im Code.
var
customer: Record Customer;
begin
customer.Get('30000');
if customer.Get('10000') then
Message('%1', customer)
else
Error('Not found');
end;
Find-Funktion
Die Funktion Find hat zwei abgeleitete Funktionen: FindFirst und FindLast. In einigen Standardcodes werden die Funktionen Find('-') und Find('+') weiterhin verwendet. Diese Funktionen wurden in älteren Versionen von Business Central verwendet.
Das Ergebnis von Find('-') und FindFirst ist das Gleiche, aber wie das Ergebnis angefordert wird, ist unterschiedlich. Mit der Funktion FindFirst fordert Business Central SQL Server auf, den ersten Datensatz in der Datenbank mithilfe von einer SQL-Abfrage SELECT TOP 1.
Die Funktion Find('-') fordert SELECT von einem SQL Server und ruft den ersten Datensatz in Business Central ab. Dieser Prozess führt zu einer schlechten Leistung. Verwenden Sie die Funktionen FindFirst und FindLast stattdessen.
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);
Um alle Datensätze (oder einen gefilterten Satz von Datensätzen) abzurufen, können Sie die Funktion FindSet verwenden.
customer.FindSet();
// SELECT * FROM Customer
Next-Anweisung
Die Next-Anweisung wird verwendet, um den nächsten Datensatz in einer Datensatzgruppe abzurufen.
Normalerweise verwenden Sie die Next-Anweisung in einer repeat until-Anweisung. Die Next-Anweisung verfügt optional über einen Parameter, der definiert, wie viele Schritte Sie vorwärts ausführen möchten. Wenn Sie dem Parameter den Wert 3 geben, wird immer jeder dritte Datensatz in der Liste angezeigt.
customer.FindSet();
// SELECT * FROM Customer
repeat
// process record
Message(customer.Name);
until customer.Next() = 0;
IsEmpty-Funktion
Wenn Sie überprüfen möchten, ob ein Datensatz vorhanden ist, Sie diesen jedoch nicht abrufen möchten, ist es besser, die Funktion IsEmpty zu verwenden.
AL-Datenbankmethoden und Leistung auf SQL Server
Die AL-Sprache bietet mehrere Methoden zum Abrufen von Datensatzdaten. In Dynamics 365 Business Central werden Datensätze über mehrere aktive Ergebnissätze (MARS) abgerufen. Datensätze lassen sich im Allgemeinen schneller mit MARS als mit serverseitigen Cursorn abrufen. Darüber hinaus ist jede Funktion für einen bestimmten Zweck optimiert. Zur Erzielung einer optimalen Leistung müssen Sie die Methode verwenden, die für einen bestimmten Zweck am besten geeignet ist.
Record.Getist für das Abrufen eines einzelnen Datensatzes basierend auf Primärschlüsselwerten optimiert.Record.Findist für das Abrufen eines einzelnen Datensatzes basierend auf den Primärschlüsseln im Datensatz und jedem festgelegten Filter oder Bereich optimiert.Record.Find('-')undRecord.Find('+')sind primär für das Lesen aus einer einzelnen Tabelle optimiert, wenn die Anwendung möglicherweise nicht alle Datensätze liest.Find('-')wird implementiert, indem ein selbstoptimierenderTOP X-Aufruf ausgegeben wird, wobei sichXim Laufe der Zeit basierend auf Statistiken der Anzahl der gelesenen Zeilen ändern kann. Im Folgenden finden Sie Beispiele für Szenarien, in denen Sie die FunktionFind('-')verwenden sollten, um eine optimale Leistung zu erzielen:Bevor Sie einen Fibu Buch.-Blattnamen buchen, müssen Sie alle Fibu Buch.-Blattzeilen auf ihre Gültigkeit überprüfen und sicherstellen, dass alle Zeilen im Saldo sind. Wenn nach der ersten Zeile ein Fehler gefunden wird, müssen Sie die restlichen Zeilen nicht abrufen.
Wenn Sie mehrere ausstehende Bestellungen aus einem kürzlich getätigten Einkauf ausführen möchten, aber nicht wissen, wie viele Bestellungen durch den Kauf abgedeckt sind.
Record.FindSet(ForUpdate, UpdateKey)ist für das Lesen der vollständigen Reihe von Datensätzen im angegebenen Filter und Bereich optimiert. Der Parameter „UpdateKey“ hat keinen Einfluss auf die Effizienz dieser Methode in Dynamics 365 Business Central, wie es in älteren Versionen des Produkts der Fall war.FindSetwird nicht mit der Ausgabe einesTOP X-Aufrufs implementiert.Record.FindFirstundRecord.FindLastsind dafür optimiert, den einzelnen ersten oder letzten Datensatz im angegebenen Filter und Bereich zu finden.Record.Nextkann jederzeit aufgerufen werden. WennRecord.Nextjedoch nicht als Teil eines fortlaufenden Ergebnissatzes aufgerufen wird, ruft Business Central eine separate SQL-Anweisung auf, um den nächsten Datensatz zu finden.