web-dev-qa-db-ja.com

AX 2012で単一のディメンション値を設定するにはどうすればよいですか?

私の問題は、外部ソースから読み取ったいくつかのディメンション値を設定することです。

AX 2009のステートメントを考えると:

ledgerJournalTrans.Dimension    = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";

AX 2012と同等の方法は何ですか?

これは、最初の次元として「Department」次元の存在を前提としています。

10
Jan B. Kjeldsen

まず最初に、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();
16
dlannoye

私の場合は「デフォルトの寸法」のシナリオだったので、少し適応する必要がありました。これは私が最終的に使用した方法です:

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
Jan B. Kjeldsen

ここでこれを行うための2つの方法を取得できます。

http://daxldsoft.blogspot.it/2012/11/ax-2012-financial-dimension-update.html

0