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.
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.
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.
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:
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.