Fortschrittsbalken

Fortschrittsbalken tauchen an vielen Stellen in Navision auf. Meistens dann, wenn es mal wieder etwas länger dauert, informiert uns Navision mit einem oder mehreren Fortschrittsbalken über den aktuellen Verarbeitungsstatus.

Ein fertiger Fortschrittsbalken in Aktion

Für die Erstellung eines solchen Fortschrittsbalkens bietet Navision uns den Variablen-Typ „Dialog“ mit den dazugehörigen C/AL-Befehlen OPENUPDATECLOSE und INPUT an.

Für dieses Tutorial werden wir einen kleinen Report erstellen, der nichts weiter macht als die Datensätze einer großen Tabelle (groß im Sinne von „viele Datensätze“) durchläuft und dabei einen Fortschrittsbalken anzeigt. Die Tabelle „Item“ (Artikel) ist oft eine so große Tabelle.

Gehe in den „ObjectDesigner“ und erstelle über den Button „New“ einen neuen Report. Die Report-Eigenschaft „ProcessingOnly“ setzen wir auf „TRUE“.

Zunächst werden drei globale Variablen angelegt:

Name Datatype
Window Dialog
Factor Decimal
Counter Decimal
C/AL Globals in Dynamics NAV

Im „OnPreReport“-Trigger des Reports muss als nächstes der folgende C/AL-Code eingefügt werden:

Window.OPEN(
	'#1#################################\\' +
	'Artikel prüfen  #2###### @3@@@@@@@@');

Window.UPDATE(1, 'Artikel werden geprüft. Bitte warten!');

Mit dem Befehl „OPEN“ der Dialog-Variable „Window“ öffnen wir ein neues Dialogfenster und setzen direkt drei Platzhalter. Die mit dem Raute-Zeichen beginnenden Platzhalter werden im späteren Verlauf Texte darstellen. Der dritte und für dieses Tutorial viel wichtigere Platzhalter ist für den eigentlichen Fortschrittsbalken zuständig. Er wird mit dem AT-Zeichen (Affenschaukel, Klammeraffe) und einer fortlaufenden Nummer (in unserem Fall ist das die 3) deklariert. Mit dem UPDATE-Befehl füllen wir auch direkt den ersten Platzhalter.

Jetzt wählen wir als DataItem die Tabelle „Item“. Im „OnPreDateItem“-Trigger des DataItems platzieren wir dann den folgenden C/AL-Code:

IF COUNT > 0 THEN
	Factor := 9999 / COUNT;

Hier wird zunächst geprüft, ob die Artikeltabelle auch Datensätze enthält. Beim Starten des Reports werden die gesetzten Filter natürlich berücksichtigt. Wenn Datensätze somit vorliegen wird der Faktor einmalig berechnet.

Es muss noch gesagt werden, dass der Fortschrittsbalken zwar von 0 % bis 100 % geht, intern – also für uns in der Programmierung – allerdings die Werte 0 bis 9999 genutzt werden. Der Wert 9999 ist somit die 100 % auf dem Fortschrittsbalken.

Nachdem nun der Faktor ermittelt ist und wir dadurch wissen wieviel Prozent ein Datensatz auf dem Fortschrittsbalken darstellen muss, geht es weiter im „OnAfterGetRecord“-Trigger des DataItems.

Counter += 1;
Window.UPDATE(2, "No.");
Window.UPDATE(3, (Counter * Factor) DIV 1);

Diese drei Zeilen werden pro Artikel ausgeführt. Wir zählen also die Variable „Counter“ jedes Mal um eins aufwärts. In der zweiten Zeile füllen wir den zweiten Platzhalter mit der aktuellen Artikelnummer. In der letzten Zeile füllen wir den dritten Platzhalter, die Fortschrittsanzeige, mit einem Wert. Diesen Wert berechnen wir noch schnell indem wir die Variablen „Counter“ und „Factor“ miteinander multiplizieren. Um ein Wert vom Typ „Integer“ zu bekommen, benutzen wir noch den DIV-Befehl.

Zum Schluss noch die folgende Zeile C/AL-Code im „OnPostDateItem“ hinzufügen, die das Dialogfenster schließt.

Window.CLOSE;

Speichere den neuen Report ab und starte ihn.