Daten mit AL-Anweisungen aus der Datenbank abrufen

Abgeschlossen

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.Get ist für das Abrufen eines einzelnen Datensatzes basierend auf Primärschlüsselwerten optimiert.

  • Record.Find ist für das Abrufen eines einzelnen Datensatzes basierend auf den Primärschlüsseln im Datensatz und jedem festgelegten Filter oder Bereich optimiert.

  • Record.Find('-') und Record.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 selbstoptimierender TOP X-Aufruf ausgegeben wird, wobei sich X im 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 Funktion Find('-') 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. FindSet wird nicht mit der Ausgabe eines TOP X-Aufrufs implementiert.

  • Record.FindFirst und Record.FindLast sind dafür optimiert, den einzelnen ersten oder letzten Datensatz im angegebenen Filter und Bereich zu finden.

  • Record.Next kann jederzeit aufgerufen werden. Wenn Record.Next jedoch nicht als Teil eines fortlaufenden Ergebnissatzes aufgerufen wird, ruft Business Central eine separate SQL-Anweisung auf, um den nächsten Datensatz zu finden.