|
![]() |
#1 |
Участник
|
Выяснилось, что в Аксапте неправильно работает метод SysQuery::countTotal().
Из-за этого при установленных галках "Выполнить для всех записей текущего родителя" или "Выполнить для всех записей, отображаемых на форме" мультипаспорт подвисал, пока этот метод не подсчитает все записи во всех таблицах запроса. Я это сразу не заметил, так как в основном тестировал на той Аксапте, где метод SysQuery::countTotal() уже был переделан умельцами. В итоге я решил исправить по-другому. В классе SysQuery сделал новый клиентский статический метод countPrimClient. Метод работает на клиенте, чтобы не гонять QueryRun через клиент-сервер. Так как по моим ощущениям, при этом могут теряться dynalink и еще что-то, я уже не помню что. Чтобы у вас в мультипаспорте плавно работал прогресс-бар при массовом изменении данных, а также чтобы перед массовым изменением данных мультипаспорт не подвисал, то произведите два следущих изменения: 1) В класс SysQuery добавьте следующий метод X++: client static int countPrimClient(Query _query) { Query countQuery; QueryRun countQueryRun; QueryBuildDataSource qbds; QueryBuildFieldList qbfl; Common common; int counter; int loops; int iGrp; int k ; countQueryRun = new QueryRun(_query); 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; } строку кода X++: p.setTotal(SysQuery::countTotal(queryRun)); X++: p.setTotal(SysQuery::countPrimClient(query)); Количество строк в Query |
|
Теги |
github |
|
|