Как установить одно значение измерения в AX 2012? - PullRequest
9 голосов
/ 24 января 2012

Моя проблема заключается в настройке некоторых значений измерений, считываемых из внешнего источника.

Учитывая оператор AX 2009:

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

Что эквивалентно этому в AX 2012?

Эта причина будет предполагать существование измерения "Отдел" в качестве первого измерения.

Ответы [ 3 ]

15 голосов
/ 25 января 2012

Перво-наперво, устаревшие измерения в AX 2009 были полностью переделаны и заменены в AX 2012. Новый LedgerDimension представляет собой комбинацию учетной записи и старых значений измерений, которые необходимы на основе учетной записи.структура и продвинутые структуры правил.Чтобы узнать больше о новой платформе измерений в AX 2012, попробуйте прочитать технический документ о новой платформе измерений.

Предполагая, что Department является первым измерением, а оба измерения используют LedgerDimensionAccount EDTзначительно упрощает этот сценарий, но новая структура измерений очень гибкая, поэтому это предположение может быть неверным.Даже если это так, простое указание нового значения для Department может потребовать кардинального изменения структуры комбинации из-за расширенных структур правил, которые можно настроить.

Честно говоря, Я бы рассматривал приведенный ниже код только как демонстрацию того, как работают некоторые из базовых принципов, а не как то, что следует использовать в производстве. С учетом сказанного, этот код должен выполнить то, чтоВы хотите, если это поле Dimension в LedgerTable было заменено полем LedgerDimension с использованием EDT LedgerDimensionAccount, в котором хранится полная комбинация.

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();
2 голосов
/ 30 января 2012

В моем случае был сценарий «размеры по умолчанию», поэтому мне пришлось немного адаптироваться. Это метод, который я в конечном итоге использовал:

В таблице 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();
0 голосов
/ 30 ноября 2012

Вы можете получить 2 способа сделать это здесь:

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

...