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を使用していると仮定すると、このシナリオはかなり単純化されますが、新しいディメンションフレームワークは非常に柔軟であるため、この仮定は正しくない可能性があります。たとえそうだとしても、Departmentに新しい値を指定するだけでは、高度なルール構造を設定できるため、組み合わせの構造を大幅に変更する必要がある場合があります。

正直なところ、私は以下のコードを、本番環境で使用する必要のあるものではなく、基本の一部がどのように機能するかを示す単なるデモンストレーションと見なすだけです。そうは言っても、完全な組み合わせを格納するLedgerDimensionAccount EDTを使用して、LedgerTableのそのDimensionフィールドが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 に答える