Dynamics AX Blog - Seite 44
Erstellen und Buchen eines Umlagerungsjournal in AX 2009
25.09.2009Microsoft Dynamics AX (Axapta)
Nachstehend ein Codebeispiel, wie man in Dynamics AX 2009 per X++ ein Umlagerungsjournal erstellen und buchen kann. static void createAndPostInventJournalTransfer(Args _args) { inventJournalTable inventJournalTable; inventJournalTrans inventJournalTrans; journalCheckPost journalCheckPost; itemId _itemId = "1000"; qty _qty = 1; inventDimId _fromInventDimId = "00000070_069"; inventDimId _toInventDimId = "00000063_069"; ; try { ttsbegin; // Create header inventJournalTable.clear(); inventJournalTable.initValue(); inventJournalTable.initFromInventJournalName( InventJournalName::find(InventJournalName::standardJournalName(InventJournalType::Transfer))); inventJournalTable.SystemBlocked = NoYes::Yes; inventJournalTable.BlockUserId = curUserId(); inventJournalTable.insert(); // Create lines inventJournalTrans.clear(); inventJournalTrans.initValue(); inventJournalTrans.initFromInventJournalTable(inventJournalTable); inventJournalTrans.ItemId = _itemId; inventJournalTrans.initFromInventTable(inventTable::find(inventJournalTrans.ItemId)); inventJournalTrans.Qty = _qty; inventJournalTrans.inventMovement().journalSetCostPrice(); inventJournalTrans.inventDimId = _fromInventDimId; inventJournalTrans.toinventDimId = _toInventDimId; inventJournalTrans.voucher = numberSeq::newGetVoucherFromCode( InventJournalName::find(inventJournalTable.JournalNameId).VoucherSeqId).voucher(); inventJournalTrans.insert(); // Post journal journalCheckPost = InventJournalCheckPost::newJournalCheckPost(JournalCheckPostType::Post, inventJournalTable); journalCheckPost.run(); ttscommit; } catch (Exception::Error) { throw exception::Error; } } Mit der einen oder anderen Anpassung sollte es auch möglich sein, Journale anderer Typen auf ähnliche Art & Weise zu erstellen. |
Fehlerhafte str2con Funktion unter AX 2009
17.09.2009Microsoft Dynamics AX (Axapta)
Vor fast zwei Jahren habe ich schon einmal über die Funktion/Methode str2con und deren Unzulänglichkeiten in älteren Versionen von Dynamixs AX geschrieben. Leider musste ich vor kurzem feststellen, daß diese Funktion in AX 2009 auch nicht so zuverlässig ist, wie ich sie mir wünschen würde. Sind nämlich im zu zerteilenden String rein numerische Werte enthalten, die größer oder gleich 2^31 (=2147483648) sind, kann AX diese Werte nicht mehr korrekt verarbeiten. Nachstehend ein Job, der dieses Fehlverhalten demonstriert: static void str2conBug(Args _args)
{ container con; str myStr; int i; ; myStr += "Dynamics" + ";"; myStr += "Ax 2009" + ";"; myStr += "str2con" + ";"; myStr += "does" + ";"; myStr += "not work with" + ";"; myStr += "numeric values greater" + ";"; myStr += "than" + ";"; myStr += "2 ^ 31." + ";"; myStr += "Example:" + ";"; myStr += "2147483648" + ";"; // does not work myStr += "(=2^31)" + ";"; myStr += " " + ";"; myStr += "Example:" + ";"; myStr += "5432167890" + ";"; // does not work myStr += "(>2^31)"; con = str2con(myStr, ";"); for(i=1;i<=conLen(con);i++) { info(conPeek(con, i)); } } Mir blieb also nichts anderes übrig, als mir einen Ersatz für die Funktion str2con zu schreiben: |
SELECT-Statements in Verbindung mit Maps
09.09.2009Microsoft Dynamics AX (Axapta)
Wie man Maps verwenden kann, ist u.a. in der MSDN beschrieben, wie man allerdings Maps in Verbindung mit SELECT-Statements verwendet, steht auch dort nicht beschrieben. Deshalb im folgenden ein kurzes Beispiel unter Verwendung der Map bankAccountMap. static void selectFromMap(Args _args) { bankAccountMap bankAccountMap; custBankAccount custBankAccount; vendBankAccount vendBankAccount; ; while select bankAccountMap { info(bankAccountMap.AccountNum); // Does never occur } // select records from custBankAccount bankAccountMap = custBankAccount.data(); while select bankAccountMap { info(bankAccountMap.AccountNum); } // select records from vendBankAccount bankAccountMap = vendBankAccount.data(); while select bankAccountMap { info(bankAccountMap.AccountNum); } } |
Laufzeitfehler im Enterprise Portal von Axapta 3.0
01.09.2009Microsoft Dynamics AX (Axapta)
Vor kurzem lief mir im Enterprise Portal von Axapta 3.0 folgender Fehler über den Weg (gleich nach dem Login):
|
E-Mails aus Dynamics AX enthalten nur eine Datei namens winmail.dat
24.08.2009Microsoft Dynamics AX (Axapta)
Wenn ein Absender Microsoft Outlook oder Outlook-Express verwendet kommt es vor, dass der Empfänger die im Mail enthaltenen Attachements als winmail.dat erhält. Das Problem tritt dann auf wenn der Empfänger keinen Mail-Client von Microsoft verwendet, und der Absender das Mail im "Microsoft Outlook Rich Text Format" (RTF) versendet. Leider versendet auch Dynamics AX genau in diesem Format, wenn man z.B. einen Report aus AX heraus als PDF einem Empfänger schicken möchte (und selbst auf seinem PC als Mail-Client Outlook verwendet). Der einzige Workaround für dieses Problem besteht darin, den zu schickenden Report zuerst als PDF zu speichern, und anschließend manuell mit Outlook zu versenden. Der Nachteil dabei ist natürlich der etwas höhere Aufwand, der Vorteil ist daß der Text des Mails angegeben werden kann - auch AX 2009 verwendet immer noch den Fixtext axapta report - und auch eine evtl. vorhandene Standardsignatur verwendet wird. |
Display-Methode mit 2 Datenquellen
12.08.2009Microsoft Dynamics AX (Axapta)
Display-Methoden bieten eine einfache Möglichkeit, zum jeweiligen Datensatz zugehörige Daten auch aus anderen Tabellen anzuzeigen. Was aber macht man, wenn man in einem Formular mit mehreren Datenquellen eine Display-Methode einbinden muss, die auf die gerade im Formular angezeigten Werte zugreifen muss? Hierfür kann man sich der Methoden joinParent() bzw. joinChild() eines Datensatzes bedienen. |
|
|
|
|
|
|
Im vor kurzem erschienenen Hotfix Rollup 3 für AX 2009 wurde u.a. der, in diesem Artikel beschriebene, Fehler der Funktion str2con korrigiert.
Wer sich nicht gleich die Mühe machen möchte, nur aufgrund dieses Fehlers das gesamte HR einzuspielen, der kann auch nur die Methode in der Klasse Global anpassen: Einfach den Aufruf str2int durch str2int64 ersetzen.