Всё правильно. Особенность временных таблиц состоит в том, чтобы не терять курсор. Т.е. если можно объявить переменную постоянной таблицы, чего-то в ней сделать, а затем объявить новую переменную и она уже увидит сделанные изменения, то в случае с временными таблицами такой подход не работает.
В случае с временными таблицами нужно ту переменную, которую наполнили данными - "таскать за собой" и пользоваться методами setTmpData() / linkToPhysicalInstance(), чтобы новую переменную привязывать к буферу той переменной, в которой лежат данные.
Соответственно, в метод QueryRun::getQueryRowCount() действительно нельзя передать буфер временной таблицы, поэтому он работать для временных таблиц не будет
Но и метод SysQuery::countTotal() внутри себя занимается перепаковкой Query и т.о. теряет исходный курсор.
Поэтому, чтобы метод SysQuery::countTotal() работал корректно для временных таблиц - нужно сделать несколько изменений:
1. В метод countTotal нужно добавить параметр, через который будет передаваться буфер временной таблицы:
X++:
public client server static Integer countTotal(QueryRun _queryRun, Common _tmpBuffer = null)// VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009
{
container c = SysQuery::countPrim(_queryRun.pack(false), _tmpBuffer);
return conpeek(c,1);
}
2. В метод countPrim также нужно добавить аналогичный параметр и уже его дальше использовать в методе setCursor
X++:
private server static container countPrim(container _queryPack, Common _tmpBuffer = null) // VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009
{
Query countQuery;
QueryRun countQueryRun;
QueryBuildDataSource qbds;
QueryBuildFieldList qbfl;
Common common;
Integer counter;
Integer loops;
;
countQueryRun = new QueryRun(_queryPack);
// VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009 -->
if (_tmpBuffer)
{
countQueryRun.setCursor(_tmpBuffer);
}
// VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009 <--
countQuery = countQueryRun.query();
qbds = countQuery.dataSourceNo(1);
qbds.update(false);
qbds.sortClear();
countQuery.clearGroupBy();
countQuery.clearOrderBy();
qbfl = qbds.fields();
qbfl.dynamic(false);
qbfl.clearFieldList();
if (countQuery.dataSourceCount() == 1)
qbds.addSelectionField(fieldNum(Common,RecId),SelectionField::Count);
countQueryRun = new QueryRun(countQuery);
// VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009 -->
if (_tmpBuffer)
{
countQueryRun.setCursor(_tmpBuffer);
}
// VSUH, Корректный подсчет кол-ва записей во временной таблице, 06.04.2009 <--
while (countQueryRun.next())
{
common = countQueryRun.get(countQuery.dataSourceNo(1).table());
counter += common.RecId;
loops++;
}
return [counter,loops];
}
Само собой, можно еще сделать дополнительную проверку, что передаваемый буфер действительно является временной таблицей (tmpBuffer.isTmp() || tmpBuffer.isTempDB())