Dynamics AX Blog - Dynamics AX 2009 - Microsoft Dynamics AX (Axapta) - Seite 5

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 Kategorie
RSS-Feed dieser Version
Formular per Code öffnenNachstehend ein paar Beispiele, wie man ein Formular per Code aufrufen kann. Wobei jede Variante ihr Vor- oder Nachteile bietet. Beispielsweise gibt es Varianten, wo man einen Datensatz übergeben kann, der angezeigt werden soll. Andere wieder bieten die Möglichkeit ganze Queries zu übergeben oder aber festzulegen, ob man im Grid oder im Detail-View öffnen möchte. Es sollte also für ziemlich jeden Anwendungsfall etwas dabei sein ;-) static void openFormThroughCode_0(Args _args)
{ menuFunction menuFunction; args args; CustTable custTable = CustTable::find('1101'); args = new args(); args.record(CustTable); args.formViewOption(FormViewOption::Grid); menuFunction::runClient(identifierStr(custTable), MenuItemType::Display, false, args); }
static void openFormThroughCode_I(Args _args)
{ FormRun formRun; args args = new args(); args.name(formstr(CustTable)); args.formViewOption(FormViewOption::Grid); formRun = classFactory.formRunClass(args); formRun.run(); formRun.wait(); } |
Labels mit Zeilenumbrüchen korrekt ausgebenManche Labels enthalten Zeilenumbrüche (\n). Möchte man ein solches Label über das Infolog ausgeben, sollte man die Funktion strFmtLB wie folgt verwenden: // Wrong info(strFmt("@SYS322576", "AccountsPayableServices", "Allgemeiner Fehler")); // Correct info(strFmtLB(strFmt("@SYS322576", "AccountsPayableServices", "Allgemeiner Fehler"))); |
Word-Dokument per Code erstellen
19.02.2013Microsoft Dynamics AX (Axapta)
static void CreateWordFile(Args _args) { COM wordApplication; COM wordDocuments; COM wordDocument; COM wordSelection; Filename fileName = @"c:\temp\HelloWorld.doc"; int i; try { wordApplication = new COM("word.application"); wordApplication.visible(false); wordDocuments = wordApplication.Documents(); wordDocument = wordDocuments.add(); wordDocument.saveas(fileName); wordDocument.activate(); for (i=1; i<=5; i++) { wordSelection = wordApplication.selection(); wordSelection.TypeText(int2str(i) + " Hello World!"); wordSelection.TypeParagraph(); } wordDocument.save(); wordDocument.close(); wordApplication.quit(); info(strFmt("Datei %1 wurde erstellt.", fileName)); } catch { if(wordDocument) { wordDocument.close(); wordApplication.quit(); } error("Fehler"); } } |
hasField()-MethodeIch hatte schon des öfteren die Situation, daß ich wissen wollte ob ein Datensatz ein bestimmtes Feld enthält um den jeweiligen Wert verarbeiten zu können. Beispielsweise innerhalb eine Methode, welche die aufrufenden args() verarbeitet. Beispielsweise stellt die Klasse SysDictTable die Methode hasMethod() zur Verfügung, eine hasField()-Methode aber habe ich bislang nicht gefunden. Deshalb habe ich mir folgende Logik überlegt: Common callingRecord; itemId itemId; SysDictField itemDictField; itemDictField = SysDictField::findFieldByName(tableId2name(callingRecord.TableId), identifierStr(itemId)); if(itemDictField) { itemId = callingRecord.(itemDictField.id()); } Wenn jemand eine elegantere Möglichkeit kennt, nur her damit! |
Erweitern von Dynamics AX um neue Icons
26.08.2012Microsoft Dynamics AX (Axapta)
Es ist allerdings nicht möglich, diese Embedded Ressources um eigene Icons/Bilder zu erweitern. |
Voucher/Beleg in Dynamics AX 2009 prüfenVor kurzem musste ich in Dynamics AX 2009 eine Belegnummer (Voucher) per Code auf evtl. vorhandene Duplikate prüfen. Die folgende Methode ist dafür sehr hilfreich: ledgerParameters::checkDuplicate(_voucher, _date); |
|
|
|
|
|
|
{
COM wordApplication;
COM wordDocuments;
COM wordDocument;
COM wordRange;
COM wordSelection;
COM wordStyles;
#define.Heading1(-2)
#define.Heading2(-3)
#define.Heading3(-4)
#define.Heading4(-5)
#define.Heading5(-6)
void insertHeader(str _str, int _level)
{
COM wordStyle;
wordSelection = wordApplication.selection();
switch( _level )
{
case 1:
wordStyle = wordStyles.item(#Heading1);
break;
case 2:
wordStyle = wordStyles.item(#Heading2);
break;
case 3:
wordStyle = wordStyles.item(#Heading3);
break;
case 4:
wordStyle = wordStyles.item(#Heading4);
break;
case 5:
wordStyle = wordStyles.item(#Heading5);
break;
default:
wordStyle = wordStyles.item(#Heading3);
}
wordSelection.style(wordStyle);
wordSelection.TypeText(_str);
wordSelection.TypeParagraph();
}
wordApplication = new COM("word.application");
wordApplication.visible(TRUE);
wordDocuments = wordApplication.Documents();
wordDocument = wordDocuments.add();
wordDocument.saveas(@"c:\temp\LoremIpsum.doc");
wordDocument.activate();
wordStyles = wordDocument.styles();
wordRange = wordDocument.range(0,0);
// Let's go
insertHeader("Lorem ipsum", 1);
wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam");
wordSelection.TypeParagraph();
insertHeader("Lorem ipsum", 2);
wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam");
wordSelection.TypeParagraph();
wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut");
wordSelection.TypeParagraph();
// Finish
wordDocument.save();
wordDocument.close();
wordApplication.quit();
}
So sieht das Word-Dokument aus, daß mit obigem Code erstellt wurde: