Формы беговых итогов, Axe 2009

Есть ли где-нибудь пример формы, которая выполняет промежуточные итоги в столбце, расположенном в сетке. Пользовательский порядок и фильтрация сетки повлияет на столбец промежуточных итогов.

Я могу легко выполнить вышеуказанное, если бы он был заказан только по дате транзакции, но, включая пользовательский заказ и фильтрацию, я предполагаю, что нам придется использовать источник данных range () и rangecount () < / em> (см. пример в SysQuery :: mergeRanges ()), затем перебирают их, чтобы применить фильтрацию, а затем включить динамические ссылки. То же самое и с порядком, но теперь это сложнее.

Любые предложения приветствуются. Предлагаются любые предложения (например: проголосуйте за вопрос!).


person ian_scho    schedule 14.08.2012    source источник


Ответы (2)


Вы можете реализовать его как метод отображения источника данных формы, используя следующую стратегию:

  1. Скопируйте запрос источника данных формы (SysQuery::mergeRanges не требуется):

    QueryRun qr = new QueryRun(ledgerTrans_qr.query());

  2. Итерируйте и суммируйте свои записи с помощью qr, остановитесь после текущей записи:

    while (qr.next()) { lt = qr.getNo(1); total += lt.AmountMST; if (lt.RecId == _lt.RecId) break; }

    Это можно было бы сделать более производительным, если бы порядок сортировки был фиксированным (с помощью sum (AmountMST) и добавления ограничения where).

  3. Вернуть сумму

Это очень неэффективно по причине (субквадратное время, O (n ^ 2)) .

Кэширование результатов (на карте) может сделать его пригодным для использования, если записей не слишком много.

Обновление: рабочий пример.

person Jan B. Kjeldsen    schedule 14.08.2012
comment
Отличный ответ, Ян. Большое вам спасибо за ваше время. Я только что реализовал это и могу подтвердить ваше наблюдение по поводу более медленного ответа формы. С Уважением. - person ian_scho; 16.08.2012
comment
Аггх! Я только что тестировал, и фильтры пользователей сетки, похоже, не были применены к объекту запроса, который мы используем. Я пробовал ledgerTrans_qr.query () и this.query (), но, похоже, ни один из них не включает стандартное значение фильтра столбца, которое я добавил в сетку. Любое предложение приветствуется. - person ian_scho; 16.08.2012
comment
Вы кешировали результаты метода отображения? Вы должны очищать кеш, когда пользователь меняет запрос, executeQuery() было бы хорошим местом. Пользовательские фильтры обязательно должны отображаться в вашем запросе! - person Jan B. Kjeldsen; 17.08.2012
comment
И this.queryRun().query(), и ledgerTrans_qr.query() работают! Но this.query() не работает, так как это исходный запрос. - person Jan B. Kjeldsen; 17.08.2012

Любые замечания или критика приведенного ниже кода приветствуются. Наблюдение Яна о медлительности метода все еще в силе. Как видите, это модификация его первоначального ответа.

//BP Deviation Documented
display AmountMST XXX_runningBalanceMST(LedgerTrans _trans)
{
    LedgerTrans localLedgerTrans;
    AmountMST   amountMST;
    ;
    localLedgerTrans    = this.getFirst();
    while (localLedgerTrans)
    {
        amountMST           += localLedgerTrans.AmountMST;
        if (localLedgerTrans.RecId == _trans.RecId)
        {
            break;
        }
        localLedgerTrans    = this.getNext();
    }
    return amountMST;
}
person ian_scho    schedule 16.08.2012
comment
Это должно сработать. Решение запроса, указанное в pastebin выше, может быть намного быстрее (выберите список полей, кеширование на карте). - person Jan B. Kjeldsen; 17.08.2012