Satzmarke

Was der Benutzer manuell über den Navision-Client kann, nämlich das Setzen von Satzmarken und das anschließende Filtern nach diesen, können wir über den C/AL-Code ebenfalls realisieren.

In diesem Tutorial werden wir zur Demonstration eine neue Codeunit erstellen, die die Artikelübersicht öffnet und dort nur die Artikel anzeigt, die Verkaufspreise mit der Verkaufsart „Debitorenpreisgruppe“ besitzen. Das das nicht mit der normalen Filterfunktion gemacht werden kann hat folgenden Grund: In der Artikelübersicht stehen uns zum Filtern nur die Tabellenfelder zur Verfügung, die sich in der Artikeltabelle befinden. In unserem Beispiel wollen wir aber abhängig von den in der Tabelle „Verkaufspreise“ hinterlegten Daten auf der Artikelübersicht filtern.

Gehe als erstes in den ObjectDesigner und erstelle dort eine neue Codeunit. In dieser Codeunit legen wir zwei globale Record-Variablen an. Die eine mit der Bezeichnung „Item“ und dem Subtype „Item“ und die andere mit der Bezeichnung „SalesPrice“ und Subtype „Sales Price“.

Im „OnRun“-Trigger hinterlassen wir den folgenden C/AL-Code:

IF Item.FIND('-') THEN
	REPEAT
	WITH SalesPrice DO BEGIN
		RESET;
		SETFILTER("Item No.", Item."No.");
		SETFILTER("Sales Type", '%1', "Sales Type"::"Customer Price Group");
		Item.MARK:=FIND('-');
	END;
	UNTIL Item.NEXT=0;
Item.MARKEDONLY:=TRUE;
FORM.RUN(FORM::"Item List", Item);

Der o. g. C/L-Code geht alle Artikel durch und schaut dabei pro Artikel, ob es dazugehörige Verkaufspreise vom Typ „Debitorenpreisgruppe“ gibt. Ist das der Fall, wird über den MARK-Befehl der Artikeldatensatz mit einer Satzmarke gekennzeichnet. Zum Schluss wird über den Befehl MARKEDONLY der Record-Variable gesagt, dass sie nur die gekennzeichneten Datensätze anzeigen soll. In der letzten Zeile öffnen wir die Form Artikelübersicht und übergeben der Form die Record-Variable Item.

Das Ergebnis könnte nach speichern und starten der Codeunit dann so aussehen:

Artikelübersicht Felge Schlauch Hinterradachse

Die Befehle MARK kann sowohl zum Setzen einer Satzmarke benutzt werden, als auch zum Abfragen, ob die Satzmarke gesetzt ist oder nicht. Der Befehl liefert dann entweder TRUE oder FALSE zurück. Der nachfolgende C/AL-Code zeigt, wie so eine Abfrage eingesetzt werden könnte.

Item.GET('1110');
IF Item.MARK = FALSE THEN
	Item.MARK:=TRUE;

Gleiches gilt für den Befehl MARKEDONLY. Denn auch hier kann zum einen der Filter gesetzt werden und zum anderen auch abgefragt werden, ob der Filter gesetzt ist oder nicht. Auch hier zeigt das nachfolgende Beispiel wie die Abfrage eingesetzt werden könnte.

IF Item.MARKEDONLY = TRUE THEN
	MESSAGE('Sie sehen nur die Datensätze die mit einer Satzmarke gekennzeichnet sind.');

Neben diesen beiden Befehlen gibt es noch einen dritten Befehl, der Befehl CLEARMARKS. Mit diesem Befehl können wir alle gesetzten Satzmarken einer Record-Variable löschen.

Ein weiteres Beispiel wie bestimmte Datensätze mit einer Satzmarke gekennzeichnet werden können aber der Filter nicht gesetzt wird:

Item.GET('1110');
Item.MARK:=TRUE;
Item.GET('1150');
Item.MARK:=TRUE;
FORM.RUN(FORM::"Item List", Item);
Artikelübersicht Tourenrad, Rennrad, Vorderrad, Felge, Speichen, Nabe vorn, Vorderachse

In diesem Beispiel setzen wir zwar die Satzmarken, benutzen aber nicht den Befehl MARKEDONLY. Somit wird der Filter nicht gesetzt.