|  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, финансовые аналитики | 
|  | 
| 
 |