Artikelauswahl pro Debitor einschränken (2.Teil)

Im ersten Teil haben wir die Möglichkeit geschaffen, dass Sortimentsgruppen angelegt und Artikel zu diesen zugeordnet werden können. Außerdem lässt sich jetzt pro Debitor eine dieser Sortimentsgruppe hinterlegen. In diesem Teil des Tutorials werden wir nun die eigentlichen Prüfungen programmieren und ggf. eine Fehlermeldung ausgeben.

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 Änderung anschließ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:

Zum Schluss müssen die folgenden Zeilen an Programmcode in diesem Trigger eingefügt 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.

Artikelübersicht


 

Zurück zur Tutorialübersicht.