Dynamics AX Blog - Microsoft Dynamics AX (Axapta) - Seite 28

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 KategorieAX 2012: Nützliche Funktionen rund um das Thema Finanzdimensionen
16.04.2013Microsoft Dynamics AX (Axapta)
Wenn man in AX beispielsweise Finanzdimensionen aus einer externen Quelle verarbeiten soll, dann können die beiden folgenden Methoden möglicherweise hilfreich sein. Die Erste Methode namens existDimension() prüft ob es die übergebene, benannte Dimension in AX überhaupt gibt und ob der übergebene Dimensionswert ebenfalls gültig ist. boolean existDimension(str 255 _dimensionName, str 255 _dimensionValue)
{ boolean isValid = false; DimensionAttribute DimensionAttribute; DimensionAttributeValue DimensionAttributeValue; DimensionAttribute = DimensionAttribute::findByName(_dimensionName); if(DimensionAttribute) { DimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute, _dimensionValue); if(DimensionAttributeValue) { isValid = true; } else { isValid = checkFailed(strFmt("'%1' für Dimension '%2' nicht gefunden.", _dimensionValue, _dimensionName)); } } else { isValid = checkFailed(strFmt("Dimension '%1' unbekannt.", _dimensionName)); } return isValid; } Beispielaufruf: existDimension("Costcenter", "3100"); Die Zweite Methode namens existDimensionCombination() prüft, ob die Kombination des übergebenen Hauptkontos und des übergebenen Dimensionswertes gültig ist. boolean existDimensionCombination(str 255 _mainAccount, str 255 _dimensionName, str 255_dimensionValue)
{ boolean isValid = false; FinancialDimensionValidationService FinancialDimensionValidationService; ledgerAccountValidationContract ledgerAccountValidationContract; ledgerAccountContract ledgerAccountContract; dimensionAttributeValueContract dimensionAttributeValueContract; FinancialDimensionValidationService = new FinancialDimensionValidationService(); ledgerAccountValidationContract = new LedgerAccountValidationContract(); ledgerAccountContract = new LedgerAccountContract(); dimensionAttributeValueContract = new DimensionAttributeValueContract(); ledgerAccountContract.parmMainAccount(_mainAccount); ledgerAccountContract.parmValues(new List(Types::Class)); dimensionAttributeValueContract.parmName(_dimensionName); dimensionAttributeValueContract.parmValue(_dimensionValue); ledgerAccountContract.parmValues().addEnd(dimensionAttributeValueContract); ledgerAccountValidationContract.parmLedgerAccount(ledgerAccountContract); isValid = FinancialDimensionValidationService.validateLedgerAccount(ledgerAccountValidationContract); if( !isValid) { error(strFmt("Ungültige Kombination: %1 - %2: %3", _mainAccount, _dimensionName, _dimensionValue)); } return isValid; } Beispielaufruf: existDimensionCombination("60000", "Costcenter", "3100"); In der realen AX-Entwickler-Welt wird eine solche Prüfung vermutlich etwas komplexer werden und wahrscheinlich auch eine Kombination beider Methoden notwendig sein. |
AX 2012: SysOperation-Framework: Ein eigenes Attribut erstellen
02.04.2013Microsoft Dynamics AX (Axapta)
Die Attribute des SysOperation-Frameworks sind über Klassen abgebildet, die von SysAttribute abgeleitet sind. Dadurch ist es relativ einfach möglich, sich eigene Attribute zu erstellen. Folgende Schritte sind dafür notwendig:
|
AX 2012: SysOperation-Framework: Häufig verwendete Attribute
24.03.2013Microsoft Dynamics AX (Axapta)
Attribute des Sysoperation-Frameworks werden in Dynamics AX 2012 über Klassen abgebildet, die von SysAttribute abgeleitet sind. Solche Klassen bestehen oft nur aus eine new()-Methode, über welche die Parameter des Attributes gesteuert werden können, sowie aus einer Accessor-Methode je Parameter. |
AX 2012: Mailversand mit Attachements
17.03.2013Microsoft Dynamics AX (Axapta)
In Dynamics AX 2012 gibt es - wie auch schon in früheren Versionen - mehrere Möglichkeiten E-Mails zu versenden. Die Verarbeitung dieser Datensätze wird unter Systemverwaltung > Periodisch > E-Mail-Verarbeitung > Stapel initiert und setzt voraus, daß die E-Mail-Parameter unter Systemverwaltung > Einstellungen > System entsprechend gepflegt sind. Weniger bekannt ist, daß es über dieses Framework auch möglich ist, Mails mit Attachements zu verschicken. Dazu muss eine weitere Tabelle namens SysOutgoingEmailData entsprechend befüllt werden. Im folgenden nun ein kurzer Job, der demonstriert, wie diese Tabellen per Code befüllt werden. |
Suche nach MenüeinträgenWer sich so wie ich schon häufig darüber geärgert hat, daß es in Dynamics AX keine Möglichkeit gibt, nach Menüeinträgen zu suchen, dem hilft vielleicht folgender Job. |
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"))); |
|
|
|
|
|
|
Nachstehend 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 ;-)
{
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);
}
{
FormRun formRun;
args args = new args();
args.name(formstr(CustTable));
args.formViewOption(FormViewOption::Grid);
formRun = classFactory.formRunClass(args);
formRun.run();
formRun.wait();
}