Как установить одно значение измерения в AX 2012?

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

Учитывая заявление AX 2009:

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

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

Это, естественно, предполагает существование измерения «Отдел» в качестве первого измерения.


person Jan B. Kjeldsen    schedule 24.01.2012    source источник
comment
Недавно мне сказали, что в 2012 финансовые аналитики хранятся в отдельной таблице и они тоже не ограничены. У меня еще не было возможности посмотреть, но я предполагаю, что это похоже на InventDim, где вы выполняете ::FindOrCreate() и у вас есть inventDimId. Не уверен, что это может помочь указать вам правильное направление.   -  person Alex Kwitny    schedule 24.01.2012
comment
Вы правы, но простого findOrCreate() нет, все ссылки RecId, помните :)   -  person Jan B. Kjeldsen    schedule 24.01.2012
comment
К сожалению, я еще не успел увидеть AX 2012 полностью. За моей спиной работает главный представитель службы поддержки Microsoft, но мы находимся в 2009 году, и я уверен, что он был бы сбит с толку, если бы я задал ему вопрос о программировании 2012 года. Хотел бы я быть более полезным.   -  person Alex Kwitny    schedule 25.01.2012


Ответы (3)


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

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

Честно говоря, я бы рассматривал приведенный ниже код только как демонстрацию того, как работают некоторые основы, а не как то, что следует использовать в производственной среде. С учетом сказанного, этот код должен выполнять то, что вы хотите, если что. Поле 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();
person dlannoye    schedule 25.01.2012
comment
Это очень помогло. Кроме того, было приятно провести время, прочитав технический документ снова. - person Jan B. Kjeldsen; 30.01.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();
person Jan B. Kjeldsen    schedule 30.01.2012
comment
Я предполагаю, что для этого у вас также была работа или что-то подобное, которое устанавливало значения поля Number в таблице DimensionAttribute, это правильно? - person dlannoye; 30.01.2012
comment
Нет, я просто добавил поле в группу полей Описание, а затем отредактировал значения вручную в Финансы\Настройка\Финансовые измерения. - person Jan B. Kjeldsen; 30.01.2012

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

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

person Edikin Somerholder    schedule 30.11.2012
comment
Пожалуйста, суммируйте содержание ссылки; просто разместить ссылку бесполезно. - person LittleBobbyTables - Au Revoir; 30.11.2012