我的问题是设置从外部源读取的一些尺寸值。
鉴于 AX 2009 声明:
ledgerJournalTrans.Dimension = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
与 AX 2012 中的等效方法是什么?
这当然会假设存在“部门”维度作为第一个维度。
我的问题是设置从外部源读取的一些尺寸值。
鉴于 AX 2009 声明:
ledgerJournalTrans.Dimension = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
与 AX 2012 中的等效方法是什么?
这当然会假设存在“部门”维度作为第一个维度。
首先,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();
我的情况是“默认尺寸”场景,所以我不得不稍微适应一下。这是我最终使用的方法:
在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();