20.01.2004, 13:12 | #1 |
Участник
|
Количество строк в Query
Существет ли какой-либо еще способ подсчитать количество строк в Query (несколько таблиц-источников), кроме тупого сканирования всех записей по while (qr.next)?
Дело в том, что это относительно медленный процесс. У меня получилось примерно 500 строк в секунду. Если другого способа нет, то можно хотя бы ускорить процесс сканирования именно с целью подсчета количества строк? PS: Объект SysQuery смотрел. Там подсчет именно через сканирование по while (qr.next) |
|
20.01.2004, 13:45 | #2 |
Участник
|
да, конечно.
SysQuery::countTotal(myQuery) Спасибо за совет на этом форуме Евгению Глазову. |
|
|
За это сообщение автора поблагодарили: evv (1). |
20.01.2004, 14:16 | #3 |
Участник
|
Я же написал, что смотрел код объекта SysQuery. В частности SysQuery::CountPrim который собственно и выполняет расчет количества. Вот фрагмент его кода:
PHP код:
|
|
20.01.2004, 14:31 | #4 |
Участник
|
Цитата:
Изначально опубликовано Владимир Максимов
Т.е. это все тот же "тупой" перебор строк. по сути дела в query остаются только условия, а вместо полей ставляется sum(recID). А перебор нужен, если в query были группировки. В общем, оттрасируйте и посмотртите тексты запросов. |
|
20.01.2004, 14:45 | #5 |
----------------
|
Count(RecId)
Есть такое условие в CountPrim
PHP код:
Могу предложить такой вариант: PHP код:
|
|
|
За это сообщение автора поблагодарили: alex55 (1). |
20.01.2004, 14:56 | #6 |
Administrator
|
Да, Wamr совершенно прав, есть там такое место. Свои соображения по этому поводу изложил вот здесь: http://forum.mazzy.ru/index.php?show...indpost&p=1094 Не хочется заниматься копированием.
Wamr, Ваш метод также не лишен недостатка, связанного с тем, что в Query может быть GroupBy. Осмелюсь предположить, что он не работает (вернее, работает не совсем правильно), например, в форме InventOnhandItem (Запасы в наличии).
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
20.01.2004, 15:02 | #7 |
----------------
|
Цитата:
Осмелюсь предположить, что он не работает (вернее, работает не совсем правильно), например, в форме InventOnhandItem (Запасы в наличии).
По поводу группировки Осмелюсь предположить, что если в запросе есть Group by ItemId, то человека будет интересовать не количество записей попавших в группировку, а количество ItemId, т.е. записей после группировки. Вроде, ничего кроме перебора тут не поможет (countLoops). |
|
|
За это сообщение автора поблагодарили: jeky (2). |
20.01.2004, 15:11 | #8 |
Administrator
|
Ну, в общем-то так оно и есть. По ссылке я написал, как объединить countTotal и countLoops в один метод.
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
|
За это сообщение автора поблагодарили: jeky (2). |
20.01.2004, 16:19 | #9 |
Участник
|
Wamr
Большое спасибо. После адаптации кода нормально пошел. В моем случае Query не содержит группировок. PS: Как же не хватает нормальной документации! Буквально на "ощупь" код пишу. |
|
20.01.2004, 20:20 | #10 |
Участник
|
maxim, wamr, спасибо за увлекательную дискуссию.
у меня просьба, как только выйдете на обоюдоприемлимый результат, давайте его в FAQ поместим? |
|
09.03.2005, 14:38 | #11 |
Участник
|
Может кто реализовал нормальный вариант подсчета количества???
|
|
09.03.2005, 14:51 | #12 |
Участник
|
Цитата:
Изначально опубликовано velk
Может кто реализовал нормальный вариант подсчета количества??? Идея заключается в том, что перебираются ВСЕ DataSource (а не только первый, как в оргинале). И во всех устанавливается подсчет Count(*). Отлично работает. |
|
09.03.2005, 14:52 | #13 |
Administrator
|
См. обсуждение по ссылке на Forum.Mazzy.RU
__________________
Not registered yet? Register here! Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me |
|
09.03.2005, 14:59 | #14 |
Участник
|
|
|
20.05.2010, 10:13 | #15 |
Участник
|
по ссылке
http://forum.mazzy.ru/index.php?showtopic=284&st=20 нашел код метода countPrim для 3.0 Он же подойдет для 4.0 ? |
|
25.04.2011, 16:43 | #16 |
Участник
|
Похоже, никто не взял на себя смелость намекнуть ребятам из Microsoft, что метод подсчета количества строк в Query, если количество источников данных больше одного "немного" не правильный .
В Ax2009 они наступили на те же "грабли" в методе SysQuery.countPrim(). На первый взгляд, решение для Ax3.0 приведенное по ссылке выше вполне подходит и для Ax2009. |
|
20.09.2011, 14:47 | #17 |
Участник
|
Немного пофиксил код для запросов с группировкой: не правильно возвращает loops если запрос с группировкой возвращает 1 строку (например query такого содержания: select ItemGroupId from inventTable group by ItemGroupId where ItemGroupId=='const')
X++: private server static container countPrim(container _queryPack) { ... Integer iGrp; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); for (k = 1; k <= countQuery.dataSourceCount();k++) { qbds = countQuery.dataSourceNo(k); qbds.update(false); iGrp +=(qbds.orderMode()==orderMode::GroupBy); // SHiSHok.fix //qbds.sortClear(); // Вот этот метод сильно мешал! qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbfl.addField(FieldNum(Common,recId),SelectionField::COUNT); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.recId; loops++; } // return [counter,((loops > 1)? loops : counter)]; return [counter,(iGrp ? loops : counter)]; // SHiSHok.fix }
__________________
--- SHiSHok |
|
|
За это сообщение автора поблагодарили: mazzy (5), Ace of Database (5), wojzeh (1). |
15.10.2013, 10:18 | #18 |
Участник
|
Цитата:
Сообщение от SHiSHok
Немного пофиксил код для запросов с группировкой: не правильно возвращает loops если запрос с группировкой возвращает 1 строку (например query такого содержания: select ItemGroupId from inventTable group by ItemGroupId where ItemGroupId=='const')
X++: private server static container countPrim(container _queryPack) { ... Integer iGrp; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); for (k = 1; k <= countQuery.dataSourceCount();k++) { qbds = countQuery.dataSourceNo(k); qbds.update(false); iGrp +=(qbds.orderMode()==orderMode::GroupBy); // SHiSHok.fix //qbds.sortClear(); // Вот этот метод сильно мешал! qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbfl.addField(FieldNum(Common,recId),SelectionField::COUNT); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.recId; loops++; } // return [counter,((loops > 1)? loops : counter)]; return [counter,(iGrp ? loops : counter)]; // SHiSHok.fix } |
|
19.06.2014, 01:03 | #19 |
Участник
|
X++: private server static container ountPrim(container _queryPack) { Query countQuery; QueryRun countQueryRun; QueryBuildDataSource qbds; QueryBuildFieldList qbfl; Common common; Integer counter; Integer loops; Integer tmxGroupNumber; Integer tmxDataSourceNumber; ; countQueryRun = new QueryRun(_queryPack); countQuery = countQueryRun.query(); tmxGroupNumber = countQuery.groupByFieldCount(); //<-- this guarantees number of groupings for (tmxDataSourceNumber = 1; tmxDataSourceNumber <= countQuery.dataSourceCount(); tmxDataSourceNumber++) { qbds = countQuery.dataSourceNo(tmxDataSourceNumber); qbds.update(false); //qbds.sortClear(); //tmxGroupNumber +=(qbds.orderMode()==orderMode::GroupBy); qbfl = qbds.fields(); qbfl.dynamic(false); qbfl.clearFieldList(); qbds.addSelectionField(fieldNum(Common,RecId),SelectionField::Count); } countQueryRun = new QueryRun(countQuery); while (countQueryRun.next()) { common = countQueryRun.getNo(1); counter += common.RecId; loops++; } //return [counter,loops]; return [counter,(tmxGroupNumber ? loops : counter)]; }
__________________
Felix nihil admirari Последний раз редактировалось wojzeh; 19.06.2014 в 01:06. |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
11.08.2014, 18:27 | #20 |
Участник
|
В Ax2012 R2 существует queryRun::getQueryRowCount(query, maxInt());
Кто-нибудь производительность проверял? |
|