In Dynamics 365 Finance & Operations, generating dynamic ledger dimensions, combinations of a Main Account along with financial dimensions like Business Unit, Department, Branch Code, or Employee Code—can be tricky. Instead of hardcoding dimension strings or relying on fragile string concatenation, the recommended approach is to programmatically inspect the active Account Structure and build the financial combination dynamically.
The code below will help out to generate Ledger Dimension using x++ in D365 FO
public RefRecId generateLedgerDimension(MainAccountNum _mainAccountId,
DimensionValue _businessUnit,
DimensionValue _department,
DimensionValue _branchCode,
DimensionValue _employeeCode)
{
container conData;
int hierarchyCount;
int hierarchyIdx;
LedgerRecId ledgerRecId;
MainAccount mainAccount;
RefRecId recordvalue;
DimensionAttribute dimensionAttribute;
DimensionAttributeValue dimensionAttributeValue;
DimensionSetSegmentName DimensionSet;
DimensionStorage dimStorage;
DimensionAttributeValueContract ValueContract;
LedgerAccountContract LedgerAccountContract;
DimensionAttributeValueCombination dimensionAttributeValueCombination;
List valueContracts;
#define.MainAccount('MainAccount')
#define.Department('Department')
#define.BusinessUnit('BusinessUnit')
#define.BranchCode('BranchCode')
#define.EmployeeCode('EmployeeCode')
LedgerAccountContract = new LedgerAccountContract();
valueContracts = new List(Types::Class);
conData = [_mainAccountId];
mainAccount = MainAccount::findByMainAccountId(_mainAccountId);
recordvalue = DimensionHierarchy::getAccountStructure(mainAccount.RecId,Ledger::current());
hierarchyCount = DimensionHierarchy::getLevelCount(recordvalue);
DimensionSet = DimensionHierarchyLevel::getDimensionHierarchyLevelNames(recordvalue);
if (recordvalue)
{
for(hierarchyIdx = 1;hierarchyIdx<=hierarchyCount;hierarchyIdx++)
{
if(hierarchyIdx == 1)
{
continue;
}
dimensionAttribute = DimensionAttribute::findByLocalizedName(DimensionSet[hierarchyIdx],false);
if (dimensionAttribute.Name == #Department)
{
conData += [_department];
}
else if (dimensionAttribute.Name == #BusinessUnit)
{
conData += [_businessUnit];
}
else if (dimensionAttribute.Name == #BranchCode)
{
conData += [_branchCode];
}
else if (dimensionAttribute.Name == #EmployeeCode)
{
conData += [_employeeCode];
}
if(dimensionAttribute)
{
dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute,conPeek(conData,hierarchyIdx));
if(dimensionAttributeValue)
{
ValueContract = new DimensionAttributeValueContract();
ValueContract.parmName(dimensionAttribute.Name) ;
ValueContract.parmValue(dimensionAttributeValue.CachedDisplayValue);
valueContracts.addEnd(ValueContract);
}
}
}
LedgerAccountContract.parmMainAccount(_mainAccountId);
LedgerAccountContract.parmValues(valueContracts);
dimStorage = DimensionServiceProvider::buildDimensionStorageForLedgerAccount(LedgerAccountContract);
dimensionAttributeValueCombination = DimensionAttributeValueCombination::find(dimStorage.save());
ledgerRecId = dimensionAttributeValueCombination.RecId;
}
else
{
warning (strfmt('Ledger dimension Issue for main account %1', _mainAccountId));
}
return ledgerRecId;
}
Comments
Post a Comment