是否有任何表格的示例在位于网格内的列中执行运行总计。网格的用户排序和过滤会影响运行总计列。
如果仅按交易日期排序,我可以轻松执行上述操作,但包括用户排序和过滤我认为我们必须使用数据源range()和rangecount()函数(参见SysQuery::mergeRanges( )例如)然后遍历这些以应用过滤,然后包括动态链接。订购也是如此,尽管现在更复杂了。
任何建议表示赞赏。建议的任何赞赏(如:对问题投票!)。
是否有任何表格的示例在位于网格内的列中执行运行总计。网格的用户排序和过滤会影响运行总计列。
如果仅按交易日期排序,我可以轻松执行上述操作,但包括用户排序和过滤我认为我们必须使用数据源range()和rangecount()函数(参见SysQuery::mergeRanges( )例如)然后遍历这些以应用过滤,然后包括动态链接。订购也是如此,尽管现在更复杂了。
任何建议表示赞赏。建议的任何赞赏(如:对问题投票!)。
您可以使用以下策略将其实现为表单数据源显示方法:
复制表单的数据源查询(不需要SysQuery::mergeRanges
):
QueryRun qr = new QueryRun(ledgerTrans_qr.query());
qr
使用, 在当前记录之后停止对您的记录进行迭代和求和:
while (qr.next())
{
lt = qr.getNo(1);
total += lt.AmountMST;
if (lt.RecId == _lt.RecId)
break;
}
如果排序顺序是固定的(使用 sum(AmountMST) 并添加 where 约束),这可以提高性能。
返回总计
这导致效率非常低(次二次时间,O(n^2))。
如果没有太多记录,缓存结果(在地图中)可能使其可用。
更新:一个工作示例。
欢迎对以下代码提出任何意见或批评。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;
}