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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.01.2004, 13:12   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,652 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Количество строк в Query
Существет ли какой-либо еще способ подсчитать количество строк в Query (несколько таблиц-источников), кроме тупого сканирования всех записей по while (qr.next)?

Дело в том, что это относительно медленный процесс. У меня получилось примерно 500 строк в секунду.

Если другого способа нет, то можно хотя бы ускорить процесс сканирования именно с целью подсчета количества строк?

PS: Объект SysQuery смотрел. Там подсчет именно через сканирование по while (qr.next)
Старый 25.04.2011, 16:43   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,652 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Похоже, никто не взял на себя смелость намекнуть ребятам из Microsoft, что метод подсчета количества строк в Query, если количество источников данных больше одного "немного" не правильный .

В Ax2009 они наступили на те же "грабли" в методе SysQuery.countPrim(). На первый взгляд, решение для Ax3.0 приведенное по ссылке выше вполне подходит и для Ax2009.
Старый 20.09.2011, 14:47   #3  
SHiSHok is offline
SHiSHok
Участник
Аватар для SHiSHok
Дети Юза
 
219 / 103 (4) +++++
Регистрация: 28.07.2005
Адрес: Донецк
Немного пофиксил код для запросов с группировкой: не правильно возвращает 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   #4  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от 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
}
Правильно ли я понял, что убрав из условия зачистку Order будет все работать нормально, как в квери с группировкой, так и без неё?
Старый 19.06.2014, 01:03   #5  
wojzeh is offline
wojzeh
Участник
Аватар для wojzeh
Соотечественники
 
672 / 512 (19) +++++++
Регистрация: 27.04.2006
Адрес: Montreal
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   #6  
IKA is offline
IKA
Участник
 
359 / 65 (3) ++++
Регистрация: 15.03.2006
В Ax2012 R2 существует queryRun::getQueryRowCount(query, maxInt());
Кто-нибудь производительность проверял?
Теги
count, query, баг, количество, ошибка, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как программно узнать количество промаркированных строк в гриде? Jackally DAX: Программирование 12 24.12.2007 17:16
Количество строк в Grid Eland DAX: Программирование 3 10.11.2006 15:03
Предельное количество строк в Report Владимир Максимов DAX: Программирование 1 22.12.2005 15:02
Количество строк на страницу Berkoff DAX: Программирование 2 26.10.2004 10:30
Как подсчитать количество строк в отчете ATimTim DAX: Программирование 2 21.09.2004 13:44

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:35.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.