如何在AX 2012中设置单个维度值



我的问题是设置一些从外部源读取的维度值。

鉴于AX 2009的声明:

ledgerJournalTrans.Dimension    = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";

与AX 2012中的方法等效的方法是什么?

这必然会假定"部门"维度作为第一维度的存在。

首先,AX 2009中的遗留维度已被完全重做,并在AX 2012中被替换。新的LedgerDimension是基于帐户结构和高级规则结构所需的帐户和旧维度值的组合。要了解有关AX 2012中新维度框架的更多信息,请尝试阅读有关新维度架构的白皮书。

假设部门是第一个维度,并且两个维度都使用LedgerDimensionAccount EDT,这在很大程度上简化了这种情况,但新的维度框架非常灵活,因此这种假设可能不正确。即使是这样,由于可以设置高级规则结构,简单地为Department指定一个新值可能需要对组合的结构进行大幅更改。

老实说,我只认为下面的代码只是演示一些基础知识是如何工作的,而不是应该在生产中使用的话虽如此,如果LedgerTable上的Dimension字段已替换为使用LedgerDimensionAccount EDT(存储完整组合)的LedgerDimension字段,则此代码应该可以实现您想要的功能。

DimensionStorage dimensionStorage;
DimensionAttribute deparmentDimensionAttribute;
DimensionAttributeValue newDepartmentValue;
// Find the deparment dimension attribute
deparmentDimensionAttribute = DimensionAttribute::findByName("Department");  
// Find the new department value we want to put in the new combination.
newDepartmentValue = DimensionAttributeValue::findByDimensionAttributeAndValue(deparmentDimensionAttribute, "abc");
// Load a DimensionStorage instance with the old combination and update the first segment with new value
dimensionStorage = DimensionStorage::findById(ledgerTable.LedgerDimension);
dimensionStorage.setSegment(1,DimensionStorageSegment::constructFromValue("abc", newDepartmentValue));
ledgerJournalTrans.LedgerDimension = dimensionStorage.save();

我的案例是"默认维度"场景,所以我不得不进行一些调整。这就是我最终使用的方法:

DimensionAttribute表上添加一个新的字段名称Number,然后添加此方法:

public static DimensionAttribute findByNumber(DimensionOrdinal _number)
{
    DimensionAttribute dimensionAttribute;
    select firstonly dimensionAttribute where dimensionAttribute.Number == _number;
    return dimensionAttribute;
}

这将使用相应的数字明确标识尺寸。

DimensionAttributeValueSetStorage类上添加方法:

public void addItemNumber(DimensionOrdinal _idx, SysDim _value)
{
    DimensionAttributeValue attrValue;
    DimensionAttribute attr = DimensionAttribute::findByNumber(_idx);
    if (!attr)
        throw error(strFmt("@SYS342559", _idx));
    attrValue = DimensionAttributeValue::findByDimensionAttributeAndValue(attr, _value, false, true);
    this.addItemValues(attr.RecId, attrValue.RecId, attrValue.HashKey);
}

DimensionAttributeValueSetStorage处理"默认尺寸",如白皮书@dlamene中所述。

然后相应的代码如下所示:

dimensionStorage = DimensionAttributeValueSetStorage::find(salesTable.DefaultDimension);
dimensionStorage.addItemNumber(1, "abc");
salesTable.DefaultDimension = dimensionStorage.save();

您可以在这里获得两种方法:

http://daxldsoft.blogspot.it/2012/11/ax-2012-financial-dimension-update.html

最新更新