03.11.2017, 14:46 | #1 |
Участник
|
D365 добавить в ledgerdimension значение еще одного сегмента
Добрый день,
d365 upd10 подскажите пожалуйста, как добавить в ledgerdimension (DimensionAttributeValueCombination) значение еще одного сегмента -worker. Для всех структур счета аналитика worker включен. аналитика worker подключена к справочнику worker у меня есть recid worker справочника ,мне нужно получить в ledgerdimension значение с сегментом данного worker/ Т.е присоединить к аналитике типа'50110-002---' значение воркера чтобы стало '50110-002---00001' где 00001 код воркера для данной записи. далее я это значение (точнее его рекид) буду использовать для заполнения значения ledgerdimension в общем журнале. |
|
03.11.2017, 15:45 | #2 |
Administrator
|
Результирующий код нужно писать, но навскидку:
Есть класс DimensionStorage, метод save() которого возвращает RecId, который хранится в LedgerDimension. Есть класс DimensionAttributeValueSetStorage, метод save() которого возвращает RecId, который хранится в DefaultDimension. Что нужно сделать: 1. Добавить через класс DimensionAttributeValue значение Worker-а в DimensionAttributeValueSetStorage (метод addItem), предварительно инициализировав класс DimensionAttributeValueSetStorage существующим значением DefaultDimension 2. Получить значение DefaultDimension (через DimensionAttributeValueSetStorage.save()) 3. Записать его в комбинации с Main Account в значение LedgerDimension (инициализировать класс DimensionStorage с существующим ledgerDimension, вытащить из него DefaultDimension, перезаписать его новым значением и получить новое значение LedgerDimension через DimensionStorage.save()) На этих классах есть статические методы, которые могут упростить жизнь. Но в целом, жизнь в D365 не особо изменилась по сравнению с АХ 2012
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Aquarius (1), BOAL (1). |
03.11.2017, 16:13 | #3 |
NavAx
|
Что то похожее делал, но другая аналитика:
X++: [DataEventHandler(tableStr(SalesTable), DataEventType::Inserting)] public static void mtsSalesTable_onInserting(Common sender, DataEventArgs e) { SalesTable salesTable = sender as SalesTable; if (salesTable.MTSBusinessUnit) { salesTable.DefaultDimension = LedgerDimensionDefaultFacade::serviceReplaceAttributeValue( salesTable.DefaultDimension, MTSBusinessUnitDialogClass::getDimensionDefaultFromBusinessUnit(salesTable.MTSBusinessUnit), MTSBusinessUnitDialogClass::getDimensionAttributeOfBusinessUnit().RecId); } } class MTSBusinessUnitDialogClass extends RunBase { static DimensionDefault getDimensionDefaultFromBusinessUnit(MTSBusinessUnitDialog _businessUnit) { DimensionDefault defaultDimensionLocal; DimensionAttribute dimensionAttribute = MTSBusinessUnitDialogClass::getDimensionAttributeOfBusinessUnit(); DimensionAttributeValue dimensionAttributeValueLocal; DimensionAttributeValueSetStorage valueSetStorageLocal = new DimensionAttributeValueSetStorage(); dimensionAttributeValueLocal = dimensionAttributeValue::findByDimensionAttributeAndValue( dimensionAttribute, _businessUnit, false, true); valueSetStorageLocal.addItem(dimensionAttributeValueLocal); defaultDimensionLocal = valueSetStorageLocal.save(); return defaultDimensionLocal; } static DimensionAttribute getDimensionAttributeOfBusinessUnit() { DimensionAttribute dimensionAttribute; select firstonly dimensionAttribute where dimensionAttribute.Type == DimensionAttributeType::ExistingList && dimensionAttribute.BackingEntityType == tableNum(DimAttributeOMBusinessUnit); return dimensionAttribute; } } |
|
|
За это сообщение автора поблагодарили: Aquarius (1). |
03.11.2017, 22:15 | #4 |
Участник
|
Нашла интересные описания по финансовым аналитикам после очень долгих поисков,может кому то из неофитов в сфере фин аналитик по акс 12 и акс 7 ( типа меня) пригодится.
https://blogs.msdn.microsoft.com/ax_...-1-dimensions/ https://blogs.msdn.microsoft.com/ax_...lt-dimensions/ https://blogs.msdn.microsoft.com/ax_...age/2/?m=20132 |
|
|
За это сообщение автора поблагодарили: sukhanchik (2). |
05.11.2017, 23:51 | #5 |
Участник
|
Добрый вечер,
вот таким способом добавила значение еще одного сегмента (значение воркера) в ledgerdimension (cвязан сDimensionAttributeValueCombination ).Работает. Но нужно наверно же проверить перед добавлением указан ли в структуре счета для данного ledgerdimension такой сегмент. Подскажите пожалуйста, как это сделать. ledgerdimension ledgerdim, recId currentPerson1 = 22565422591; HcmPersonnelNumberId dimValue = HcmWorker::findByPerson(currentPerson1).PersonnelNumber; Name dimName = 'Worker'; DimensionAttribute dimensionAttribute = DimensionAttribute::findByName(dimName); LedgerDefaultDimensionValueSet defaultDimension; DimensionAttributeValue newDimensionValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimValue, true, true); DimensionAttributeValueSetStorage dimAttrValueSetStorage = new DimensionAttributeValueSetStorage(); dimAttrValueSetStorage.addItem(newDimensionValue); defaultDimension = dimAttrValueSetStorage.save(); ledgerDim = LedgerDimensionFacade::serviceCreateLedgerDimForDefaultDim(defaultDimension, ledgerDim); ledgerJournalTrans.LedgerDimension = ledgerDim ; Ниже пример как присоединить значение еще одной финансовой аналитики (соотвествующей значению worker) к defaultDimension(связано DimensionAttributeValueSet) commissionTrans.DefaultDimension = commissionTransDefaultDimension; HcmPersonnelNumberId dimValue = HcmWorker::findByPerson(commissionTrans.Person).PersonnelNumber; Name dimName = 'Worker'; if (dimValue) { DimensionAttribute dimensionAttribute = DimensionAttribute::findByName(dimName); DimensionAttributeValue newDimensionValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimValue, true, true); DimensionAttributeValueSetStorage dimAttrValueSetStorage = DimensionAttributeValueSetStorage::find(commissionTrans.DefaultDimension); dimAttrValueSetStorage.addItem(newDimensionValue); commissionTrans.DefaultDimension = dimAttrValueSetStorage.save(); } Последний раз редактировалось Aquarius; 05.11.2017 в 23:53. |
|
07.11.2017, 14:15 | #6 |
Участник
|
Может стоит потратить 1 день и разобраться как это все работает, вместо того чтобы писать черти-что?
Зачем создавать DefaultDimension, добавлять в него один Dimension, потом конвертировать в LedgerDimension? Не проще ли используя DimensionHelper найти нужный сегмент, присвоить ему значение и сохранить? |
|
|
За это сообщение автора поблагодарили: Aquarius (1). |
08.11.2017, 12:41 | #7 |
Administrator
|
Цитата:
Сообщение от Napalm
Может стоит потратить 1 день и разобраться как это все работает, вместо того чтобы писать черти-что?
Зачем создавать DefaultDimension, добавлять в него один Dimension, потом конвертировать в LedgerDimension? Не проще ли используя DimensionHelper найти нужный сегмент, присвоить ему значение и сохранить? В D365 PU10 нет класса DimensionHelper. Если Вы чего-то другое имели в виду - приведите пример кода. А заодно - где (конкретно в каких объектах) разбираться. А то получается - каждый где нашел код, там и считает эталоном - кто в ЖГК, кто в проектах, кто в складском контуре
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Aquarius (1). |
08.11.2017, 13:50 | #8 |
NavAx
|
Цитата:
ЗЫ. Нужно проверить, что getDimensionAttributeOfBusinessUnit() в моем примере возвращает не 0. Последний раз редактировалось raz; 08.11.2017 в 14:03. |
|
08.11.2017, 16:00 | #9 |
NavAx
|
Пропустил, что нужно для LedgerDimension.
На форуме проскакивала ссылка для dax2012 Replacing Financial Dimension in Ledger Dimension |
|
08.11.2017, 19:52 | #10 |
Участник
|
Цитата:
X++: ttsbegin; LedgerJournalTrans ledgerJournalTrans = LedgerJournalTrans::findRecId(5555555555, true); DimensionAttribute dimensionAttribute = DimensionAttribute::findByName("BusinessUnit"); DimensionAttributeValue dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, "001"); DimensionStorage dimensionStorage = DimensionStorage::findById(ledgerJournalTrans.LedgerDimension); for (int i = 1; i <= dimensionStorage.segmentCount(); i++) { if (dimensionStorage.getAttributeIdForSegment(i) == dimensionAttribute.RecId) { dimensionStorage.setSegment(i, DimensionStorageSegment::constructFromValue(dimensionAttributeValue.getValue(), dimensionAttributeValue)); ledgerJournalTrans.LedgerDimension = dimensionStorage.save(); ledgerJournalTrans.update(); break; } } ttscommit; |
|
|
За это сообщение автора поблагодарили: Aquarius (1), BOAL (1), ta_and (4). |
08.11.2017, 20:06 | #11 |
Участник
|
Структура может быть разной из-за Advanced Rules.
|
|
09.11.2017, 00:00 | #12 |
Участник
|
Спасибо ,Napalm.
за пример вашего кода. буду использовать его. Свой пример я сделала по аналогии с бразильской функциональностью.там были похожие строчки. |
|
Теги |
defaultdimension, ledgerdimension, финансовые аналитики |
|
|