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");
}
}
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:
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
Post a Comment