我的问题是设置从外部源读取的一些维度值。
鉴于AX 2009声明:
ledgerJournalTrans.Dimension = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
与AX 2012相同的方式是什么?
这将导致假设存在“部门”维度作为第一维度。
答案 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)