20.05.2008, 14:45 | #1 |
Участник
|
Distinct в QueryBuildDataSource
Подскажите как с помощью QueryBuildDataSource реализовать запрос типа:
SELECT DISTINCT * FROM table |
|
20.05.2008, 14:57 | #2 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |
20.05.2008, 14:58 | #3 |
MCITP
|
смотрите в эту сторону
qbds.SortField(<Field>); qbds.orderMode(orderMode::GroupBy); получите запрос select Field from ... group by Field. в чистом виде select distinct Field from ... в Аксапте вы не получите
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
20.05.2008, 15:26 | #4 |
----------------
|
Для того кому ОЧЕНЬ нужен distinct можно использовать notexists.
select t1 notexists join t2 where t2.Field1 == t1.Field1 && t2.Field2 == t1.Field2 && t2.RecId < t1.RecId |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
20.05.2008, 16:35 | #5 |
MCITP
|
по ситуации надо смотреть...
select Field from table group by Field - это именно аналог select distinct Field from table всё-таки. Один из возможных плюсов - возможность использовать индекс (если есть) по Field, для быстрой группировки, например, а вот в случае select t1 notexists join t2 where t2.Field1 == t1.Field1 && t2.Field2 == t1.Field2 && t2.RecId < t1.RecId поимеете полный перебор по таблице и ещё плюс доступ по индексу (если есть)... В общем, нужно учитывать специфику запроса
__________________
Zhirenkov Vitaly |
|
20.05.2008, 16:54 | #6 |
Участник
|
Вопрос к Wamr - а почему именно меньше (t2.RecId < t1.RecId) Я бы ожидал увидеть !=
|
|
20.05.2008, 17:02 | #7 |
MCITP
|
Цитата:
А так вы задаёте определённую детерминированность и берёте строчку с наименьшим рекАйДи из всех... (извините, что не Вамр :-х)
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
21.05.2008, 00:35 | #8 |
----------------
|
полностью согласен со всеми замечаниями Виталия, именно эти недостатки и прятались за словом ОЧЕНЬ
|
|
31.07.2009, 14:28 | #9 |
Участник
|
И тут становиться такой вопрос: select count(OrderAccount) from purchTable group by OrderAccount; не вернет количество - поле строковое.... Вернет номер первого.
Для этих целей можно конечно написать так: Query query = new Query(); QueryBuildDataSource purchTable_qbds = query.addDataSource(tableNum(PurchTable)); QueryRun queryRun; ; purchTable_qbds.addSelectionField(fieldNum(Common, RecId), SelectionField::Count); purchTable_qbds.addSortField(fieldNum(PurchTable, OrderAccount)); purchTable_qbds.orderMode(OrderMode::GroupBy); queryRun = new QueryRun(query); info(strfmt('%1', SysQuery::countTotal(queryRun))); но, увы, это тот же перебор....
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
03.08.2009, 16:16 | #10 |
Участник
|
Попрака к последнему посту: info(strfmt('%1', SysQuery::countTotal(queryRun))); вернет неверный результат, так как countTotal суммирует RecID, что приведет к полной ерунде
Поэтому лучше либо перебирать while(queryRun.next()) либо исхитряться: X++: select count(RecId) from vendTable exists join purchTable where purchTable.OrderAccount == vendTable.AccountNum
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
03.08.2009, 18:12 | #11 |
MCITP
|
plumbum, а в чём заключается ваш вопрос, если не секрет?
Вы этого хотите достичь? (изьясняетесь уж больно непонятно...) X++: purchTable purchTable; ; while select count(recid) from purchTable group by OrderAccount { info(purchTable.OrderAccount); info(int2str(purchTable.RecId)); } X++: SELECT COUNT(A.RECID),A.ORDERACCOUNT FROM PURCHTABLE A WHERE (DATAAREAID=?) GROUP BY A.ORDERACCOUNT ORDER BY A.ORDERACCOUNT
__________________
Zhirenkov Vitaly |
|
05.08.2009, 11:59 | #12 |
Участник
|
Нет, в общем-то я хотел констатировать факт, что если суммировать по тому же полю, по которому группировать, то желаемого результата не будет.
Задача была выбрать количество разных поставщиков, для которых созданы закупки...
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|
05.08.2009, 12:50 | #13 |
MCITP
|
Цитата:
Вы пытались сделать вот такой запрос, вот выполните его и посмотрите, что выдаёт нормальный SQL, который вы хотели построить: X++: Select orderaccount, count(orderaccount), count(*) From Purchtable Group By orderaccount Вам же нужен один из следующих запросов: X++: Select Count ( Distinct Orderaccount ) From Purchtable / Select Count ( * ) From ( Select Orderaccount From Purchtable Group By Orderaccount ) Как вариант - воспользуйтесь direct sql. Примерный код для 3-ки (тестировал на Оракле): X++: static void Job22(Args _args) { dictTable dictTable = new DictTable(tableNum(PurchTable)); Connection con = new Connection(); ResultSet rs; Statement stmt; str sql; str dataareaid; int cnt; ; if (dictTable.dataPrCompany()) { DataAreaId = curext(); if ( SqlSystem::databaseBackendId() == DatabaseId::Oracle ) dataareaid = strFmt(new SqlSystem().monocaseFmt(),dataareaid); } sql = strFmt("Select Count ( Distinct %1 ) From %2 where %3 = \'%4\'", dictTable.fieldName(fieldnum(PurchTable, OrderAccount), DBBackend::SQL), dictTable.name(DbBackend::SQL), dictTable.fieldName(fieldnum(PurchTable, DataAreaId), DBBackend::SQL), DataAreaId); info(sql); stmt = con.createStatement(); rs = stmt.executeQuery(sql); if (rs.next()) { cnt = rs.getInt(1); } info(int2str(cnt)); }
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: plumbum (1). |
05.08.2009, 12:56 | #14 |
Участник
|
Спасибо, Виталий!
Но я бы предпочел workaround, как в случае с подключением справочника поставщиков. Все таки необходимо было решить локальную задачу. 2 kashperuk: А предвидиться в 6.0 какие-то похожие изменения в языке запросов AX?
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! |
|