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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.07.2013, 01:20   #1  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Очередная бороьба с Query() (DAX2009)
DAX 2009, 5.0.1500.2985 (Kernel & Appl) EE RU HRP 5.0.1500.2116.1

Развлекаемся..

PHP код:
void initQuery()
{
    
Query                   q = new Query();
    
QueryBuildRange         qbr;
    
QueryBuildDataSource    qbds;
    
QueryBuildDataSource    qbdsActivities;

    ;

    
qbdsActivities    q.addDataSource(tablenum(smmActivities));

    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesN_ProjId));
    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesStartDateTime));
    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesEndDateTime));
    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesN_ItemId));
    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesN_Dimension));
    
qbdsActivities.addSelectionField(fieldnum(smmActivitiesN_InventDimId));

    
qbdsActivities.orderMode(OrderMode::GroupBy);

    
// TODO RVS : Проект в smmActivities пустой, надо извлекать из smmActivityParentLinkTable ?
    // qbdsActivities.addRange(fieldnum(smmActivities, N_ProjId));

    
qbr     qbdsActivities.addRange(fieldnum(smmActivitiesN_ActivityStatus));
    
qbr.value(QueryValue(N_ActivityStatus::Complited));
    
qbr.status(RangeStatus::Hidden);

    
qbr qbdsActivities.addRange(fieldnum(smmActivitiesEndDateTime));
    
qbr.status(RangeStatus::Hidden);

    
qbds    qbdsActivities.addDataSource(tablenum(smmActivityParentLinkTable), 'WrkCtrlLink');

    
qbds.relations(true);
    
qbds.joinMode(JoinMode::InnerJoin);

    
qbr qbds.addRange(fieldnum(smmActivityParentLinkTableParentType));
    
qbr.value(QueryValue(smmActivityParentType::N_WrkCtr));
    
qbr.status(RangeStatus::Hidden);

    
qbds    qbds.addDataSource(tablenum(wrkCtrTable));

    
qbds.orderMode(OrderMode::GroupBy);

    
qbds.addLink(fieldnum(smmActivityParentLinkTableRefRecId), fieldnum(wrkCtrTableRecId));
    
qbds.joinMode(JoinMode::InnerJoin);

    
qbds.addSelectionField(fieldnum(wrkCtrTableWrkCtrId));

    
qbr qbds.addRange(fieldnum(wrkCtrTableWrkCtrType));
    
qbr.value(QueryValue(WrkCtrType::Personnel));
    
qbr.status(RangeStatus::Hidden);

    
/*
    // TODO RVS : Проверяем возможность прицепить источник данных "не в лесенку"
    qbds    = qbdsActivities.addDataSource(tablenum(smmActivityParentLinkTable), 'ProjLink');

    qbds.relations(true);
    qbds.joinMode(JoinMode::InnerJoin);

    qbr = qbds.addRange(fieldnum(smmActivityParentLinkTable, ParentType));
    qbr.value(QueryValue(smmActivityParentType::Project));

    qbds    = qbds.addDataSource(tablenum(ProjTable));

    qbds.orderMode(OrderMode::GroupBy);

    qbds.addSelectionField(fieldnum(ProjTable, ProjId));

    qbds.orderMode(OrderMode::GroupBy);

    qbds.addLink(fieldnum(smmActivityParentLinkTable, RefRecId), fieldnum(ProjTable, RecId));
    qbds.joinMode(JoinMode::InnerJoin);

    qbds.addSelectionField(fieldnum(ProjTable, ProjId));

    qbr = qbds.addRange(fieldnum(ProjTable, ProjId));
    qbr.status(RangeStatus::Hidden);
    */
    // -->>
    
    
info(q.dataSourceNo(1).toString());

    
queryRun = new SysQueryRun(q);

Имеем запрос :

X++:
SELECT FIRSTFAST N_ProjId, StartDateTime, EndDateTime, N_ItemId, N_Dimension, N_InventDimId FROM smmActivities WHERE ((N_ActivityStatus = 6)) JOIN FIRSTFAST * FROM smmActivityParentLinkTable WHERE smmActivities.ActivityNumber = smmActivityParentLinkTable.ActivityNumber AND ((ParentType = 18)) JOIN FIRSTFAST WrkCtrId FROM WrkCtrTable WHERE smmActivityParentLinkTable.RefRecId = WrkCtrTable.RecId AND ((WrkCtrType = 1))
... что неплохо, только хочется еще группировку по Проекту, который тоже приделан к smmActivity через smmActivityParentLinkTable ..

Убираем комментарий с TODO в коде :

X++:
void initQuery()
{
    Query                   q = new Query();
    QueryBuildRange         qbr;
    QueryBuildDataSource    qbds;
    QueryBuildDataSource    qbdsActivities;

    ;

    qbdsActivities    = q.addDataSource(tablenum(smmActivities));

    qbdsActivities.addSelectionField(fieldnum(smmActivities, N_ProjId));
    qbdsActivities.addSelectionField(fieldnum(smmActivities, StartDateTime));
    qbdsActivities.addSelectionField(fieldnum(smmActivities, EndDateTime));
    qbdsActivities.addSelectionField(fieldnum(smmActivities, N_ItemId));
    qbdsActivities.addSelectionField(fieldnum(smmActivities, N_Dimension));
    qbdsActivities.addSelectionField(fieldnum(smmActivities, N_InventDimId));

    qbdsActivities.orderMode(OrderMode::GroupBy);

    // TODO RVS : Проект в smmActivities пустой, надо извлекать из smmActivityParentLinkTable ?
    // qbdsActivities.addRange(fieldnum(smmActivities, N_ProjId));

    qbr     = qbdsActivities.addRange(fieldnum(smmActivities, N_ActivityStatus));
    qbr.value(QueryValue(N_ActivityStatus::Complited));
    qbr.status(RangeStatus::Hidden);

    qbr = qbdsActivities.addRange(fieldnum(smmActivities, EndDateTime));
    qbr.status(RangeStatus::Hidden);

    qbds    = qbdsActivities.addDataSource(tablenum(smmActivityParentLinkTable), 'WrkCtrlLink');

    qbds.relations(true);
    qbds.joinMode(JoinMode::InnerJoin);

    qbr = qbds.addRange(fieldnum(smmActivityParentLinkTable, ParentType));
    qbr.value(QueryValue(smmActivityParentType::N_WrkCtr));
    qbr.status(RangeStatus::Hidden);

    qbds    = qbds.addDataSource(tablenum(wrkCtrTable));

    qbds.orderMode(OrderMode::GroupBy);

    qbds.addLink(fieldnum(smmActivityParentLinkTable, RefRecId), fieldnum(wrkCtrTable, RecId));
    qbds.joinMode(JoinMode::InnerJoin);

    qbds.addSelectionField(fieldnum(wrkCtrTable, WrkCtrId));

    qbr = qbds.addRange(fieldnum(wrkCtrTable, WrkCtrType));
    qbr.value(QueryValue(WrkCtrType::Personnel));
    qbr.status(RangeStatus::Hidden);

    // TODO RVS : Проверяем возможность прицепить источник данных "не в лесенку"
    qbds    = qbdsActivities.addDataSource(tablenum(smmActivityParentLinkTable), 'ProjLink');

    qbds.relations(true);
    qbds.joinMode(JoinMode::InnerJoin);

    qbr = qbds.addRange(fieldnum(smmActivityParentLinkTable, ParentType));
    qbr.value(QueryValue(smmActivityParentType::Project));

    qbds    = qbds.addDataSource(tablenum(ProjTable));

    qbds.orderMode(OrderMode::GroupBy);

    qbds.addSelectionField(fieldnum(ProjTable, ProjId));

    qbds.orderMode(OrderMode::GroupBy);

    qbds.addLink(fieldnum(smmActivityParentLinkTable, RefRecId), fieldnum(ProjTable, RecId));
    qbds.joinMode(JoinMode::InnerJoin);

    qbds.addSelectionField(fieldnum(ProjTable, ProjId));

    qbr = qbds.addRange(fieldnum(ProjTable, ProjId));
    qbr.status(RangeStatus::Hidden);
    // -->>
    
    info(q.dataSourceNo(1).toString());

    queryRun = new SysQueryRun(q);
}
, имеем в итоге :

X++:
SELECT FIRSTFAST N_ProjId, StartDateTime, EndDateTime, N_ItemId, N_Dimension, N_InventDimId FROM smmActivities WHERE ((N_ActivityStatus = 6))
===

Что-то я вообще уже ничего не понимаю..

PS : Понятно, что это утверждение, а не вопрос.

Чего хотелось :

Построить запрос типа :

smmActivity
-->> smmActivityParentLinkTable (фильтр по связям с Рабочими центрами, группировка)
-->> smmActivityParentLinkTable (фильтр по связям с Проектами, группировка)

Собственно, и все.

Вопрос :

- это можно вообще? В Query() ? В Скул-е - можно, я знаю..
- если Да - что я делаю не так?
__________________
Best Regards,
Roman

Последний раз редактировалось RVS; 17.07.2013 в 01:57.
Старый 17.07.2013, 02:25   #2  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
попробуйте после каждого qbds.joinMode() добавить еще и qbds.fetchMode(QueryFetchMode::One2One).Да и вообще добавлять эту конструкцию стоит всегда и везде по умолчанию.

очень похоже что ядро решило разложить запрос на вложенные друг в друга отдельные запросы,а режим по умолчанию QueryFetchMode::One2Many это не запрещает

Последний раз редактировалось db; 17.07.2013 в 02:28.
За это сообщение автора поблагодарили: RVS (2).
Старый 17.07.2013, 23:07   #3  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Цитата:
Сообщение от db Посмотреть сообщение
попробуйте после каждого qbds.joinMode() добавить еще и qbds.fetchMode(QueryFetchMode::One2One).Да и вообще добавлять эту конструкцию стоит всегда и везде по умолчанию
Спасибо, помогло
__________________
Best Regards,
Roman
Старый 17.07.2013, 09:24   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от RVS Посмотреть сообщение
Чего хотелось :
Совет:
не занимайтесь программированием запросов с нуля.
тупо создайте объект в AOT. укажите в объекте AOT неободимые свойства и параметры.
затем вместо кучи кода по созданию Query сделайте просто
X++:
Query q = new Query(querystr(mySuperQuery));
в коде только модифицируйте те критерии, которые действительно нужно менять.
так и вопросов будет меньше, и запросы будет создавать намного легче, и поддерживать на порядок проще.
За это сообщение автора поблагодарили: RVS (2), MikeR (2), sashanka (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ax-erp: How to Set the Query Range on a SSRS Report Blog bot DAX Blogs 0 18.10.2012 19:11
emeadaxsupport: Calling the Query Service Blog bot DAX Blogs 0 18.02.2012 01:13
AIF: OData Query Service Blog bot DAX Blogs 0 24.08.2011 09:11
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Dynamics AX Geek: Using query() Blog bot DAX Blogs 0 04.05.2009 14:05

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

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

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