How to: Use enum values instead of integers in BI reports for Dynamics 365 finance and operations

For most of the BI projects related to Dynamics 365 finance and operations, We need to use BYODW to use Power BI or any other BI tools. As we know, enum fields are stored as integers in SQL, so data populated in BYODW comes as integers instead of the enum value.

To display this data either you can hardcode values in SQL statements or in BI tools. Instead, we can use SRSAnalysisEnumsEntity in Dynamics 365 F&O. It exports the data from the SRSAnalysisEnums table which holds all the enum and respective enum elements used in perspective. If the enum is missing from the list then below job can be used to insert the data in SRSAnalysisEnums table.

class SRSAnalysisEnumsGenerator
{
    public static void main(Args _args)
    {
        SRSAnalysisEnums analysisEnums;
        DictEnum currentEnum;
        str currentEnumName;
        int valueCount;
        str enumItemName;
        int enumItemValue;
        RecordInsertList records;
        Dialog dialog;
        DialogField  dfEnumName;

        dialog = new Dialog("Please enter the enum name");
        dfEnumName = dialog.addField(extendedTypeStr("Name"));
        dfEnumName.label("Enum name");
        if (dialog.run())
        {
            records = new RecordInsertList(tablenum(SRSAnalysisEnums));
         
            currentEnumName = dfEnumName.value();
            currentEnum = new DictEnum(enumName2Id(currentEnumName));
            if(currentEnum == null)
            {
                throw error(strfmt("Enum with name %1 does not exists.",currentEnumName));
            }
            valueCount = currentEnum.values();
            ttsbegin;
            delete_from analysisEnums where analysisEnums.EnumName == currentEnum.name();
            for(int j = 0; j < valueCount; j++)
            {
                enumItemName = currentEnum.index2Symbol(j);
                enumItemValue = currentEnum.index2Value(j);
             
                select firstfast forupdate EnumName, EnumItemName, EnumItemValue
                from analysisEnums where analysisEnums.EnumName == currentEnum.name() && analysisEnums.EnumItemValue == enumItemValue;

                if (analysisEnums)
                {
                    if (analysisEnums.EnumItemName != enumItemName)
                    {
                        analysisEnums.EnumItemName  = enumItemName;
                        analysisEnums.update();
                    }
                }
                else
                {
                    analysisEnums.EnumName      = currentEnum.name();
                    analysisEnums.EnumItemName  = enumItemName;
                    analysisEnums.EnumItemValue = enumItemValue;
                 
                    records.add(analysisEnums);
                }
            }
            records.insertDatabase();
            ttscommit;

            Info("Completed");
        }
    }

}


Data from SRSAnalysisEnums table looks like below:


  If you want a job to populate the data of all Enums in AOT, use below code:

class ERI_SRSAnalysisEnumsGenerator
{
    /// <summary>
    /// Fills the data for SRSAnalysisEnums table with all Enums in AOT
    /// </summary>
    /// <param name = "_args">The specified arguments.</param>
    public static void main(Args _args)
    {
        #AOT
        TreeNode treeNode;
        SRSAnalysisEnums analysisEnums;
        DictEnum currentEnum;
        str currentEnumName;
        int valueCount;
        RecordInsertList records = new RecordInsertList(tablenum(SRSAnalysisEnums));
        ttsbegin;
        treeNode = TreeNode::findNode(#BaseEnumsPath);
        treeNode = treeNode.AOTfirstChild();
        delete_from analysisEnums;
        while(treeNode)
        {
            currentEnum = new SysDictEnum(enumName2Id(treeNode.treeNodeName()));
            valueCount = currentEnum.values();
           
            for(int j = 0; j < valueCount; j++)
            {
                analysisEnums.EnumName      = currentEnum.name();
                analysisEnums.EnumItemName  = currentEnum.index2Symbol(j);
                analysisEnums.EnumItemValue = currentEnum.index2Value(j);
                analysisEnums.EnumItemLabel = currentEnum.index2Label(j);
                records.add(analysisEnums);
            }
            records.insertDatabase();

            treeNode = treeNode.AOTnextSibling();
        }
        ttscommit;

        Info("Data added for all AOT Enums in SRSAnalysisEnums table");
       
    }

}



Comments

Popular posts from this blog

How to : get the Deep URL for a particular form with filter in Dynamics 365 Finance and Operations

How to: Solve issue when DVT script for service model MRApplicationService on machine XXX failed

How to: Display individual financial dimension value in grid control