私の問題は、外部ソースから読み取ったいくつかのディメンション値を設定することです。
AX 2009のステートメントを考えると:
ledgerJournalTrans.Dimension = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
AX 2012と同等の方法は何ですか?
これは、最初の次元として「Department」次元の存在を前提としています。
まず最初に、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();
私の場合は「デフォルトの寸法」のシナリオだったので、少し適応する必要がありました。これは私が最終的に使用した方法です:
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つの方法を取得できます。
http://daxldsoft.blogspot.it/2012/11/ax-2012-financial-dimension-update.html