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

时间:2012-01-24 09:26:11

标签: axapta dynamics-ax-2012

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

鉴于AX 2009声明:

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

与AX 2012相同的方式是什么?

这将导致假设存在“部门”维度作为第一维度。

3 个答案:

答案 0 :(得分:14)

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

假设Department是第一个维度并且两个维度都使用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();

答案 1 :(得分:2)

我的案例是"默认尺寸"情景,所以我不得不适应一点。 这是我最终使用的方法:

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处理"默认尺寸"正如@dlannoye提到的白皮书所述。

然后相应的代码如下:

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

答案 2 :(得分:0)