Preisinformationen auf Positionen per Code eintragen und Preisfindung kontrollieren

Eine häufige Anforderung in Projekten ist es, daß Auftrags- oder Bestellpositionen durch irgendeine Programmlogik erstellt werden sollen, beispielsweise durch Datenimporte o.ä.

Zuletzt hatte ich erstmalig die Anforderung, daß per Code generierten Auftragspositionen anschließend aber manuell bearbeitet werden sollen, wobei die Preisinformationen wie Verkaufspreis und -rabatt aber unbedingt erhalten bleiben sollten.

Bearbeitet man in Dynamics AX aber bestimmte Felder einer Position, löst dies aber u.U. eine Preisfindung aus. Diese galt es also zu verhindern bzw. durch eine Abfrage den Benutzer zumindest davor hinzuweisen. Glücklicherweise gibt es eine solche Abfrage bereits, die über die folgenden Felder gesteuert wird:

Feld Beschreibung
ManualEntryChangepolicy Referenz auf Tabelle PriceDiscChangePolicy
SystemEntryChangePolicy Referenz auf Tabelle PriceDiscChangePolicy
SystemEntrySource BaseEnum

Übersteuert man in einer Auftragsposition manuell den Preis, kümmert sich AX um das Befüllen dieser Felder und kennzeichnet so die Preisinformationen als manuell verändert.
Ändert man anschließend beispielsweise die Auftragsmenge, öffnet sich folgender Dialog:

Screenshot

Ob sich dieser Dialog öffnet, wird übrigens über die Debitorenparameter > Preise > Handelsvereinbarungsauswertung gesteuert.

Nun werden die oben genannten Felder aber nur bestimmten Umständen von AX befüllt, d.h. man muss sich bei der Erstellung einer Auftragsposition per Code explizit um diese Felder kümmern.

Tut man dies nicht, werden die per Code geschriebene Preisinformationen überschrieben, wenn mit der Position irgendetwas passiert, was eine Preisfindung erforderlich macht.

Nachfolgende findet Ihr ein paar Beispiele, wie man eine Auftragsposition per Code anlegt und dabei die genannten Felder so setzt, daß bei einer Änderung von preisrelevanten Feldern in der Position sich der oben beschriebene Dialog öffnet. Bei all diesen Beispiele tue ich praktisch so, als wären die Preise manuell erfasst worden, das wird über den BaseEnum PriceDiscSystemSource gesteuert.

Erstellen einer Position per AxSalesLine

Für jedes manuell befüllte Preis-Feld muss die Methode setPriceDiscChangePolicy() aufgerufen werden

static void createSalesLine(Args _args)
{
    AxSalesLine axSalesLine;
    SalesLine salesLine;

    salesLine.clear();
    salesLine.salesId = "001060";
    salesLine.modifiedField(fieldNum(salesLine, SalesId));
    salesLine.ItemId = "D0001";
    salesLine.modifiedField(fieldNum(salesLine, ItemId));
    salesLine.SalesQty = 5;
    salesLine.modifiedField(fieldNum(salesLine, SalesQty));

    salesLine.SalesPrice = 499.99;
    salesLine.modifiedField(fieldNum(salesLine, SalesPrice));

    salesLine.LineDisc = 10.00;
    salesLine.modifiedField(fieldNum(salesLine, LineDisc));

    salesLine.LinePercent = 20.00;
    salesLine.modifiedField(fieldNum(salesLine, LinePercent));

    salesLine.PriceUnit = 1.00;
    salesLine.modifiedField(fieldNum(salesLine, PriceUnit));
    
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, SalesPrice));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, LineDisc));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, LinePercent));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, PriceUnit));

    axSalesLine = new axSalesLine();
    axSalesLine.continueOnError(false);
    axSalesLine.validateInput(true);

    axSalesLine.salesLine(salesLine);

    axSalesLine.save();
}

 

Erstellen einer Position per SalesLine.create()

Für jedes manuell befüllte Preis-Feld muss die Methode setPriceDiscChangePolicy() aufgerufen werden

static void createSalesLine(Args _args)
{
    SalesLine salesLine;

    salesLine.clear();
    salesLine.salesId = "001060";
    salesLine.modifiedField(fieldNum(salesLine, SalesId));
    
    salesLine.ItemId = "D0001";
    salesLine.modifiedField(fieldNum(salesLine, ItemId));
    
    salesLine.SalesQty = 5;
    salesLine.modifiedField(fieldNum(salesLine, SalesQty));

    salesLine.SalesPrice = 499.99;
    salesLine.modifiedField(fieldNum(salesLine, SalesPrice));

    salesLine.LineDisc = 10.00;
    salesLine.modifiedField(fieldNum(salesLine, LineDisc));

    salesLine.LinePercent = 20.00;
    salesLine.modifiedField(fieldNum(salesLine, LinePercent));

    salesLine.PriceUnit = 1.00;
    salesLine.modifiedField(fieldNum(salesLine, PriceUnit));
    
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, SalesPrice));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, LineDisc));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, LinePercent));
    salesLine.setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(salesLine, PriceUnit));
    
    salesLine.createLine(
        true,
        true);
}

Das oben beschriebene trifft übrigens nicht nur für Auftragspositionen zu, sondern beispielsweise auch auf Bestellpositionen.

Beispiel für eine Bestellposition über AxPurchLine

static void createPurchLine(Args _args)
{
    AxPurchLine axPurchLine;
    PurchLine purchLine;
    
    axPurchLine = AxPurchLine::newPurchLine(purchLine);
    axPurchLine.validateInput(true);
    axPurchLine.continueOnError(false);
    
    axpurchLine.parmPurchId("000036");
    axpurchLine.parmItemId("C0004");
    axPurchLine.parmPurchQty(10);
    axPurchLine.parmPurchPrice(24.50);
    
    axPurchLine.purchLine().setPriceDiscChangePolicy(
        PriceDiscSystemSource::ManualEntry,
        fieldNum(PurchLine, PurchPrice));    
    
    axPurchLine.save();
}

Detailiertere Information sind auch im Dokument "Trade agreement evaluation policies in Microsoft Dynamics AX 2012" zu finden.

 

Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012

 
 

 

 
 
 
Beiträge des aktuellen Monats
November 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
252627282930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu