Показать сообщение отдельно
Старый 26.06.2022, 08:03   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,275 / 3476 (122) ++++++++++
Регистрация: 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).