Wednesday, September 24, 2014

How to find in AOT all objects named like...

In fact the standard Find tool in AOT works well if you really know how to fill in all these parameters before launch it. Sometimes it is easier to use another options.

Let's say we need to find all the forms that contain 'lookup' word in the end of their names. Easy? Yes, it is! You can go directly to the SysModelElement table and work with it as with any other table: Ctrl-G to switch grid filter, 11 for Form element type, then *lookup in the name, and that's it.



This is rapid way to know the objects names but it is not possible to jump to them in AOT. Here we go with the second option. Just create a new project and filter criteria Element type name and Name for the objects. 


Simple, fast and will keep the search results for future recalls.



Happy searching in AOT!

Saturday, September 13, 2014

How to add a new relation on a table from code

If you got into troubles, like me, trying to add a new relation on a table from X++, this code will save your day. The main point here is the code 251. Read my lips: two-five-one. Because reflections work on everything when you know the code.



private void createTableRelationInAOT(TreeNode _treeNodeTableRelation, TableName _relatedTableName, FieldName _relatedFieldName)
{
#Properties    
    TreeNode            treeNodeRelations;
    TreeNode            tableRelation;
    ReferenceNode       tableRelationFields;

    if(treeNodeTableRelation && _relatedTableName && _relatedFieldName)
    {
        treeNodeRelations = _treeNodeTableRelation.AOTfindChild(#PropertyRelations);
        tableRelation = treeNodeRelations.AOTadd(relatedTableName);
        tableRelation.AOTsetProperty('Table', relatedTableName);
        //can anyone tell me how I could guess this secret code??
        tableRelationFields = tableRelation.AOTaddSubNode(251); 
        //never change the order of two these properties! it works only like follows
        tableRelationFields.AOTsetProperty(#PropertySecField, relatedFieldName);
        tableRelationFields.AOTsetProperty(#PropertyRelatedField, relatedFieldName);
    }
    _treeNodeTableRelation.AOTsave();

}


Happy deciphering!

Sasha Nazarov added:

 "251" corresponds to #NT_DBNORMALREFERENCEFIELD

in TreeNodeSysNodeType macro:
#define.NT_DBREFERENCE( 250)
#define.NT_DBNORMALREFERENCEFIELD( 251)
#define.NT_DBTHISFIXEDREFERENCEFIELD( 252) #define.NT_DBEXTERNFIXEDREFERENCEFIELD( 253)

Thursday, September 11, 2014

Problem with importing a temporary table/class/etc

I bumped into a strange problem. The admin refreshed my development environment from the TEST one; consequently, all my objects were deleted.

When I started re-importing them from an exported xpo-project, a temporary table always caused the following error:

A table, Extended Data Type, Base Enum or class called XXXXX already exists. Import of Table aborted.


The problem can be easily resolved by flushing the user cache:
Stop AX client and delete all  ax_*.auc files in "C:\Users\%USERNAME%\AppData\Local folder"