![]() |
#9 |
Administrator
|
Всё правильно. Особенность временных таблиц состоит в том, чтобы не терять курсор. Т.е. если можно объявить переменную постоянной таблицы, чего-то в ней сделать, а затем объявить новую переменную и она уже увидит сделанные изменения, то в случае с временными таблицами такой подход не работает.
В случае с временными таблицами нужно ту переменную, которую наполнили данными - "таскать за собой" и пользоваться методами 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); } 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]; }
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 26.06.2022 в 09:00. |
|
|
За это сообщение автора поблагодарили: Raven Melancholic (2), DesparioN (1). |