1

グリッド内にある列で累計を実行するフォームの例はありますか。ユーザーによるグリッドの順序付けとフィルタリングは、現在の合計列に影響します。

トランザクションの日付のみで注文する場合は、上記を簡単に実行できますが、ユーザーの注文とフィルタリングを含めると、データソースのrange()およびrangecount()関数を使用する必要があると思います (例)次に、これらを繰り返し処理してフィルタリングを適用し、ダイナリンクを含めます。これはより複雑になりましたが、順序付けについても同じです。

任意の提案をいただければ幸いです。提案された感謝の気持ち(次のように:質問に投票してください!)。

4

2 に答える 2

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) )。

結果を (マップに) キャッシュすると、レコードが多すぎない場合に使用できるようになります。

更新:実例

于 2012-08-14T10:38:27.000 に答える
0

以下のコードに対する観察や批判は大歓迎です。メソッドが遅いという Jan の観察は今でも有効です。ご覧のとおり、これは彼の元の回答を修正したものです。

//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;
}
于 2012-08-16T12:06:36.587 に答える