Dynamics AX Blog

"OpenPrinter"-Fehler beim Anzeigen eines Berichtes am Bildschirm

Wenn beim Anzeigen eines Berichtes am Bildschirm folgender Fehler auftritt, muss man im Windows einen Standarddrucker einrichten.

OpenPrinter_1: rc:0 LastError:3012(0xbc4) Es wurden keine Drucker gefunden.

 


 
 
 

Kommissionierliste eines Verkaufsauftrages per Code erfassen

Das nachstehende Code-Beispiel zeigt. wie man per Code eine Erfassung für eine Kommissionierliste buchen kann (in der Annahme daß beispielsweise alle notwendigen Informationen wie Entnahmelagerplatz usw. bereits eingetragen wurden).

Screenshot

static void pickingListRegistration(Args _args)
{
    WMSPickingRouteID pickingRouteID = "00061";    // Route id to be picked
    List list = new List(Types::String);

    list.addEnd(pickingRouteID);

    WMSPickingRoute::finishMulti(list.pack());

    wmsDeliverPickedItems::checkDeliverPickedItems(pickingRouteID, list.pack());
}

 


 
 
 

Kommissionierliste für bestimmte Positionen eines Verkaufsauftrages erstellen

Ich kenne keine Möglichkeit, wie man eine Kommissionierliste nur für bestimmte Auftragspositionen per Code erstellt.

Deshalb nutze ich in dem folgenden Code-Beispiel folgenden Ansatz:

Ich erstelle die Kommissionierliste mit Hilfe des SalesFormLetter-Frameworks und lösche vor dem entscheidenden Schritt (dem Ausführen der run()-Methode) jene Einträge in der Tabelle SalesParmLine, die ich nicht benötigte.

Screenshot

static void createSalesPickingListSingleLine(Args _args)
{
    SalesTable salesTable = salesTable::find("001862"); // Sales order
    container inventTransIdCon = ["014015", "014016"];  // LOT-IDs to pick
    SalesFormLetter salesFormLetter;
    SalesParmLine salesParmLine;
    
    salesFormLetter = SalesFormLetter::construct(DocumentStatus::PickingList);

    // Do the steps manually, which normally are done in method
    // salesFormLetter.update()
    salesFormLetter.salesTable(salesTable);
    salesFormLetter.initParmSalesTable(salesFormLetter.salesTable());
    salesFormLetter.transDate(systemDateGet());
    salesFormLetter.specQty(SalesUpdate::All);
    salesFormLetter.proforma(salesFormLetter.salesParmUpdate().Proforma);
    salesFormLetter.printFormLetter(salesFormLetter.printFormLetter());
    salesFormLetter.printCODLabel(NoYes::No);
    salesFormLetter.printShippingLabel(NoYes::No);
    salesFormLetter.usePrintManagement(false);
    salesFormLetter.creditRemaining(salesFormLetter.creditRemaining());

    salesFormLetter.createParmUpdateFromParmUpdateRecord(
        SalesFormletterParmData::initSalesParmUpdateFormletter(
            salesFormLetter.documentStatus(),
            salesFormLetter.pack(),
            true,
            false,
            false));

    salesFormLetter.initParameters(
        salesFormLetter.salesParmUpdate(),
        Printout::Current);

    salesFormLetter.initLinesQuery();

    // Delete unwanted records in SalesParmLine
    while select forupdate salesParmLine
        where salesParmLine.ParmId == salesFormLetter.parmId()
    {
        if (conFind(inventTransIdCon, salesParmLine.InventTransId) == 0)
        {
            salesParmLine.delete();
        }
    }

    // Let's go
    salesFormLetter.run();
}

 


 
 
 

Kommissionierliste für alle Positionen eines Verkaufsauftrages erstellen

Das nachstehende Code-Beispiel zeigt. wie man per Code eine Kommissionierliste für alle Positionen eines Verkaufsauftrages erstellen kann.

Screenshot

static void createSalesPickingList(Args _args)
{
    SalesTable salesTable = SalesTable::find("000752");
    SalesFormLetter salesFormLetter;

    salesFormLetter = SalesFormLetter::construct(DocumentStatus::PickingList);
    salesFormLetter.update(salesTable, systemDateGet(), SalesUpdate::All);
}

 


 
 
 

Kommissionierliste für einzelne Positionen eines Verkaufauftrages erfassen

Das nachstehende Code-Beispiel zeigt, wie man per Code eine Kommissionieriste erfassen kann und dabei nur Teilmengen verarbeitet.

Dabei verfolge ich den Ansatz, für die benötigte Menge eine eigene Zeile in der Tabelle WMSOrderTrans zu erstellen (über die Teilen-Funktion) und die aktuell nicht benötigte Menge zu stornieren.

Screenshot

static void pickingListRegistrationPartly(Args _args)
{
    WMSPickingRouteID pickingRouteID = "00066";    // Route id to be picked
    Map inventTransMap = new Map(Types::String, Types::Real);
    MapEnumerator me;
    InventTransId inventTransId;
    Qty pickQty;
    List list = new List(Types::String);
    WmsOrderTrans wmsOrderTrans;
    WmsOrderTrans wmsOrderTransNew;

    list.addEnd(pickingRouteID);

    // Build map containing the lot-ids and quantity to pick
    inventTransMap.insert("014023", 7);
    inventTransMap.insert("014026", 3);
    
    // Change quantity
    me = inventTransMap.getEnumerator();
    while (me.moveNext())
    {
        inventTransId = me.currentKey();    
        pickQty = me.currentValue();
        
        ttsBegin;
        select forupdate wmsOrderTrans
            where wmsOrderTrans.RouteId == pickingRouteID &&
                  wmsOrderTrans.inventTransId == inventTransId &&
                  wmsOrderTrans.FullPallet == NoYes::No &&
                 (wmsOrderTrans.ExpeditionStatus == WMSExpeditionStatus::Registered ||
                  wmsOrderTrans.ExpeditionStatus == WMSExpeditionStatus::Activated  ||
                  wmsOrderTrans.ExpeditionStatus == WMSExpeditionStatus::Started);        
        
        // Split line
        wmsOrderTransNew = wmsOrderTrans.split(pickQty);        
        ttsCommit;
        
        ttsBegin;
        // Cancel remaining line
        wmsOrderTrans.cancel();
        ttsCommit;
    }
    
    // Update
    WMSPickingRoute::finishMulti(list.pack()); 

    wmsDeliverPickedItems::checkDeliverPickedItems(pickingRouteID, list.pack());
}

 
 
 

Kontextmenü des X++-Editors in Dynamics AX 2012 erweitern

Voreinigen Jahren hatte ich schon mal einen Beitrag über die Klasse EditorScripts geschrieben. Das ist nämlich jene, mit deren Hilfe man die Funktionalität des X++-Editors recht einfach erweitern kann.

Beispielsweise kann man das Kontextmenü des Editors einfach erweitern, in dem man in der Klasse Methoden erstellt.

Diese Methoden müssen lediglich einige Kriterien erfüllen, das sind u.a.:

  • Der erste und einzige Parameter muss vom Typ Editor sein
  • Die Methode muss public sein
  • Die Methode darf nichts retournieren (void)

X++-Editor


 
 
 

Abfragen von Informationen zu SSRS-Berichten über die Microsoft Dynamics AX 2012 Management Shell

Microsoft Dynamics AX 2012 Management ShellMit der Microsoft Dynamics AX 2012 Management Shell kann man zahlreiche Informationen über seine Dynamics AX 2012-Instanz in Erfahrung bringen.

Beispielsweise kann man sich über das nachstehende Kommando eine Liste aller SSRS-Berichte oder auch nur einem bestimmten Bericht (z.B. SalesInvoice) ausgeben lassen.

get-AXReport -reportname *
get-AXReport -reportname salesinvoice

 
 
Seiten 1 2 3 4 ... 53 » 

 

 
 
 
Beiträge des aktuellen Monats
März 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 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