Dynamics NAV – Programmierung: Die Schleifentypen REPEAT-UNTIL, WHILE-DO, FOR-TO

Der Softwareentwickler Blog - NavisionWie in jeder anderen Programmiersprache gibt es natürlich auch in C/AL, der Programmiersprache von Microsoft Dynamics NAV (Navision), verschiedene Arten der Schleifenanweisungen.

Diesen will ich mich in diesem Artikel widmen und aufzeigen, wie sie funktionieren und wo die Grenzen sind.

Zuerst einmal eine kleine Übersicht. In C/AL unterscheidet man zwischen 3 Schleifenarten:

  1. FOR-TO bzw. FOR-DOWNTO – Schleife
  2. WHILE-DO – Schleife
  3. REPEAT-UNTIL – Schleife

FOR-TO und FOR-DOWNTO – Schleife

Dies ist wohl der Klassiker unter den Schleifentypen. Trotzdem ist es aber auch gleich der Typ, der am seltensten Einsatz in Navision findet.

FOR I := 1 TO 1000 DO BEGIN
  Anweisung;
  Anweisung;
END;

Es ist auch möglich die Schleife von einem hohen Wert zu einem kleineren Wert herunter zu zählen. Hierfür wird in der FOR-Schleife das TO durch DOWNTO ersetzt.

FOR I := 1000 DOWNTO 1 DO BEGIN
  Anweisung;
  Anweisung;
END;

Im Gegensatz zu anderen Programmiersprachen wie C# oder VB.NET ist es aber nicht möglich, die Schrittweite zu beeinflussen. Diese verbleibt stets bei 1 bzw. -1.

WHILE-DO – Schleife

Dieser Schleifentyp beinhaltet die Abbruch-Bedingung am Anfang der Schleife.

WHILE I < 1000 DO BEGIN
  Anweisung;
  I := I + 1;
END;

Natürlich können mehrere Abbrechbedingungen miteinander mit logischen Operatoren wie AND und OR verknüpft werden. Dabei muss zudem auf eine korrekte Klammersetzung bei der Programmierung geachtet werden.

ExitLoop := FALSE;
WHILE ((I < 1000) OR (ExitLoop = TRUE)) DO BEGIN
  Anweisung;
  IF A = B THEN
    ExitLoop := TRUE;
  I := I + 1;
END;

REPEAT-UNTIL – Schleife

Die REPEAT-Until Schleife ist wohl der meist verwendete Schleifentyp in Navision/Microsoft Dynamcis NAV. Bei dieser Schleife steht die Abbruch-Bedingung am Ende.

IF x < y THEN BEGIN
  REPEAT
    x := x + 1;
    a := a - 1;
  UNTIL x = y;
  b := x;
END;

Vor allem beim Durchlaufen von Datensätzen (Records) wird sie gerne eingesetzt. Hierbei ist die Abbruchbedingung das Ergebnis der NEXT-Funktion. Wenn der letzte Datensatz durchlaufen wurde, gibt diese eine 0 zurück.

IF Customer.FIND('-') THEN
  REPEAT
    Anweisung;
  UNTIL Customer.NEXT = 0;

Auch hier ist eine Verkettung von Abbruch-Bedingungen durch logische Operatoren wie bei der WHILE-Schleife möglich.

Zusammenfassung

Im Gegensatz zu anderen Programmiersprachen sind die Schleifen in C/AL, allen voran die FOR-Schleife, nicht so mächtig. So gibt es keine Ausstiegsmöglichkeit aus den Schleifen (wie ein „Break“ in C# bzw. „Exit For“ in VB.NET) und auch keine flexible Schrittweite für die FOR-Schleife – Es gibt zwar ähnliche Ausdrücke, sie haben aber andere Auswirkungen. Aber das alles ist kein Beinbruch, da man diese Funktionalitäten auch anders, zum Beispiel über eine WHILE-Schleife, abbilden kann.

Comments
  1. Björn
  2. Carsten Seifert