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

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: Ausführen einer statischen Klassen-Methode in der CIL
15.03.2014Microsoft Dynamics AX (Axapta)
|
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. |
Zugriff auf externe Datenbank via ODBCIm folgenden ein paar Code-Beispiele wie man aus Dynamics AX heraus auf externe Datenbanken lesend und schreibend zugreifen kann. Die Beispiele basieren auf folgendem MSDN-Beitrag: Lesender Zugriff (SELECT)// X++, Main method in a class. static public void Main(Args _args) { LoginProperty loginProperty; OdbcConnection odbcConnection; Statement statement; ResultSet resultSet; str sql, criteria; SqlStatementExecutePermission perm; ; // Set the information on the ODBC. loginProperty = new LoginProperty(); loginProperty.setDSN("ExternalDB_32bit"); loginProperty.setDatabase("ExternalDatabaseName"); //Create a connection to external database. odbcConnection = new OdbcConnection(loginProperty); if (odbcConnection) { sql = "SELECT * FROM items;"; //Assert permission for executing the sql string. perm = new SqlStatementExecutePermission(sql); perm.assert(); //Prepare the sql statement. statement = odbcConnection.createStatement(); resultSet = statement.executeQuery(sql); //Cause the sql statement to run, //then loop through each row in the result. while (resultSet.next()) { //It is not possible to get field 3 and then 1. //Always get fields in numerical order, such as 1 then 2 the 3 etc. print strFmt("%1 - %2", strRTrim(resultSet.getString(1)), strRTrim(resultSet.getString(2))); } //Close the connection. resultSet.close(); statement.close(); } else { error("Failed to log on to the database through ODBC."); } } |
AX 2012: Synchronisationsfehler werden angezeigt, obwohl diese bereits gelöst wurdenVor kurzem hatte ich das Problem, daß beim Synchronisieren der Datenbank im Formular Datenbank synchronisieren Fehler und/oder Warnungen ausgegeben wurden, bei denen ich mir sicher war, daß diese bereits behoben wurden. Eine einfache Lösung dafür ist den Inhalt der Tabelle SqlSyncInfo zu löschen. Die Tabelle selbst findet man im AOT unter System Documentation > Tables > SqlSyncInfo. Übrigens gibt es im AOT auch das Formular SysSqlSync, welches man jederzeit öffnen kann und sich dort das Ergebnis der jeweils letzten Synchronisierung ansehen kann. |
Einen (einfachen) SSRS-Bericht in einer bestimmten Sprache aufrufenAm Beispiel des Berichtes CustTransList (Debitorenkonten > Berichte > Buchungen > Debitor > Buchungen) möchte ich zeigen, wie es möglich ist einen Bericht in einer beliebigen Sprache aufzurufen. Für diesen Bericht gibt es keinerlei Klassen in AX, also habe ich mir folgende Klasse selbst erstellt: class CustTransListController extends SrsReportRunController { }
public static str getReportName(Args _args) { str reportName = ssrsReportStr(CustTransList, Report); return reportName; }
public static void main(Args _args) { CustTransListController controller = new CustTransListController(); controller.parmReportName(CustTransListController::getReportName(_args)); controller.parmArgs(_args); controller.parmReportContract().parmRdlContract().parmLanguageId('en-us'); controller.startOperation(); } Mit dieser Klasse kann der Bericht nun in englischer Sprache aufgerufen werden (bzw. in jener Sprache, die man der Methode parmLanguageId() übergibt). |
AX 2012: Finanzdimension als Display-Methode anzeigenFolgende Display-Methode in der Datasource einer Form zeigt beispielsweise die Finanzdimension Costcenter eines Debitoren an. public display DimensionValue showCostCenter(CustTable _custTable) { DimensionAttributeValueSet dimensionAttributeValueSet; DimensionAttributeValueSetItem dimensionAttributeValueSetItem; DimensionAttributeValue dimensionAttributeValue; DimensionAttribute dimensionAttribute; #define.CostCenterDimensionName("CostCenter"); if( !_custTable || !_custTable.DefaultDimension) { return ''; } dimensionAttributeValueSet = DimensionAttributeValueSet::find(_custTable.DefaultDimension); select firstOnly RecId from dimensionAttributeValueSetItem where dimensionAttributeValueSetItem.DimensionAttributeValueSet == dimensionAttributeValueSet.RecId join DimensionAttributeValue where DimensionAttributeValue.RecId == dimensionAttributeValueSetItem.DimensionAttributeValue join RecId from dimensionAttribute where dimensionAttribute.RecId == DimensionAttributeValue.DimensionAttribute && dimensionAttribute.Name == #CostCenterDimensionName if(dimensionAttributeValue && dimensionAttribute) { return dimensionAttributeValue.getValue(); } return ''; } Einfachere Variante (siehe Kommentare) public display DimensionValue showCostCenter(CustTable _custTable) { #define.CostCenterDimensionName("CostCenter"); return ((select firstOnly DisplayValue from DefaultDimensionView where DefaultDimensionView.Name == #CostCenterDimensionName && DefaultDimensionView.DefaultDimension == _custTable.DefaultDimension).DisplayValue); } |
|
|
|
|
|
|
Mit Hilfe der nachstehenden Klasse möchte ich zeigen, wie man in Dynamic AX 2012 X++ Code als CIL ausführt.
Die Klasse MyDemoClass enthält eine statische Methode countSalesRecords() welche die eigentliche Logik enthält.
Eine weitere Methode namens countSalesRecordsWrapper() ruft diese statische Methode über eine weitere Methode countSalesRecordsIL() als CIL auf.
Zu beachten sind vor allem die Modifier der jeweiligen Methoden sowie das Parameter-Profil der Methode countSalesRecordsIL() (ein- und ausgehender Container). Hätte die Methode keinen eingehenden Container als Parameter, würde AX behaupten, die Methode nicht zu kennen:
Nachdem man die Klasse erstellt und die CIL inkrementell kompiliert hat, kann man die Klasse per rechter Maustaste ausführen. Dadurch wird die main()-Methode aufgerufen welche die Logik der Methode countSalesRecords() auf die altbewährte Art & Weise aufruft und zusätzlich in der CLR ausführt.
Vorausgesetzt natürlich der Benutzer hat in seinen Benutzer-Optionen die Option Geschäftliche Arbeitsgänge in CIL ausführen aktiviert!