Dynamics AX Blog - Microsoft Dynamics AX (Axapta)
In den letzten Jahren, in denen ich mich fast hauptsächlich mit der Entwicklung im Umfeld von Microsoft Dynamics AX (vormals Axapta) beschäftigt habe, ist das eine oder andere Code-Fragment entstanden, von dem ich mir vorstellen könnte, daß es auch für andere AX-Entwickler ganz nützlich sein könnte. Aber auch Tips und Tricks zu dem mächtigen ERP-System werde ich in dieser Kategorie präsentieren.
RSS-Feed dieser KategorieKommissionierliste eines Verkaufsauftrages per Code erfassenstatic 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 erstellenIch 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. 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 erstellenstatic 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 erfassenDas 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. 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 erweiternVoreinigen 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.:
|
Abfragen von Informationen zu SSRS-Berichten über die 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 |
|
|
|
|
|
|
Wenn beim Anzeigen eines Berichtes am Bildschirm folgender Fehler auftritt, muss man im Windows einen Standarddrucker einrichten.