我的问题是设置一些从外部源读取的维度值。
鉴于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