Показать сообщение отдельно
Старый 06.05.2008, 18:49   #2  
gl00mie_imported is offline
gl00mie_imported
Участник
 
17 / 10 (1) +
Регистрация: 18.01.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
итак, предлагаю код метода SysQuery::countPrim для 3.0
Код:
private server static container countPrim(container _queryPack)
{
...
  ;
    countQueryRun   = new QueryRun(_queryPack);
    countQuery      = countQueryRun.query();
    for (k = 1; k <= countQuery.dataSourceCount();k++)
    {
        qbds = countQuery.dataSourceNo(k);
        qbds.update(false);
        qbfl = qbds.fields();
        qbfl.dynamic(false);
        qbfl.clearFieldList();
        qbfl.addField(FieldNum(Common,recId),SelectionField::COUNT);
    }
...
}
Давнишняя тема, но по ходу разбирательств обнаружилась небольшая неточность. В исходном сообщении говорилось следующее:
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Более правильный метод подсчета записей, возвращаемых Query см. в методе webTableLookup.run() Там есть вложенный метод computeRecordCount, который все и делает. Вкратце, суть метода такова. Сначала создается копия исходного Query. Для всех DataSource в Query отменяется динамическое создание списка выбираемых полей и добавляется только поле TableId (чтобы хоть что-то выбиралось). Далее, в самый главный DataSource добавляется Selection Field RecId с функцией агрегации COUNT
Тут же получается, что COUNT(RecId) добавляется для каждого датасорса вместо только первого. В свете этого корректнее было бы, наверно, написать так
Код:
    for (k = 1; k <= countQuery.dataSourceCount();k++)
    {
        qbds = countQuery.dataSourceNo(k);
        qbds.update(false);
        qbfl = qbds.fields();
        qbfl.dynamic(false);
        qbfl.clearFieldList();
        if (k == 1)
            qbfl.addField(fieldnum(Common, RecId), SelectionField::Count);
        else
            qbfl.addField(fieldnum(Common, TableId));
    }