Dynamics AX Blog - Posts from 2014 - Page 6
Loop through values of a Base enumSysDictEnum SysDictEnum = new SysDictEnum(enumNum(SalesStatus)); int i; for (i=0;i<SysDictEnum.values();i++) { info(SysDictEnum.index2Label(i)); } |
SQL-Error occurs when opening or synchronizing a tableIf the follwoing error occurs, when opening or synchronizing a - mostly new created - table
the reason could be, that the table contains a field, whose name is a "reserved word" from the database, For example, you cannot use Primary as field Name. |
Access external database using ODBCFind below some code-examples, how to Access external databases from Dynamics AX. The examples are based on the following entry in MSDN: Read access (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: Synchronization errors are displayed, although these have already been solvedI recently had the problem that when i synchronize the database in the form database Synchronize database errors and/or warnings have been issued, in which i was sure that these have already been resolved. A simple solution to this behaviour is to delete the contents of the table SqlSyncInfo. The table can be found in the AOT under System Documentation > Tables > SqlSyncInfo. Incidentally, there is also the form SysSqlSync, which can be opened at any time and there you can view the result of the last synchronization. |
How to open a (simple) report in a specific languageUsing the report CustTransList (Accounts receiveable > Reports > Transactions > Customer > Transaction) i would like to demonstrate, how it is possible to call a report in a other language, the the client is currently running in. There are no classes available for this report, so i have to cretae my own one: 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(); } Using this class now it is possible, to run the report in every language (which should be provided using the parmLanguageId()-method. |
AX 2012: Show financial dimension using display methodFollowing display-method (created in the datasource of the form custtable) shows the financial dimension Costcenter. 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 ''; } Simpler version (see comments) public display DimensionValue showCostCenter(CustTable _custTable) { #define.CostCenterDimensionName("CostCenter"); return ((select firstOnly DisplayValue from DefaultDimensionView where DefaultDimensionView.Name == #CostCenterDimensionName && DefaultDimensionView.DefaultDimension == _custTable.DefaultDimension).DisplayValue); } |
|
|
|
|
|
|
Find below a short example, how to add object nodes to a shared project through code.
{
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);
}
The so modified Project will look like this: