Цитата:
Сообщение от
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));
}