17.07.2013, 01:20 | #1 |
Сенбернар
|
Очередная бороьба с Query() (DAX2009)
DAX 2009, 5.0.1500.2985 (Kernel & Appl) EE RU HRP 5.0.1500.2116.1
Развлекаемся.. PHP код:
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)) Убираем комментарий с 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 |
Роман Долгополов (RDOL)
|
попробуйте после каждого qbds.joinMode() добавить еще и qbds.fetchMode(QueryFetchMode::One2One).Да и вообще добавлять эту конструкцию стоит всегда и везде по умолчанию.
очень похоже что ядро решило разложить запрос на вложенные друг в друга отдельные запросы,а режим по умолчанию QueryFetchMode::One2Many это не запрещает Последний раз редактировалось db; 17.07.2013 в 02:28. |
|
|
За это сообщение автора поблагодарили: RVS (2). |
17.07.2013, 09:24 | #3 |
Участник
|
Совет:
не занимайтесь программированием запросов с нуля. тупо создайте объект в AOT. укажите в объекте AOT неободимые свойства и параметры. затем вместо кучи кода по созданию Query сделайте просто X++: Query q = new Query(querystr(mySuperQuery)); так и вопросов будет меньше, и запросы будет создавать намного легче, и поддерживать на порядок проще. |
|
|
За это сообщение автора поблагодарили: RVS (2), MikeR (2), sashanka (1). |
17.07.2013, 23:07 | #4 |
Сенбернар
|
Спасибо, помогло
__________________
Best Regards, Roman |
|