Dynamics AX Blog - Dynamics AX 2009 - Beiträge von 2014

RSS-Feed dieser Version
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 Applikation
|
Beispiel für die Verwendung von RecordInsertListEin kurzes Code-Beispiel wie man unter der Verwendung von RecordInsertList Datensätze in einer Tabelle auf sehr performante Art & Weise erstellen kann. Wer RecordInsertList nicht kennt, kann hier mehr darüber erfahren. static void HowToUseRecordInsertList(Args _args) { DMOPerfTest DMOPerfTest; RecordInsertList RecordInsertList; Counter c; FromTime fromTime = timeNow(); RecordInsertList = new RecordInsertList(tableNum(DMOPerfTest)); for (c=1;c<=10000;c++) { DMOPerfTest.clear(); DMOPerfTest.AccountNum = int2str(c); if(DMOPerfTest.validateWrite()) { RecordInsertList.add(DMOPerfTest); } } RecordInsertList.insertDatabase(); info(strFmt("Total time consumed: %1", timeConsumed(fromTime, timeNow()))); } Die im Beispiel verwendete Tabelle DMOPerfTest wurde für dieses Beispiel erstellt und ist Out-of-the-box nicht Bestandteil von Dynamics AX. |
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)); } |
SQL-Fehler beim Öffnen/Synchronisieren einer TabelleTritt beim Öffnen oder Synchronisieren einer - meist neu erstellten - Tabelle der folgende Fehler auf
so kann die Ursache sein, daß die Tabelle ein Feld enthält, dessen Name ein "Reserved Word" der SQL-Datenbank ist. Beispielsweise darf ein Feld nicht Primary genannt werden. |
|
|
|
|
|
|
Vor kurzem wollte ich in der validate()-Methode einer von RunBase abgeleiteten Klasse ein Fehlermeldung einbauen, die als Teil das Label eines Dialogfeldes verwendet.
Dabei musste ich feststellen, daß dies gar nicht so einfach ist, wie ich es mir vorgestellt hätte.
Die verfügbare Methode dialogField.fieldControl().Label() funktioniert offenbar nur dann, wenn man dem Dialogfeldes explizit ein eigenes Label zugewiesen hat (und dieses nicht dynamisch über den EDT gezogen wird).
Deshalb im folgenden ein kurzer Job, der zeigt wie man das Label eines Dialogfeldes auslesen kann. Die gleiche Logik lässt sich natürlich u.a. auch in einer Klasse, die von RunBase/RunBaseBatch abgeleitet wurde, verwenden.