Dynamics AX Blog - Dynamics AX 4.0 - 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 KategorieRSS-Feed dieser Version
Statt Parameter-Listen einen DataContract verwenden
14.07.2015Microsoft Dynamics AX (Axapta)
Wer schon einmal die Parameter einer Methode erweitern musste, kennt vielleicht das Problem: Wenn man Glück hat kann man seinen neuen Parameter am Ende einfügen und mit einem Default-Wert vorbelegen. classDeclaration MyDataContract
{ ItemId itemId; Qty qty; }
Public ItemId parmItemId(ItemId _itemId = itemId)
{ itemId = _itemId; return itemId; }
Public Qty parmQty(Qty _qty = qty)
{ qty = _qty; return qty; }
Public void myMethod(MyDataContract _dataContract)
{ // … do something… info(_dataContract.parmItemId()); }
MyDataContract dataContract;
dataContract = new MyDataContract(); dataContract.parmItemId("A1000"); dataContract.parmQty(123); Object.myMethod(dataContract);
|
Eine bestimmte Dimension als Dialogfeld einbindenWenn man in Dynamics AX 2009 (oder früheren Versionen) eine bestimmte Dimension als Dialogfeld verwenden möchte, kann man sich einen eigenen Extended Datatype (abgeleitet von Criterias) wie im folgenden beschrieben anlegen. Entscheidend sind dabei die Relations dieses EDTs. Der Beispiel-Code ist einer von RunBase abgeleitenden Klasse entnommen. protected Object dialog(DialogRunbase dialog, boolean forceOnClient) { Object ret; ret = super(dialog, forceOnClient); df_project = ret.addField(TypeId(DimensionCostCenter)); return ret; } Der so angepasste Dialog sollte wie folgt aussehen: |
Ursache von Fehlermeldungen ermitteln
09.06.2014Microsoft Dynamics AX (Axapta)
In Dynamics AX können unterschiedliche (Fehler-)Meldungen auftreten, die meisten kommen von der Applikation, es gibt aber auch Meldungen, die vom AX-Client ausgegeben werden. Leider sind nicht alle Meldungen so sprechend, daß man (als Entwickler) sofort weiß, was nun zu tun ist. Deshalb gibt es, je nachdem um welche Art von Fehlermeldung es sich handelt, unterschiedliche Herangehensweisen, wie man die Ursache der Meldung findet. Meldung über das Infolog der ApplikationBei manchen Meldungen genügt ein Doppelklick auf die Meldung im Infolog und man landet im Code, welcher die Meldung geworfen hat (vorausgesetzt man befindet sich als Benutzer gerade im Entwicklungsmodus). |
Objekte per Code zu einem Projekt hinzufügenNachstehend ein kurzer Job, mit dessen Hilfe man AOT-Elemente zu einem bestehenden Shared Project hinzufügen kann. static void AddNodeToSharedProject(Args _args)
{ projectNode projectNode; TreeNode treeNode; #AOT #AOTExport projectNode = infolog.projectRootNode(); projectNode = projectNode.AOTfindChild(#expProjectShared); projectNode = projectNode.AOTfindChild('MyProject'); // Add objects treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(CustGroup))); projectNode.addNode(treenode); treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(VendGroup))); projectNode.addNode(treenode); treenode = TreeNode::findNode(#ClassesPath+'\\'+classStr(PriceDisc)); projectNode.addNode(treenode); } Das geänderte Projekt sieht beispielsweise wie folgt aus: |
Werte eines Base-Enums durchlaufenSysDictEnum SysDictEnum = new SysDictEnum(enumNum(SalesStatus)); int i; for (i=0;i<SysDictEnum.values();i++) { info(SysDictEnum.index2Label(i)); } |
Makro innerhalb eines SELECT-Statements verwendenDas Beispiel listet beispielsweise nur aktive Stücklistenpositionen (Tabelle BOM) auf (aktiv über die Felder FromDate und ToDate). Lässt man den zweiten Parameter des Makros leer (dateNull()), so werden alle Stücklistenpositionen gelistet. static void useMacroInSelectStatement(Args _args) { bom bom; date emptyDate; // parameters: %1 = table instance, %2 date, %3 empty date value #localmacro.bomDateFilter && ( %2 == dateNull() || ( ((%1.FromDate <= %2) && (%1.ToDate >= %2)) || ((%1.FromDate == %3) && (%1.ToDate == %3)) || ((%1.FromDate <= %2) && (%1.ToDate == %3)) || ((%1.FromDate == %3) && (%1.ToDate >= %2)) )) #endMacro ; while select bom where bom.ItemId == '123' #bomDateFilter(bom, systemDateGet(), emptyDate) { info(bom.bomid); } } |
|
|
|
|
|
|
Um sich alle (Shared-)Projekte ausgeben zu lassen, die einen bestimmten Text im Namen tragen, kann man den folgenden Code verwenden.