Dynamics AX Blog - Page 23
startUpCmd=AutorunIf you want to run specific forms or classes when Dynamics AX is started, you could use the command-line-param autorun. This parameter awaits a xml-file containing the objects, which should be launched.
The corresponding xml-file startup.xml looks like this: Additional information are available at MSDN: http://msdn.microsoft.com/en-us/library/aa870082.aspx |
Control editing form fieldsIf you want to control which of the fields on a form are editable, you can use the property allowEdit of the datasource fields. If you have large tables containing a lot of fields, this could be a time-consuming process. So, if you have a form, where the user should only be able to edit one field - in particular case a field from table salesLine -, you could use the following code-example which should be included in the init-method of the datasource. The snippet disallows editing for all fields exept for one field. public void init()
{ sqlDictionary sqlDictionary; ; super(); while select sqlDictionary where sqlDictionary.tabId == tableNum(salesLine) && sqlDictionary.fieldId != 0 { if(sqlDictionary.name != "dataareaid" && sqlDictionary.name != "recversion" && sqlDictionary.name != "recId" ) { salesline_ds.object(sqlDictionary.fieldId).allowEdit(false); } } salesline_ds.object(fieldNum(salesLine, blocked)).allowEdit(true); } Tested in AX 3.0 |
Be careful when duplicating companyThat we can duplicate a company is known. The experience of the past few weeks has taught me the following:
|
Working with the calling object of a form (Caller)The following method contains some snippets that can be used to call various functions/methods of the calling object (form). If you change element.args() to e.g. _args and pass the arguments to the method, you can use the code within a class as well.
void workWithCallingRecord()
{
common common;
object object;
formDataSource formDataSource;
formRun formRun;
inventDim inventDim;
salesTable salesTable;
int i;
;
// Call method from calling record
if( element.args() &&
element.args().record() )
{
common = element.args().record();
if(common.isFormDataSource())
{
info(tableId2Name(common.TableId));
if(formDataSourceHasMethod(common.dataSource(), identifierStr("someMethod")))
{
object = common.dataSource();
object.someMethod();
}
}
}
// Call method from calling form
if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
{
formRun = element.args().caller();
if(sysFormRun::hasMethod(formRun, identifierStr("someFormMethod")))
{
object = formRun;
object.someFormMethod();
}
}
// Get value from calling record
if( element.args() &&
element.args().record() )
{
common = element.args().record();
if(common.TableId == tableNum(salesTable))
{
info(common.(fieldNum(salesTable, salesId)));
}
}
// Get value from calling datasource (form with multiple datasources)
if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
{
formRun = element.args().caller();
for (i = 0; i <= formRun.dataSourceCount(); i++)
{
formDataSource = formRun.datasource(i);
if (formDataSource && formDataSource.table() == tablenum(inventDim)) // Search for specific table
{
inventDim = formDataSource.cursor();
break;
}
}
if(inventDim)
{
info(inventDim.InventLocationId);
}
}
// Change data in calling datasource
if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
{
formRun = element.args().caller();
for (i = 0; i <= formRun.dataSourceCount(); i++)
{
formDataSource = formRun.datasource(i);
if (formDataSource && formDataSource.table() == tablenum(salesTable)) // Search for specific table
{
salesTable = formDataSource.cursor();
break;
}
}
if(salesTable)
{
// Update data
salesTable.PurchOrderFormNum = "Some value";
salesTable.update();
}
}
// Refresh calling datasource
if( element.args() &&
element.args().record() )
{
common = element.args().record();
if(common.isFormDataSource())
{
formDataSource = common.dataSource();
formDataSource.research(true);
}
}
} |
Dynamics AX: Import Excel fileRecently I was forced to deal with how to read data from an Excel file into AX. Therefore in the following a job with a kind of basic structure, how to solve something like this in X++.
static void importFromExcel(Args _args)
{
Filename fileNameExcel = "C:\temp\file.xls";
SysExcelApplication sysExcelApplication;
SysExcelWorkbooks sysExcelWorkbooks;
SysExcelWorksheets sysExcelWorksheets;
SysExcelWorksheet sysExcelWorksheet;
SysExcelRange sysExcelRange;
SysExcelCells sysExcelCells;
SysExcelWorkbooks sysExcelWorkBooksCollection;
str column_a;
str column_b;
str column_c;
str column_d;
int i = 0;
#Excel
;
sysExcelApplication = SysExcelApplication::construct();
sysExcelWorkbooks = sysExcelApplication.workbooks();
sysExcelWorkbooks.open(fileNameExcel);
sysExcelWorksheets = sysExcelApplication.worksheets();
sysExcelWorksheet = sysExcelWorksheets.itemFromNum(1);
sysExcelRange = sysExcelWorksheet.rows();
sysExcelCells = sysExcelWorksheet.cells();
try
{
ttsbegin;
while (sysExcelCells.item(i+1, 1).value().variantType() != ComVariantType::VT_EMPTY) // In der Annahme, dass die erste Spalte nicht leer ist
{
i++;
column_a = sysExcelCells.item(i, 1).value().bStr();
column_b = sysExcelCells.item(i, 2).value().bStr();
column_c = sysExcelCells.item(i, 3).value().bStr();
column_d = sysExcelCells.item(i, 4).value().bStr();
// ... do something ...
}
ttscommit;
info("Finished");
sysExcelApplication.quit();
sysExcelApplication = null;
}
catch (Exception::Error)
{
sysExcelApplication.quit();
sysExcelApplication = null;
}
} |
Dynamics AX: Illegal property valueIf you try to change the AllowDuplicates-Property of a table index from No to Yes, the following error message may occur: Illegal property value In this case, presumably, the affected index is registered as PrimaryIndex or ClusteredIndex of the table. |
|
|
|
|
|
|
What is the difference between update() and doUpdate()? You canfind the answer on MSDN or you take a look at the following table.