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

Axapta 如何在AX 2012中设置单个维度值?,axapta,dynamics-ax-2012,Axapta,Dynamics Ax 2012,我的问题是设置从外部源读取的一些维度值 鉴于AX 2009声明: ledgerJournalTrans.Dimension = ledgerTable.Dimension; ledgerJournalTrans.Dimension[1] = "abc"; 与AX 2012中的相同方式是什么 这当然会假设存在一个“部门”维度作为第一个维度。首先,AX 2009中的遗留维度已在AX 2012中被彻底重做和替换。新的分类帐维度是基于科目结构和高级规则结构所需的科目和旧维度值的组合。要了解有关A

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

鉴于AX 2009声明:

ledgerJournalTrans.Dimension    = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
与AX 2012中的相同方式是什么


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

首先,AX 2009中的遗留维度已在AX 2012中被彻底重做和替换。新的分类帐维度是基于科目结构和高级规则结构所需的科目和旧维度值的组合。要了解有关AX 2012中新维度框架的更多信息,请尝试阅读有关新维度框架的

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

诚实地说,<强>我只想把下面的代码当作一个演示,说明一些基础知识是如何工作的,而不是在生产中应该使用的东西。如果已使用存储完整组合的LedgerDimensionAccount EDT将LedgerTable上的维度字段替换为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
处理“默认尺寸”,如上文提到的白皮书@dlhattere所述

然后相应的代码如下所示:

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

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


我最近被告知,财务维度在2012年存储在一个单独的表中,并且它们也是无限的。我还没有机会看一下,但我猜它与InventDim类似,在这里你做了::FindOrCreate(),你有一个inventDimId。不确定这是否能帮助您找到正确的方向。您是正确的,但没有简单的findOrCreate(),所有引用都是RecId,请记住:)不幸的是,我还没有时间看到AX 2012完全启动。我有一位微软首席技术支持代表在我身后工作,但我们是在2009年,如果我问他2012年的编程问题,我肯定他会感到困惑。但愿我能帮上更多的忙。这帮了大忙。再次阅读白皮书也是一个很好的时间。我想你也有工作或类似的工作来设置DimensionAttribute表上数字字段的值,对吗?不,我只是将该字段添加到描述字段组中,然后在Finance\Setup\Financial dimensions中手动编辑值。请汇总链接内容;仅仅发布一个链接是没有帮助的。