Как задать одно значение измерения в AX 2012?
моя проблема заключается в установке некоторых значений измерений, считываемых из внешнего источника.
учитывая оператор AX 2009:
ledgerJournalTrans.Dimension = ledgerTable.Dimension;
ledgerJournalTrans.Dimension[1] = "abc";
каков эквивалентный способ для AX 2012?
эта причина предполагает существование измерения "отдел" в качестве первого измерения.
3 ответов
во-первых, устаревшие размеры в AX 2009 были полностью переделать и заменить в AX 2012. Новое значение LedgerDimension представляет собой комбинацию значений счета и старого измерения, которые необходимы на основе структуры счета и расширенных структур правил. Чтобы узнать больше о новой структуре измерений в AX 2012, попробуйте прочитать техническое описание о новой структуре измерения.
предполагая, что отдел является первым измерение и то, что оба измерения используют EDT LedgerDimensionAccount, немного упрощает этот сценарий, но новая структура измерения очень гибкая, поэтому это предположение может быть неверным. Даже если это так, простое указание нового значения для Department может потребовать радикального изменения структуры комбинации из-за расширенных структур правил, которые можно настроить.
честно, Я бы только рассмотрел код ниже как просто демонстрацию того, как некоторые основы работы, а не то, что должно использоваться в производстве. С учетом сказанного, этот код должен выполнить то, что вы хотите, если это поле измерения на LedgerTable было заменено полем LedgerDimension с помощью LEDGERDIMENSIONACCOUNT EDT, в котором хранится полная комбинация.
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