How to Retrieve Financial Dimensions in D365FO Using X++ (Example: Business Unit)
In Microsoft Dynamics 365 Finance & Operations (D365FO), Financial Dimensions are a vital part of the chart of accounts and organizational reporting structure. They allow companies to categorize financial transactions across multiple segments, such as:
-
Business Unit
-
Department
-
Cost Center
-
Project
Sometimes, you need to retrieve a filtered list of financial dimensions based on a given Active Date — for example, to show only active Business Units in a mobile app or API integration.
In this article, we’ll go through an X++ example that:
-
Retrieves Business Units from the system.
-
Filters them by Active From and Active To dates.
-
Returns them in a structured list.
-
It can be easily adapted to work with any other financial dimension.
public FinancialDimensionResponse getBusinessUnit(FromDate _activeDate)
{
DimAttributeOMBusinessUnit dimAttributeOMBusinessUnit;
DimensionAttributeValue dimensionAttributeValue;
DimensionAttribute dimensionAttribute;
FinancialDimensionResponse response = new FinancialDimensionResponse();
List businessUnitList = new List(Types::Class);
FinancialDimensionContract contract;
boolean recordFound = false;
while select * from dimAttributeOMBusinessUnit
order by Value asc
{
recordFound = true;
select * from dimensionAttributeValue
order by dimensionAttributeValue.DisplayValue asc
where dimensionAttributeValue.DisplayValue == dimAttributeOMBusinessUnit.Value
join dimensionAttribute
where dimensionAttributeValue.DimensionAttribute == dimensionAttribute.RecId
&& dimensionAttribute.Name == "BusinessUnit";
if (dimensionAttributeValue)
{
Case 1: Both Active From & Active To are set
if (dimensionAttributeValue.ActiveFrom && dimensionAttributeValue.ActiveTo)
{
if (dimensionAttributeValue.ActiveFrom <= _activeDate &&
dimensionAttributeValue.ActiveTo >= _activeDate)
{
contract = new FinancialDimensionContract();
contract.parmOperatingNumber(dimAttributeOMBusinessUnit.Value);
contract.parmName(dimAttributeOMBusinessUnit.Name);
businessUnitList.addEnd(contract);
}
}
Case 2: Active From is set, Active To is null
if (dimensionAttributeValue.ActiveFrom && dimensionAttributeValue.ActiveTo == dateNull())
{
if (dimensionAttributeValue.ActiveFrom <= _activeDate)
{
contract = new FinancialDimensionContract();
contract.parmOperatingNumber(dimAttributeOMBusinessUnit.Value);
contract.parmName(dimAttributeOMBusinessUnit.Name);
businessUnitList.addEnd(contract);
}
}
Case 3: Active From is null, Active To is set
if (dimensionAttributeValue.ActiveFrom == dateNull() && dimensionAttributeValue.ActiveTo)
{
if (dimensionAttributeValue.ActiveTo >= _activeDate)
{
contract = new FinancialDimensionContract();
contract.parmOperatingNumber(dimAttributeOMBusinessUnit.Value);
contract.parmName(dimAttributeOMBusinessUnit.Name);
businessUnitList.addEnd(contract);
}
}
Case 4: Both dates are null (always active)
if (dimensionAttributeValue.ActiveFrom == dateNull() && dimensionAttributeValue.ActiveTo == dateNull())
{
contract = new FinancialDimensionContract();
contract.parmOperatingNumber(dimAttributeOMBusinessUnit.Value);
contract.parmName(dimAttributeOMBusinessUnit.Name);
businessUnitList.addEnd(contract);
}
}
else
{
No dimension attribute value found, still add it
contract = new FinancialDimensionContract();
contract.parmOperatingNumber(dimAttributeOMBusinessUnit.Value);
contract.parmName(dimAttributeOMBusinessUnit.Name);
businessUnitList.addEnd(contract);
}
}
if (recordFound)
{
response.parmDimensionList(businessUnitList);
}
else
{
response.parmMessage("Record not found.");
}
return response;
}
Comments
Post a Comment