Walk through all tables and fields

Job to walk through all tables and fields and check where specific EDTs are used:
using Microsoft.Dynamics.AX.Metadata.MetaModel;
class VKTest
{
    Map     edtMap;
    List    edtList;
    str     edtListText;
    str     fieldListText;

    public static void main(Args _args)
    {

        VKTest vkTest = new VKTest();

        vkTest.buildEDTList();

        vkTest.tableList2();

        vkTest.outputResults();


        Info('Done');
    }

    public void outputResults()
    {
        Info(edtListText);
        Info(fieldListText);
    }

    public void buildEDTList()
    {
        DictType    dictType = new DictType(extendedTypeNum(WeightBase));

        edtList = dictType.extendedBy(true);

        //Info(strFmt("EDT count: %1", edtList.elements()));

        edtMap = new Map(Types::Integer, Types::Integer);
        ListEnumerator le = edtList.getEnumerator();

        while (le.movenext())
        {
            edtListText += extendedTypeId2name(le.current()) + "\n";
            edtMap.insert(le.current(), 1);
            //Info(strFmt("%1", le.current()));
        }
    }

    // walk through all tables and fields, using TreeNode
    public void tableList1()
    {
        TreeNode    treeNode;
        xInfo       xInfo = new xInfo();
        #AOT
        treeNode = xInfo.findNode(#TablesPath);
        treeNode = treeNode.AOTfirstChild();

        /*
        // To directly iterate through table fields
        TableName tableName = tableStr(SalesLine);
        treeNode = xInfo.findNode(#TablesPath + "\\" + tableName);
        treeNode = treeNode.AOTfindChild('Fields');
        treeNode = treeNode.AOTfirstChild();
        */

        while (treeNode)
        {
            info(treeNode.treeNodeName());
            DictTable table = new DictTable(tableName2Id(treeNode.treeNodeName()));
            
            DictField   field;
            FieldId     fieldId = table.fieldNext(0);

            while(fieldId)
            {
                field = table.fieldObject(fieldId);
                if(field.isSql() && !field.isSystem())
                {
                    /*
                    field.tableid();
                    field.id();
                    field.name();
                    field.label();
                    field.help();
                    */
                    //Info(strFmt("%1.%2: %3", table.name(), field.name(), extendedTypeId2name(field.typeId())));
                }
                fieldId = table.fieldNext(fieldId);
            }



            treeNode = treeNode.AOTnextSibling();
            break;
        }

    }

    // walk through all tables and fields, using Dictionary
    public void tableList2()
    {
        Dictionary  dict = new Dictionary();
        TableId     tableId;

        tableId = dict.tableNext(0);


        while (tableId)
        {
            if(dict.tableSql(TableId))
            {
                DictTable   table = dict.tableObject(tableId);
                DictField   field;
                FieldId     fieldId = table.fieldNext(0);

                while(fieldId)
                {
                    field = table.fieldObject(fieldId);
                    if(field.isSql() && !field.isSystem())
                    {
                        /*
                        field.tableid();
                        field.id();
                        field.name();
                        field.label();
                        field.help();
                        */
                        // Info(strFmt("%1.%2: %3", table.name(), field.name(), extendedTypeId2name(field.typeId())));
                        if (Types::Real == field.baseType())
                        {
                            this.checkField2(table, field);
                            //break;
                        }
                    }
                    fieldId = table.fieldNext(fieldId);
                }
            }

            tableId = dict.tableNext(TableId);
            //break;
        }

    }

    // walk through all tables and fields, using MetadataSupport
    public void tableList3()
    {
        TableId tableId;
        var tables      = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetAllTables();
        var tableEnum   = tables.GetEnumerator();

        while(tableEnum.MoveNext())
        {
            /*
            using Microsoft.Dynamics.AX.Metadata.MetaModel;
            or full name 
            Microsoft.Dynamics.AX.Metadata.MetaModel.AxTable
            */
            AxTable table = tableEnum.Current;
            tableId = tableName2Id(table.Name);
            /*
            table.Name;
            table.Label;
            table.SaveDataPerCompany
            */
            var fieldEnum = table.Fields.GetEnumerator();

            while(fieldEnum.MoveNext())
            {
                AxTableField field = fieldEnum.Current;
                int fieldId = fieldName2Id(tableId, field.name);

                /*
                field.Name;
                field.Label;
                field.HelpText;
                field.AssetClassification;
                */

                Info(strFmt("%1.%2: %3", table.Name, field.Name, field.ExtendedDataType));
            }

            break;
        }

    }

    public void checkField2(DictTable _table, DictField _field)
    {
        int typeId = _field.typeId();

        if (edtMap.exists(typeId))
        {
            str line = strFmt("%1(%2).%3(%4): %3", _table.name(), _table.label(), _field.name(), _field.label(), extendedTypeId2name(typeId));
            fieldListText += line + "\n";
        }
    }

}
For example, check which fields will be affected when changing decimal point precision: https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/extensibility/decimal-point-precision

 

Search

About

DaxOnline.org is free platform that allows you to quickly store and reuse snippets, notes, articles related to Dynamics AX.

Authors are allowed to set their own AdSense units and "buy me a coffee" link.
Join us.

Blog Tags