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

Popular posts from this blog

Uploading Attachments to D365FO via Public URL Using X++ Services

Retrieving Public URLs for Expense Attachments in D365FO (X++ & Service Class)