Sunday, January 15, 2017

AX 2012 – TFS Build Error: The AXUtil command was started in the mode: export. Working against model store SQLServerName /ModelDatabaseName. ERROR: The file exists

Hi Guys

I am using the CodeCrib Library in order to handle my TFS Build Process.

During the last run, I faced the follow error:

Exception Message: Error exporting model: AXUtil 6.3 - Microsoft Dynamics AX Admin Utility (6.3.3000.2948) (c) Copyright, Microsoft Corporation, 2011. All rights reserved. The AXUtil command was started in the mode: export. Working against model store XXXXXX/XXXXXXX_model. ERROR: The file exists. (type Exception) Exception Stack Trace: at CodeCrib.AX.Manage.ModelStore.ExportModelShell(String modelName, String modelPublisher, String modelFile, String strongNameKeyFile) in c:\Users\xxxxxxxx\Documents\Visual Studio 2013\Projects\MainAxTFSLib\CodeCrib.AX.Manage\CodeCrib.AX.Manage\ModelStore.cs:line 144 at CodeCrib.AX.Manage.ModelStore.ExportModel(String modelName, String modelPublisher, String modelFile, String strongNameKeyFile) in c:\Users\ xxxxxxxx\Documents\Visual Studio 2013\Projects\MainAxTFSLib\CodeCrib.AX.Manage\CodeCrib.AX.Manage\ModelStore.cs:line 84 at CodeCrib.AX.TFS.ExportModel.Execute(CodeActivityContext context) in c:\Users\ xxxxxxxx\Documents\Visual Studio 2013\Projects\MainAxTFSLib\CodeCrib.AX.TFS\CodeCrib.AX.TFS\ModelStore.cs:line 96 at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager) at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)
An error occurred while copying diagnostic activity logs to the drop location. Details: The file exists.

Resolution: You have to clean the TEMP folder related to the Agent User that will run the Build Process. 
Something like C:\Users\xxxxxxx\AppData\Local\Temp. After many TFS Build run, this folder contains a lot of files and an certain point the process try to create a file that already exist.

If possible, create a batch process that clean this folder at regular basis.

That is it!

Sunday, January 1, 2017

AX 2012 - TFS Build Failed, Timeout during XPO Import

Hi Guys

Let me say, start the New Year with a post is a good start. What do you say?

Back to us, if the TFS Build fail, the causes could be many.

However, from my experience if fails with a Timeout during the XPO Import (you can achieve this through the Build Txt log), the reasons can be two:


1-    Someone delete an AOT object without commit the operation on TFS. Afterward someone else create a new AOT object and add it to TFS. This one could have the same GUID of the deleted object.

2-    Someone rename an AOT object but on TFS (through TFS Solution Explorer), the object have the new name but inside the XPO is present the old name (In my opinion this is a Microsoft bug)!!!

In both case the TFS Build fails.

In order to understand which object create the issue you have to:


1-    Restore the AX Baseline Database (the DBs without any AX Customizations) on your TFS Build AX Environment
2-    Run the XPO Import process manually and verify the error
3-    Fix the error on Dynamics AX or TFS as mentioned above
4-    Rerun the TFS Build Process

Happy New Year!

Saturday, December 31, 2016

AX 2012 - One or more conflicting model elements already exists in an installed model. How to know the conflict element.

Hi All

How many times during a model installation you faced the error "One or more conflicting model elements already exists in an installed model."?

In order to install the Models usually I prefer use the Powershell command, like Install-AXModel with "-verbose" option just to see more details in case an error.

Unfortunately the "-verbose" option do not help us to find the element in conflict.

Instead, using "-verbose" option together with AxUtil resolve our issues. In this case is showed the element name that generate the conflict.



Enjoy!

Tuesday, December 27, 2016

AX 2012 – How to move DMF Setup across Enviroments

Hi Guys

Often is necessary to move the DMF Setup, without include the DMF Staging tables, from one environment to another.

How to do it?

Out of the box there isn’t any standard feature that allow you to achieve this goal.
The steps are:

1-      Retrieve a list of the DMF Setup Tables
2-      Move to another environment without broken the relation by Recid

About the first step I have created a job in order to list the DMF Setup tables.
The trick is been exclude the tables that present the EXECUTIONID field, so the staging table!

static void DMFSetupTables(Args _args)
{
    utilIdElements  utilIdElements;
    DictTable       dictTable;
    SqlDictionary   SqlDictionary;
    Map             mapTable;

    mapTable = new Map(Types::Integer, Types::Integer);

    while select utilIdElements
    where utilIdElements.recordType == UtilElementType::Table
       && utilIdElements.name like "DMF*"
    {
        dictTable = new DictTable(utilIdElements.id);
        if ( dictTable.isView()
        ||   dictTable.isTempDb()
        ||   dictTable.isTmp()
        ||   dictTable.isMap()
        ||   mapTable.exists(utilIdElements.id)
           )
            continue;
       
        Select recid from SqlDictionary where SqlDictionary.tabId == utilIdElements.id && SqlDictionary.name == "EXECUTIONID";
        If ( SqlDictionary )
            continue;

        mapTable.insert(utilIdElements.id, utilIdElements.id);
        info ( queryValue(utilIdElements.id) + "-" + utilIdElements.name );
    }
}

About the second step, I used the Test Data Transfer Tool in order to export and import the DMF Setup tables.

Therefore, I created a txt file like below with the Tables list coming from the above Job and move in the ‘[Lists]’ Folder of the TDTT Package and run the Tool.

.*(?<!^DMFCodePageValue)(?<!^DMFComparison)(?<!^DMFComparisonEntityList)(?<!^DMFComparisonLegalEntityList)(?<!^DMFComparisonReport)(?<!^DMFComparisonResults)(?<!^DMFComparisonResultsDetails)(?<!^DMFConstraintTreeLines)(?<!^DMFDataSource)(?<!^DMFDataSourceProperties)(?<!^DMFDataTypeMapping)(?<!^DMFDefinationGroupAccess)(?<!^DMFDefinitionGroup)(?<!^DMFDefinitionGroupDataArea)(?<!^DMFDefinitionGroupEntity)(?<!^DMFDefinitionGroupEntityXMLFields)(?<!^DMFEntity)(?<!^DMFEntityBaseXML)(?<!^DMFEntityDbEntityVersion)(?<!^DMFEntityDbGroup)(?<!^DMFEntityDbGroupEntity)(?<!^DMFExcelSheetLookup)(?<!^DMFExtDBSyncGroupExecution)(?<!^DMFParameters)(?<!^DMFPublishedEntity)(?<!^DMFQueryCriteria)(?<!^DMFSourceXMLToEntityMap)(?<!^DMFStagingConversionTable)(?<!^DMFStagingErrorCode)(?<!^DMFStagingTargetLink)(?<!^DMFtargetCompanyName)(?<!^DMFTargetEntityHierarchy)(?<!^DMFTargetEntityHierarchyRelation)(?<!^DMFTargetSourceName)(?<!^DMFTargetXML)(?<!^DMFTargetXMLToEntityMap)

That’s it!

Happy Christmas!

Sunday, December 11, 2016

AX 2012 - Create AX Users from a CSV file through Powershell

Hi Guys

If you want to add the AX users starting from a CSV file, here the Powershell script.
In the CSV there is the column Master where you can specify the Master user from which they are copied the security and attributes.

Is a good start and you can extend as preferred.

https://ax2012createusers.codeplex.com/

Cheers!

Tuesday, November 22, 2016

AX 2012 - How to Add Linked Datasource using parent Datasource fields

Hi Guys

Can happen to add Datasource to a query using fields related to other parent Datasource.

In order to achieve this goal, the trick is use the third parameter of the AddLink Kernel Method of the QueryBuildDataSource class, like this:

qbdsXX = SysQuery::FindOrCreateDataSource(DataSource_ds.query(), tableNum(TableChild), tableNum(TableParent) );
qbdsXX.relations(false);
qbdsXX.joinMode(JoinMode::InnerJoin);
qbdsXX.fetchMode(QueryFetchMode::One2Many);
qbdsXX.addLink(fieldNum(TableParent, FieldA), fieldNum(TableChild, FieldA));
qbdsXX.addLink(fieldNum(TableParent, FieldB), fieldNum(TableChild, FieldB));
qbdsXX.addLink(fieldNum(TableParentParent, FieldC), fieldNum(TableChild, FieldC), DataSourceParent );


Stay tuned!

Sunday, October 2, 2016

Tree Control issue during adding Child node

Hi guys

A colleague reach me because a Form with a Tree control did not work as expected.

The Child node added at runtime do not appear on the Tree, also after the Expand method.

The trick is use the SysFormTreeControl Class, expandTree method.

More exactly, at the end of the init of the Form are been called the following methods:

SysFormTreeControl::expandTree(tree, tree.getRoot());
SysFormTreeControl::collapseTree(tree, tree.getRoot());

Finally, after every new child added at runtime, is been raised only the expandTree method.

Stay Tuned!