AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.04.2017, 15:11   #1  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (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
Теги
github

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка записи в SalesParmSubLine FrolovAndy DAX: Программирование 2 09.01.2018 15:48
Dax12 форма ListPage: как скрыть/отобразить MenuItemButton без смены фокуса записи в гриде Aquarius DAX: Программирование 10 30.11.2016 14:36
Как лучше хранить ссылки на записи - (RefTableId, Company, RefRecId) mazzy DAX: Программирование 41 08.07.2011 13:18
ALEG: Доступны записи тренингов по Microsoft Dynamics NAV Blog bot DAX Blogs 0 21.03.2007 15:00
Автоматическое увеличение значения поля при создании новой записи. sguryev DAX: Программирование 3 06.02.2003 14:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 22:54.