8-800-700-15-02

Звонок по России
бесплатный

info@i-neti.ru
Мы переехали на новый сайт MS Dynamics

Microsoft Dynamics 365: Изменения в структуре финансовых аналитик

asd
Дата публикации: 20.02.2020
Microsoft Dynamics 365: Изменения в структуре финансовых аналитик

Упрощенное получение значения аналитики

 

После релиза Dynamics 365 for Operations [Enterprise Edition] структура аналитик и бизнес-логика немного изменились. В этом посте я познакомлю вас с новыми возможностями аналитик в новой версии Dynamics AX.

Построение запросов по финансовым аналитикам в Dynamics 365 for Operation [Enterprise Edition] теперь сильно упростилось по сравнению с Dynamics AX 2012. Вместо написания огромного запроса для поиска записи с определенным значением аналитики, теперь вам потребуется значительно меньше кода, чем потребовалось бы в предыдущей версии. Это связано с тем, что теперь значения аналитик хранятся непосредственно в таблицах DimensionAttributeValueSet (для аналитик по умолчанию) и DimensionAttributeValueCombination (для счетов главной книги). Новые поля значений добавляются, когда аналитика активирована. Если вам интересно, вы можете найти код, который делает это в методе DimensionSchemaAndDataSynchronizationUtility / createDimensionColumnsForList.

Например, если вы активируете аналитику CustomerSegment (Клиент), система создаст новые поля CustomerSegment и CustomerSegmentValue в таблицах SQL (эти поля не будут видны в AOT в Visual Studio) DimensionAttributeValueSet и DimensionAttributeValueCombination.

CUSTOMERSEGMENT

CUSTOMERSEGMENTVALUE

5637144684

100

5637144684

100

5637144680

4000

Пример 1: Значения полей CustomerSegment и CustomerSegmentValue

 

В этом примере поле CustomerSegment является ссылкой на запись в сущности-источнике (в данном случае таблица CustTable), а CustomerSegmentValue является отображаемым значением аналитики.

Чтобы выбрать конкретное значение аналитики непосредственно из таблицы DimensionAttributeValueCombination (или DimensionAttributeValueSet), вам необходимо указать идентификатор поля (FieldId) вместо его имени. Для этой цели вы можете использовать метод DimensionAttributeValueCombination / getDimensionValueFieldId.

Чтобы увидеть, как запросы на основе аналитик могут быть сокращены в Dynamics 365, давайте рассмотрим пример, в котором выбираются проекты, имеющие конкретное значение аналитики BusinessUnit (бизнес-единица):

static void CF1_GetProjectsWithCustomerSegment(Args _args)

{

    #define.BUSINESSUNIT('BusinessUnit')

 

    ProjTable                       projTable;

 

    DimensionAttribute              da;

    DimensionAttributeValue         dav;

    DimensionAttributeValueSet      davs;

    DimensionAttributeValueSetItem  davsi;

 

    while select ProjId from projTable

        exists join davs

            where davs.RecId == projTable.DefaultDimension

        exists join davsi

            where davsi.DimensionAttributeValueSet == davs.RecId &&

                  davsi.DisplayValue               == '001'

        exists join dav

            where dav.RecId == davsi.DimensionAttributeValue

        exists join da

            where da.RecId == dav.DimensionAttribute &&

                  da.Name  == #CUSTOMERSEGMENT

    {

        info(projTable.ProjId);

    }

}

 

Пример 2: Запросы по финансовым аналитикам в Dynamics AX 2012

 

 

class CF1_GetProjectsWithBusinessUnit

{       

    public static void main(Args _args)

    {       

        Const Name BUSINESSUNIT = 'BusinessUnit';

 

        FieldId                     businessUnitId;

        ProjTable                   projTable;

        DimensionAttributeValueSet  davs;

 

        businessUnitId = DimensionAttributeValueCombination::getDimensionValueFieldId(BUSINESSUNIT);

 

        while select ProjId from projTable

            exists join davs

                where davs.RecId          == projTable.DefaultDimension &&

                    davs.(businessUnitId) == '20'

        {

            info(projTable.ProjId);

        }

    }

}

 

Пример 3: Запросы по финансовым аналитикам в Dynamics 365

 

Как видите, запросы теперь намного короче, что, в свою очередь, повышает производительность решения. В Dynamics 365 то же самое относится к запросам, реализуемым через класс Query.

class CF1_GetProjectsWithBusinessUnit

{       

    public static void main(Args _args)

    {       

        Const Name BUSINESSUNIT = 'BusinessUnit';

 

        FieldId         businessUnitId;

        ProjTable       projTable;

 

        businessUnitId = DimensionAttributeValueCombination::getDimensionValueFieldId(BUSINESSUNIT);

 

        Query                   q;

        QueryRun                qr;

        QueryBuildDataSource    qbdProjTable, qbdDimensionAttributeValueSet;

 

        q = new Query();

 

        qbdProjTable = q.addDataSource(tableNum(ProjTable));

 

        qbdDimensionAttributeValueSet = qbdProjTable.addDataSource(tableNum(DimensionAttributeValueSet));

        qbdDimensionAttributeValueSet.relations(true);

 

        SysQuery::findOrCreateRange(qbdDimensionAttributeValueSet, businessUnitId).value('20');

 

        qr = new QueryRun(q);

 

        while (qr.Next())

        {

            projTable = qr.get(tableNum(ProjTable));

        }

    }

}

 

Пример 4: Запросы по финансовым аналитикам в Dynamics 365


 

Изменения в классе DimensionStorage в Dynamics 365

В Dynamics 365 довольно много методов из класса DimensionStorage (который обычно используется в разработке) были перемещены в другие классы. Вот список этих методов:

Метод класса DimensionStorage в AX 2012

Куда перемщен исходный метод класса DimensionStorage в Dynamics 365

getMainAccountIdFromLedgerDimension

LedgerDimensionFacade/ getMainAccountRecIdFromLedgerDimension

getMainAccountFromLedgerDimension

LedgerDimensionFacade/getMainAccountFromLedgerDimension

getDefaultAccount

LedgerDefaultAccountHelper/getDefaultAccountFromMainAccountRecId

getDefaultAccountForMainAccountNum

LedgerDefaultAccountHelper/getDefaultAccountFromMainAccountId

accountNum2LedgerDimension
And getDynamicAccount

LedgerDynamicAccountHelper/getDynamicAccountFromAccountNumber

ledgerDimension2AccountNum

LedgerDynamicAccountHelper/ getAccountNumberFromDynamicAccount

getDefaultDimensionFromLedgerDimension

LedgerDimensionFacade/getDefaultDimensionFromLedgerDimension


Могут возникнуть ситуации, когда вам нужно извлечь счет или аналитики по умолчанию по отображаемым значениям. В Dynamics 365 это немного изменилось, и я покажу вам несколько вариантов решений.

Чтобы получить набор аналитик счёта по отображаемым значениям, вам необходимо установить каждый сегмент, который имеет непустое значение с помощью класса DimensionStorageSegment, а затем использовать метод resolve класса LedgerAccountDimensionResolver для получения набора аналитик счёта. Вот пример того, как можно этого достичь:

//Dimension segement constant List

const Name MAINACCOUNT     = 'MainAccount';

const Name BUSINESSUNIT    = 'BusinessUnit';

const Name CUSTOMERSEGMENT = 'CustomerSegment';

const Name PROJECT         = 'Project';

const Name PRODUCT         = 'Product';

const Name GROUPCODE       = 'GroupCode';

const Name TARGET          = 'Target';


public DimensionDynamicAccount getLedgerDimensionFromDisplayValues (CF1_DisplayValueTable  _displayValueTable)

{

    LedgerAccountDimensionResolver  ledgerAccountDimensionResolver;

    DimensionStorage                dimensionStorage;

    DimensionHierarchy              dimensionHierarchy = DimensionHierarchy::find(DimensionHierarchy::getAccountStructure(MainAccount::findByMainAccountId(_displayValueTable.Account).RecId, Ledger::current()));


    dimensionStorage = DimensionStorage::construct();

    dimensionStorage.addAccountStructure(dimensionHierarchy.RecId);

 

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Account, MAINACCOUNT);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object1, BUSINESSUNIT);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object2, CUSTOMERSEGMENT);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object3, PROJECT);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object4, PRODUCT);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object5, GROUPCODE);

    this.setSegments(dimensionStorage, dimensionHierarchy.RecId, _displayValueTable.Object6, TARGET);

 

    ledgerAccountDimensionResolver = LedgerAccountDimensionResolver::newResolver(dimensionStorage.getComboDisplayValue(), dimensionHierarchy.Name);

    ledgerAccountDimensionResolver.parmDimensionFormat(DimensionHierarchyView::findByHierarchy(dimensionHierarchy.RecId).Segments);

 

    return ledgerAccountDimensionResolver.resolve();

}

 

public  void setSegments(DimensionStorage _dimensionStorage, DimensionHierarchyId _dimensionHierarchyId, DimensionValue _dimensionValue, Name _dimensionName)

{

    DimensionAttribute             dimensionAttribute          = DimensionAttribute::findByName(_dimensionName);

    DimensionAttributeValue        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, _dimensionValue);


    if (_dimensionValue && dimensionAttributeValue && _dimensionHierarchyId && dimensionAttribute)

    {

        DimensionStorageSegment         dimStorageSegment;

 

        dimStorageSegment = DimensionStorageSegment::construct(

            _dimensionValue,

            dimensionAttributeValue.RecId,

            dimensionAttributeValue.HashKey);

 

       _dimensionStorage.setSegment(DimensionHierarchyLevel::findByDimensionHierarchyAndDimAttribute(_dimensionHierarchyId, dimensionAttribute.RecId).Level, dimStorageSegment);

    }

}

 

Пример 5: Набор финансовые аналитик по отображаемым значениям в Dynamics 365

 

Чтобы получить набор аналитик по умолчанию из отображаемых значений сегментов аналитик, вам необходимо использовать класс DimensionAttributeValueSetStorage. Вот пример того, как это можно реализовать:

public static DimensionDefault getDefaultDimensionFromDisplayValues(CF1_DisplayValueTable  _displayValueTable)

{

    //Dimension segement constant List

    const Name BUSINESSUNIT    = 'BusinessUnit';

    const Name CUSTOMERSEGMENT = 'CustomerSegment';

    const Name PROJECT         = 'Project';

    const Name PRODUCT         = 'Product';

    const Name GROUPCODE       = 'GroupCode';

    const Name TARGET          = 'Target';

 

    DimensionAttributeValueSetStorage   invoiceDAVSStorage;

 

    void addItem(DimensionAttributeValue _dav)

    {

        if (_dav)

        invoiceDAVSStorage.addItem(_dav);

    }

 

    invoiceDAVSStorage = new DimensionAttributeValueSetStorage();

 

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(BUSINESSUNIT), _displayValueTable.Object1));

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(CUSTOMERSEGMENT), _displayValueTable.Object2));

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(PROJECT), _displayValueTable.Object3));

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(PRODUCT), _displayValueTable.Object4));

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(GROUPCODE), _displayValueTable.Object5));

    addItem(DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute::findByName(TARGET), _displayValueTable.Object6));

 

    return invoiceDAVSStorage.save();

}

 

Пример 6: Получение набора аналитик по умолчанию в Dynamics 365

 

Я надеюсь, что это дало вам некоторое представление о различиях между структурой аналитик в Dynamics 365 for Operations [Enterprise Edition] и Dynamics AX 2012. Оригинал статьи доступен по ссылке.

 

Акция "Тест-драйв Сопровождения"

Попробуй сопровождение АХ до подписания договора!


Узнать подробнее

Другие записи в блоге

05.03.2020
Если у вас уже есть опыт разработки Dynamics 365 for Finance and Operations, вы, скорее всего, знакомы с настройкой системы сборки. Если нет, вам следует начать с официальной документации.
01.03.2020
В этом ролике Айрат рассказывает, как писать extensible (расширяемый) код Dynamics 365 FO.
25.02.2020
В апреле 2020 года Microsoft запустит новое обновление платформы (Platform Update 33) для систем Dynamics 365 for Finance. Обновление доступно в качестве пререлиза в феврале, в марте появится...

Подпишитесь на блог

Все интересные статьи нашего блога на Вашем почтовом ящике!


Подписка

Служба контроля качества сервиса

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


Письмо директору