Dynamics AX Blog - Seite 1
Kommissionierliste eines Verkaufsauftrages per Code erfassen
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 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 erstellen
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 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 Shell
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 |
|
|
|
|
|
|



Mit der Microsoft Dynamics AX 2012 Management Shell kann man zahlreiche Informationen über seine Dynamics AX 2012-Instanz in Erfahrung bringen.
Wenn beim Anzeigen eines Berichtes am Bildschirm folgender Fehler auftritt, muss man im Windows einen Standarddrucker einrichten.