Form Running Totals,Axe 2009

时间:2012-08-14 07:23:16

标签: axapta dynamics-ax-2009 x++

是否存在表单位于网格中的列中执行运行总计的示例。用户订购和过滤网格会影响运行总计列。

如果仅按交易日期排序,我可以轻松执行上述操作,但包括用户排序和过滤我假设我们必须使用数据源 range() rangecount ()函数(参见 SysQuery :: mergeRanges()示例)然后迭代这些函数以应用过滤,然后包含dynalinks。订购也是如此,虽然这现在更加复杂。

任何建议表示赞赏。建议任何赞赏(例如:投票问题!)。

2 个答案:

答案 0 :(得分:2)

您可以使用此策略将其实现为form datasource display method

  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. 返回总数

  4. 这是非常低效的(次级时间O(n^2))。

    如果没有太多记录,缓存结果(在地图中)可能会使其可用。

    更新:a working example

答案 1 :(得分: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;
}