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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.06.2016, 14:50   #1  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Проверка структуры счета на использование аналитики
Доброго времени суток!

AX 2012

Необходимо проверить применима ли аналитика для конкретного счета, который в структуре счетов задан как ХХХ*.

На данный момент реализован класс который выгружает отчет плана счетов с перечнем допустимых аналитик (включая счета которые заданы в границах ХХХ-ХХХ), однако счета ХХХ* он не определяет. Помогите разобраться...

Код существующего класса:
X++:
class AccountDimension
{
}

public static void main(Args arg)
{
    DimensionAttribute dimensionAttribute;
    MainAccount acc;

    SysExcelApplication application;
    SysExcelWorkbooks workbooks;
    SysExcelWorkbook workbook;
    SysExcelWorksheets worksheets;
    SysExcelWorksheet worksheet;
    SysExcelCells cells;
    SysExcelCell cell;
    SysExcelCell cell1;
    SysExcelFont font;

    str Dimension;
    RecId Hierarchy;

    int row;
    int cel;

    application = SysExcelApplication::construct();
    workbooks = application.workbooks();
    workbook = workbooks.add();
    worksheets = workbook.worksheets();
    worksheet = worksheets.itemFromNum(1);
    cells = worksheet.cells();
    cells.range('A:A').numberFormat('@');


    startLengthyOperation();
    // Setting Header values
    cel = 2;
    while select dimensionAttribute
        where !(dimensionAttribute.Name like '*SystemGen*')
    {
        cel++;
        cell = cells.item(1, cel);
        cell.value(dimensionAttribute.name);
        font = cell.font();
        font.bold(true);
    }

    cel = 2;
    row = 1;
    while select acc order by MainAccountId
    {
        row++;
        cell = cells.item(row, 1);
        cell.value(acc.MainAccountId);
        font = cell.font();
        font.bold(true);
        cell = cells.item(row, 2);
        cell.value(acc.Name);
        font = cell.font();
        font.bold(true);

        Hierarchy = AccountDimension::getHierarchy(acc.MainAccountId);

        while select dimensionAttribute
            where !(dimensionAttribute.Name like '*SystemGen*')
        {
            cel++;
            cell1 = cells.item(row, cel);

            Dimension = dimensionAttribute.Name;

            if(AccountDimension::CheckChart(Hierarchy, Dimension))
                cell1.value('+');
        }
        cel = 2;
    }
    endLengthyOperation();
    application.visible(true);
}

private static server RecId getHierarchy(str _account)
{
    Query q;
    QueryRun queryRun;
    QueryBuildDataSource qbDCN;
    QueryBuildDataSource qbDHL;
    QueryBuildDataSource qbDCC;
    QueryBuildDataSource qbDH;
    QueryBuildDataSource qbLS;
    QueryBuildDataSource qbL;

    DimensionHierarchy dh;

    q = new Query();

    qbDCN = q.addDataSource(tablenum(DimensionConstraintNode));
    qbDCN.relations(false);

    qbDHL = qbDCN.addDataSource(tablenum(DimensionHierarchyLevel));
    qbDHL.relations(false);
    qbDHL.addLink(fieldNum(DimensionConstraintNode, DimensionHierarchyLevel),fieldNum(DimensionHierarchyLevel, RecId));
    qbDHL.joinMode(JoinMode::InnerJoin);
    qbDHL.fetchMode(QueryFetchMode::One2One);

    qbDH = qbDHL.addDataSource(tablenum(DimensionHierarchy));
    qbDH.relations(false);
    qbDH.addLink(fieldNum(DimensionHierarchyLevel, DimensionHierarchy),fieldNum(DimensionHierarchy, RecId));
    qbDH.joinMode(JoinMode::InnerJoin);
    qbDH.fetchMode(QueryFetchMode::One2One);

    qbLS = qbDH.addDataSource(tablenum(LedgerStructure));
    qbLS.relations(false);
    qbLS.addLink(fieldNum(DimensionHierarchy,RecId),fieldNum(LedgerStructure,DimensionHierarchy));
    qbLS.joinMode(JoinMode::InnerJoin);
    qbLS.fetchMode(QueryFetchMode::One2One);

    qbL = qbLS.addDataSource(tablenum(Ledger));
    qbL.relations(false);
    qbL.addLink(fieldNum(LedgerStructure,Ledger),fieldNum(Ledger,RecId));
    qbL.joinMode(JoinMode::InnerJoin);
    qbL.fetchMode(QueryFetchMode::One2One);

    qbDCC = qbDCN.addDataSource(tablenum(DimensionConstraintNodeCriteria));
    qbDCC.relations(false);
    qbDCC.addLink(fieldNum(DimensionConstraintNode,RecId),fieldNum(DimensionConstraintNodeCriteria,DimensionConstraintNode));
    qbDCC.joinMode(JoinMode::InnerJoin);
    qbDCC.fetchMode(QueryFetchMode::One2One);
    
    qbDCC.addRange(fieldnum(DimensionConstraintNodeCriteria, RangeFrom)).value('<'+SysQuery::value(_account));
    qbDCC.addRange(fieldnum(DimensionConstraintNodeCriteria, RangeFrom)).value(SysQuery::value(_account));
    qbDCC.addRange(fieldnum(DimensionConstraintNodeCriteria, RangeTo)).value('>'+SysQuery::value(_account));
    qbDCC.addRange(fieldnum(DimensionConstraintNodeCriteria, RangeTo)).value(SysQuery::value(_account));

    qbL.addRange(fieldnum(Ledger, Name)).value(SysQuery::value(curext()));
    queryRun = new QueryRun(q);

    if(queryRun.next())
    {
        dh = queryRun.get(tableNum(DimensionHierarchy));
        return dh.RecId;
    }
    else
        return 0;
}

private static server boolean CheckChart(RecId _account, str _dimension)
{
    Query q;
    QueryRun queryRun;
    QueryBuildDataSource qbDHL;
    QueryBuildDataSource qbDA;
    QueryBuildDataSource qDR;

    q = new Query();

    qDR = q.addDataSource(tablenum(DimensionRule));
    qDR.relations(false);

    qbDHL = qDR.addDataSource(tablenum(DimensionHierarchyLevel));
    qbDHL.relations(false);
    qbDHL.addLink(fieldNum(DimensionRule, AccountStructure),fieldNum(DimensionHierarchyLevel, DimensionHierarchy));
    qbDHL.joinMode(JoinMode::InnerJoin);
    qbDHL.fetchMode(QueryFetchMode::One2One);

    qbDA = qbDHL.addDataSource(tablenum(DimensionAttribute));
    qbDA.relations(false);
    qbDA.addLink(fieldNum(DimensionHierarchyLevel, DimensionAttribute),fieldnum(DimensionAttribute, RecId));
    qbDA.joinMode(JoinMode::InnerJoin);
    qbDA.fetchMode(QueryFetchMode::One2One);

    qDR.addRange(fieldnum(DimensionRule, AccountStructure)).value(SysQuery::value(_account));
    qbDA.addRange(fieldnum(DimensionAttribute, Name)).value(SysQuery::value(_dimension));
    queryRun = new QueryRun(q);

    if(queryRun.next())
    {
        return true;
    }
    else
        return AccountDimension::CheckRules(_account, _dimension);
}

private static server boolean CheckRules(RecId _account, str _dimension)
{
    Query q;
    QueryRun queryRun;
    QueryBuildDataSource qbDHL;
    QueryBuildDataSource qbDRAH;
    QueryBuildDataSource qbDA;
    QueryBuildDataSource qDR;

    q = new Query();

    qDR = q.addDataSource(tablenum(DimensionRule));
    qDR.relations(false);

    qbDRAH = qDR.addDataSource(tablenum(DimensionRuleAppliedHierarchy));
    qbDRAH.relations(false);
    qbDRAH.addLink(fieldNum(DimensionRule, RecId),fieldNum(DimensionRuleAppliedHierarchy, DimensionRule));
    qbDRAH.joinMode(JoinMode::InnerJoin);
    qbDRAH.fetchMode(QueryFetchMode::One2One);

    qbDHL = qbDRAH.addDataSource(tablenum(DimensionHierarchyLevel));
    qbDHL.relations(false);
    qbDHL.addLink(fieldNum(DimensionRuleAppliedHierarchy, DimensionHierarchy),fieldNum(DimensionHierarchyLevel, DimensionHierarchy));
    qbDHL.joinMode(JoinMode::InnerJoin);
    qbDHL.fetchMode(QueryFetchMode::One2One);

    qbDA = qbDHL.addDataSource(tablenum(DimensionAttribute));
    qbDA.relations(false);
    qbDA.addLink(fieldNum(DimensionHierarchyLevel, DimensionAttribute),fieldnum(DimensionAttribute, RecId));
    qbDA.joinMode(JoinMode::InnerJoin);
    qbDA.fetchMode(QueryFetchMode::One2One);

    qDR.addRange(fieldnum(DimensionRule, AccountStructure)).value(SysQuery::value(_account));
    qbDA.addRange(fieldnum(DimensionAttribute, Name)).value(SysQuery::value(_dimension));
    queryRun = new QueryRun(q);

    if(queryRun.next())
    {
        return true;
    }
    else
        return false;
}

Последний раз редактировалось syl; 01.06.2016 в 14:52.
Старый 01.06.2016, 15:20   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
X++:
AccountDimension::getHierarchy(acc.MainAccountId);
Чем не устраивает использование DimensionHierarchy::getAccountStructure(acc.RecId)?
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: syl (1).
Старый 02.06.2016, 06:36   #3  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Цитата:
Сообщение от AndyD Посмотреть сообщение
Чем не устраивает использование DimensionHierarchy::getAccountStructure(acc.RecId)?
В принципе устраивает, но все равно находит не все аналитики. Походу проблема именно в методах проверки...

Последний раз редактировалось syl; 02.06.2016 в 06:53.
Старый 02.06.2016, 07:45   #4  
syl is offline
syl
Участник
Аватар для syl
 
236 / 21 (1) +++
Регистрация: 10.06.2015
Адрес: Киев
Задача решена, может кому будет нужен подобный отчет:
X++:
public static void main(Args arg)
{
    DimensionAttribute dimensionAttribute;
    MainAccount acc;

    SysExcelApplication application;
    SysExcelWorkbooks workbooks;
    SysExcelWorkbook workbook;
    SysExcelWorksheets worksheets;
    SysExcelWorksheet worksheet;
    SysExcelCells cells;
    SysExcelCell cell;
    SysExcelCell cell1;
    SysExcelFont font;

    str Dimension;
    RecId Hierarchy;

    int row;
    int cel;
    
    DimensionSetSegmentName Set;

    application = SysExcelApplication::construct();
    workbooks = application.workbooks();
    workbook = workbooks.add();
    worksheets = workbook.worksheets();
    worksheet = worksheets.itemFromNum(1);
    cells = worksheet.cells();
    cells.range('A:A').numberFormat('@');


    startLengthyOperation();
    // Setting Header values
    cel = 2;
    while select dimensionAttribute
        where !(dimensionAttribute.Name like '*SystemGen*')
    {
        cel++;
        cell = cells.item(1, cel);
        cell.value(dimensionAttribute.name);
        font = cell.font();
        font.bold(true);
    }

    cel = 2;
    row = 1;
    while select acc order by MainAccountId
    {
        row++;
        cell = cells.item(row, 1);
        cell.value(acc.MainAccountId);
        font = cell.font();
        font.bold(true);
        cell = cells.item(row, 2);
        cell.value(acc.Name);
        font = cell.font();
        font.bold(true);

        Hierarchy = DimensionHierarchy::getAccountStructure(acc.RecId);
        
        Set = DimensionHierarchyLevel::getDimensionHierarchyLevelNames(Hierarchy);
        
        while select dimensionAttribute
            where !(dimensionAttribute.Name like '*SystemGen*')
        {
            cel++;
            cell1 = cells.item(row, cel);

            Dimension = dimensionAttribute.Name;
            
            if(Set[1] == Dimension ||
            Set[2] == Dimension ||
            Set[3] == Dimension ||
            Set[4] == Dimension ||
            Set[5] == Dimension ||
            Set[6] == Dimension ||
            Set[7] == Dimension ||
            Set[8] == Dimension ||
            Set[9] == Dimension ||
            Set[10] == Dimension ||
            Set[11] == Dimension)
                cell1.value('+');
        }
        cel = 2;
    }
    endLengthyOperation();
    application.visible(true);
}
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Статьи бюджета P&L как фин аналитики в продаже товара-различные значения для счета ГК дохода и себестоимости Aquarius DAX: Функционал 6 19.05.2016 16:04
Ax2012 Настройка структуры счета - кнопка Отношения Arahnid DAX: Функционал 1 06.07.2015 20:57
Применить предоплату: Комбинация XXX- недопустима для структуры счета kart DAX: Функционал 8 21.02.2013 21:53
Использование складской аналитики "Ячейка" Елена Сысовская DAX: Функционал 3 25.03.2003 20:27
Использование аналитики vs. возможные проблемы Boris DAX: Функционал 23 02.12.2002 12:07

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

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

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