Anleitung

Gehe in die Tabelle „Sales Line“ (ID: 37) und dort im „OnValidate“-Trigger des Feldes „No.“. Hier müssen ganz am Ende des Triggers die folgenden Zeilen Programmcode hinzufügen:

IF "Document Type"="Document Type"::Order THEN BEGIN
	SalesHeader.GET("Document Type","Document No.");
	Customer.GET(SalesHeader."Sell-to Customer No.");
	IF NOT ItemAssortmentGroup.GET("No.", Customer."Assortment Group Code") THEN
		IF NOT CONFIRM(Text100, FALSE, "No.", Customer."Assortment Group Code", Customer."No.") THEN
		ERROR('');
END;

Damit der o. g. Programmcode funktioniert muss die lokale Variable „ItemAssortmentGroup“ vom Type „Record“ und SubType „Item Assortment Group“ angelegt werden. Auch die globale Textkonstante „Text100“ mit dem Inhalt „Der Artikel %1 befindet sich nicht im Sortiment %2.\\Wollen Sie trotzdem den Artikel für Debitor %3 nehmen?“ muss angelegt werden.

Nachdem die Tabelle nun angepasst und gespeichert worden ist, erhalten wir beim Wählen eines Artikels ggf. eine Fehlermeldung mit der Frage, ob dieser Artikel wirklich in die Verkaufszeile übernommen werden soll.

Der Artikel befindet sich nicht im Sortiment STANDARD. Wollen Sie trotzdem den Artikel für Debitor 10000 nehmen? Ja Nein

Produktiver wäre es jedoch, wenn bereits in der Artikelübersicht erkenntlich wäre, welcher Artikel sich im Sortiment des Debitors befindet und welcher nicht. Um dies zu realisieren ist noch etwas Programmierung nötig.

Öffne über den „Design“-Button des ObjectDesigners als das Formular „Item List“ (ID: 31). Dort müssen über „Ansicht“ – „C/AL Globals“ drei Variablen und eine neue Funktion hinzugefügt werden.

Erstellen neuer globaler Variablen im Formular Item List

Die erste neue Variable nennen wir „CustomerNo“, ist vom Typ „Code“ und hat eine Länge von 20 Zeichen. Die nächste Variable nennen wir „Customer“, ist vom Typ „Record“ und Subtype „Customer“. Die letzte neue Variable nennen wir „InAssortmentGroup“ und ist vom Typ „Boolean“.

Die Funktion, die wir noch anlegen müssen, benennen wir „MarkCustAssortment“. Diese neuen Funktion bekommt einen Parameter der sich „CustNo“ nennt, vom Typ „Code“ ist und eine Länge von 20 Zeichen hat.

Erstellen neuer Funktion MarkCustAssortment im Formular Item List

Der Programmcode der neue Funktion steht uns über „Ansicht“ – „C/AL Code“ zur Verfügung (ganz unten). Dort erstellen wir die folgenden zwei Zeilen Programmcode:

IF Customer.GET(CustNo) THEN
	CustomerNo:=CustNo;

Als nächstes gehen wir in den „OnAfterGetRecord“-Trigger des Formulars und tragen dort die folgende Zeile ein:

InAssortmentGroup:=ItemAssortmentGroup.GET("No.", Customer."Assortment Group Code");

Damit die o. g. Zeile funktioniert muss eine lokale Variable mit der Bezeichnung „ItemAssortmentGroup“ angelegt werden. Diese Variable ist vom Typ „Record“ und Subtype „Item Assortment Group“.

Gehe nun in den „OnFormat“-Trigger der Spalte „No.“. Dort sind dann die folgenden zwei Zeilen Programmcode einzutragen:

IF (CustomerNo<>'') AND NOT InAssortmentGroup THEN
	CurrForm."No.".UPDATEFORECOLOR(255);

Trage die zwei Zeilen auch in den „OnFormat“-Trigger der Spalte „Description“ ein. Speichere die Änderunganschließend ab und schließe das Formular.

Im letzten Schritt muss das Sub-Formular des VK-Auftrags „Sales Order Subform“ (ID: 46) angepasst werden. Öffne dieses Formular über den „Design“-Button des ObjectDesigners.

Kurze Erklärung: Wenn in einer VK-Auftragszeile über den Lookup-Button des Feldes „Nr.“ die Artikelübersicht geöffnet wird, dann geschieht das, weil in der Tabellenfeldeigenschaft „TableRelation“ dies so definiert wurde. Wir müssen aber vor dem Öffnen der Artikelübersicht unsere neue Funktion „MarkCustAssortment“ aufrufen. Und das ist das Problem. Wir müssen nämlich jetzt die komlette Funktionalität programmieren, die hinter der Eigenschaft „TableRelation“ liegt.

Gehe hierzu in den „OnLookup“-Trigger der Spalte „No.“. Dort müssen laut der nachfolgenden Abbildung zwölf lokale Variablen angelegt werden:

Lokale Variablen des OnLookup-Trigers der Spalte No. der Sales Order Subform
CASE Type OF
	Type::" ":
		BEGIN
			StandardTextForm.LOOKUPMODE:=TRUE;
			IF StandardTextForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
				StandardTextForm.GETRECORD(StandardTextRec);
				VALIDATE("No.", StandardTextRec.Code);
			END;
		END;
	Type::"G/L Account":
		BEGIN
			GLAccountForm.LOOKUPMODE:=TRUE;
			IF GLAccountForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
			GLAccountForm.GETRECORD(GLAccountRec);
			VALIDATE("No.", GLAccountRec."No.");
			END;
	END;
	Type::Item:
		BEGIN
			SalesHeader.GET("Document Type","Document No.");
			ItemForm.MarkCustAssortment(SalesHeader."Sell-to Customer No.");
			ItemForm.LOOKUPMODE:=TRUE;
			IF ItemForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
				ItemForm.GETRECORD(ItemRec);
				VALIDATE("No.", ItemRec."No.");
			END;
		END;
	Type::Resource:
		BEGIN
			ResourceForm.LOOKUPMODE:=TRUE;
			IF ResourceForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
				ResourceForm.GETRECORD(ResourceRec);
				VALIDATE("No.", ResourceRec."No.");
			END;
		END;
	Type::"Fixed Asset":
		BEGIN
			FixedAssetForm.LOOKUPMODE:=TRUE;
			IF FixedAssetForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
				FixedAssetForm.GETRECORD(FixedAssetRec);
				VALIDATE("No.", FixedAssetRec."No.");
			END;
		END;
	Type::"Charge (Item)":
		BEGIN
			ChargeItemForm.LOOKUPMODE:=TRUE;
			IF ChargeItemForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
				ChargeItemForm.GETRECORD(ChargeItemRec);
				VALIDATE("No.", ChargeItemRec."No.");
			END;
		END;
END;

Speichere und schließe das Formular.

Wenn nun über den Lookup-Button der Feldes "Nr." der VK-Zeile die Artikelübersicht aufgerufen wird, werden die Artikel, die sich nicht im Sortiment des Debitors befinden, durch die rote Farbe kenntlich gemacht.

Artikelübersicht über die Artikel Erstes Rad, Rennrad, Tourenrad, Noch ein Rad.