X++

DynamicsMinds 2023 conference speaker

I am happy to announce that I have been selected as a DynamicsMinds 2023 conference speaker. It is going to be one of the biggest events for Business Applications in Europe, with dozens of Microsoft product teams and MVPs and some of the best experts in the industry.

DynamicsMinds is going to be held in the lovely city of Portoroz, Slovenia between 22-24th of May, 2023. The main areas to cover are Finance & Operations, Business Central, Customer Engagement and Power Platform.

As usual my session is going to be a bit more on the technical side. Titled “Advanced D365FO Developer tooling and Technologies for XppGroupies”, you can guess that I would like to cover the history of, and the possible future of X++ development.

DynamicsMinds 2023 - Advanced D365FO developer tooling and technologies for XppGroupies - Vilmos Kintera

Looking forward to meet new people and to see all my friends, fellow professionals, partners and customers. See you at DynamicsMinds!

Active record count in ValidTimeState tables

In the previous blog post we have explored how to tell how many records do we have per company account using a T-SQL Query. But AX does have a concept which SQL cannot cope with, and makes it a bit harder to tell the active record count in ValidTimeState tables.

The following job can pull back this value for us, in order to validate if data migration row counts are matching between AX 2012 and D365FO.

static void WIK_findValidTimeStateKey_Tables(Args _args)
{
    DictTable           dictTable;
    Dictionary          dict = new Dictionary();
    TableId             tableId;
    Common              common;
    date                currentDate = systemDateGet();
 
    setPrefix('Record count for ValidTimeStateKey tables');
    tableId = dict.tableNext(0);
 
    while (tableId)
    {
        dictTable = new DictTable(tableId);
        if (!dictTable.isTmp() && !dictTable.isTempDb() && !dictTable.isView()
            && (dictTable.configurationKeyId() ? isConfigurationKeyEnabled(dictTable.configurationKeyId()) : true)
            && dictTable.isValidTimeStateTable())
        {
            common = dictTable.makeRecord();
            select validTimeState(currentDate) count(RecId) from common;
 
            if (common.RecId)
            {
                info(strFmt('%1\t%2', dictTable.name(), common.RecId));
            }
        }
 
        tableId = dict.tableNext(tableId);
    }
}