|  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 Пришел, уведел.... отойди, дай другому увидеть! | 
|  |