AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.11.2017, 14:46   #1  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
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  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Результирующий код нужно писать, но навскидку:
Есть класс 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  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Что то похожее делал, но другая аналитика:
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  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Нашла интересные описания по финансовым аналитикам после очень долгих поисков,может кому то из неофитов в сфере фин аналитик по акс 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  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Добрый вечер,
вот таким способом добавила значение еще одного сегмента (значение воркера) в 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  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Может стоит потратить 1 день и разобраться как это все работает, вместо того чтобы писать черти-что?

Зачем создавать DefaultDimension, добавлять в него один Dimension, потом конвертировать в LedgerDimension?

Не проще ли используя DimensionHelper найти нужный сегмент, присвоить ему значение и сохранить?
За это сообщение автора поблагодарили: Aquarius (1).
Старый 08.11.2017, 12:41   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Napalm Посмотреть сообщение
Может стоит потратить 1 день и разобраться как это все работает, вместо того чтобы писать черти-что?

Зачем создавать DefaultDimension, добавлять в него один Dimension, потом конвертировать в LedgerDimension?

Не проще ли используя DimensionHelper найти нужный сегмент, присвоить ему значение и сохранить?
Может стоит внимательнее прочитать вопрос, прежде чем наезжать?

В D365 PU10 нет класса DimensionHelper. Если Вы чего-то другое имели в виду - приведите пример кода. А заодно - где (конкретно в каких объектах) разбираться. А то получается - каждый где нашел код, там и считает эталоном - кто в ЖГК, кто в проектах, кто в складском контуре
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Aquarius (1).
Старый 08.11.2017, 13:50   #8  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Aquarius Посмотреть сообщение
Но нужно наверно же проверить перед добавлением указан ли в структуре счета для данного ledgerdimension такой сегмент.
Я не конс, но думаю не надо, т.к. структура зависит от счета, а на какие счета будет разноска известно в момент разноски. Система сама отбросит ненужное.

ЗЫ. Нужно проверить, что getDimensionAttributeOfBusinessUnit() в моем примере возвращает не 0.

Последний раз редактировалось raz; 08.11.2017 в 14:03.
Старый 08.11.2017, 16:00   #9  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Пропустил, что нужно для LedgerDimension.

На форуме проскакивала ссылка для dax2012 Replacing Financial Dimension in Ledger Dimension
Старый 08.11.2017, 19:52   #10  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
В D365 PU10 нет класса DimensionHelper. Если Вы чего-то другое имели в виду - приведите пример кода.
Имел ввиду класс DimensionStorage. Ниже пример кода (разумеется для реального применения следует поменять константы на параметры и добавить проверок.
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  
Napalm is offline
Napalm
Участник
 
80 / 88 (3) ++++
Регистрация: 23.05.2012
Цитата:
Сообщение от raz Посмотреть сообщение
Я не конс, но думаю не надо, т.к. структура зависит от счета, а на какие счета будет разноска известно в момент разноски. Система сама отбросит ненужное.

ЗЫ. Нужно проверить, что getDimensionAttributeOfBusinessUnit() в моем примере возвращает не 0.
Структура может быть разной из-за Advanced Rules.
Старый 09.11.2017, 00:00   #12  
Aquarius is offline
Aquarius
Участник
 
139 / 29 (1) +++
Регистрация: 08.02.2007
Адрес: Одесса
Спасибо ,Napalm.
за пример вашего кода. буду использовать его.
Свой пример я сделала по аналогии с бразильской функциональностью.там были похожие строчки.
Теги
defaultdimension, ledgerdimension, финансовые аналитики

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
organicax: Setting up the Statistical Demand Forecasting in D365 with Azure Machine Learning Blog bot DAX Blogs 0 12.08.2017 01:17
organicax: Refreshing forms – options in D365 Blog bot DAX Blogs 0 14.04.2017 19:11
organicax: D365 Mobile App – Creating an action Blog bot DAX Blogs 0 14.04.2017 07:17
теряется значение переменной laxel DAX: Программирование 3 05.02.2009 10:07
Как добавить значение в таблицу не по имени поля, а нпример по индексу поля? yuriuss DAX: Программирование 16 07.07.2008 16:36

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:34.