10

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

鉴于 AX 2009 声明:

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

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

这当然会假设存在“部门”维度作为第一个维度。

4

3 回答 3

17

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

假设 Department 是第一个维度并且两个维度都使用 LedgerDimensionAccount EDT 会大大简化这个场景,但是新的维度框架非常灵活,所以这个假设可能不正确。即使是这样,简单地为部门指定一个新值也可能需要组合的结构需要彻底改变,因为可以设置高级规则结构。

老实说,我只会将下面的代码视为一些基础知识如何工作的演示,而不是应该在生产中使用的东西。话虽如此,如果 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();
于 2012-01-25T16:59:21.903 回答
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();
于 2012-01-30T11:09:21.997 回答
0

您可以在此处获得 2 种方法:

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

于 2012-11-30T14:56:29.773 回答