Показать сообщение отдельно
Старый 19.04.2017, 15:11   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Выяснилось, что в Аксапте неправильно работает метод 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;
}
2) на форме zRecordInfo в источнике данных zRecordInfoTmp в методе writeForAll
строку кода
X++:
p.setTotal(SysQuery::countTotal(queryRun));
замените на
X++:
p.setTotal(SysQuery::countPrimClient(query));
Спасибо участнику SHiSHok !
Количество строк в Query