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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.06.2022, 08:03   #9  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,340 / 3558 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Всё правильно. Особенность временных таблиц состоит в том, чтобы не терять курсор. Т.е. если можно объявить переменную постоянной таблицы, чего-то в ней сделать, а затем объявить новую переменную и она уже увидит сделанные изменения, то в случае с временными таблицами такой подход не работает.
В случае с временными таблицами нужно ту переменную, которую наполнили данными - "таскать за собой" и пользоваться методами 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())
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 26.06.2022 в 09:00.
За это сообщение автора поблагодарили: Raven Melancholic (2), DesparioN (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
alirazazaidi: Build Dynamics Query in Dynamics 365 for Finance and Operations – Video Webcast MsDyn365FO Blog bot DAX Blogs 0 11.10.2018 08:12
emeadaxsupport: Microsoft Dynamics AX general performance analysis scripts page 5 Blog bot DAX Blogs 0 01.09.2014 14:11
Количество строк в Query Владимир Максимов DAX: Программирование 19 11.08.2014 18:27
Глюки с созданием большого количества строк. DDA DAX: Программирование 3 06.03.2003 12:36

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

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

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