如何对Data Delegate数组排序并计算填充滚动余额(含代码)
解决Acumatica中Data Delegate的排序与滚动余额计算问题
我来帮你搞定这个需求——按交易日期排序后计算滚动余额,结合你给出的代码片段,咱们一步步来实现:
第一步:确保数据按交易日期排序
你已经在PXSelectOrderBy里指定了按tranDate升序排序,但如果你的importlist是通过自定义查询(比如从ARPayment和另一个视图取数合并)构建的,这个内置排序可能不会生效。所以需要手动对列表进行排序:
protected virtual IEnumerable FBData() { List<FundBalanceData> importlist = new List<FundBalanceData>(); PXSelectBase<ARPayment> cmd = ...; // 你的现有查询逻辑,从ARPayment或其他视图取数填充importlist // 关键:对importlist按交易日期升序排序,确保顺序正确 importlist = importlist.OrderBy(item => item.TranDate).ToList(); // 后续计算滚动余额的逻辑放在这里 }
第二步:计算滚动余额
遍历排序后的列表,维护一个累计余额变量,逐行计算并赋值给FundBalanceData对应的字段(假设你已经在DAC里定义了RunningBalance字段来存储滚动余额):
protected virtual IEnumerable FBData() { List<FundBalanceData> importlist = new List<FundBalanceData>(); PXSelectBase<ARPayment> cmd = ...; // 你的现有取数逻辑 // 1. 先排序 importlist = importlist.OrderBy(item => item.TranDate).ToList(); // 2. 计算滚动余额 decimal runningBalance = 0; foreach (var item in importlist) { // 根据你的业务逻辑调整:比如收入加、支出减,这里假设TranAmt是交易金额字段 runningBalance += item.TranAmt ?? 0; // 将计算结果赋值给DAC的滚动余额字段 item.RunningBalance = runningBalance; } // 3. 返回处理后的数据集 foreach (var item in importlist) { yield return item; } }
注意事项
- 确保
TranDate是DateTime类型,避免字符串排序导致的日期顺序错误。 - 根据你的实际业务调整余额计算逻辑:比如如果是应付/应收场景,可能需要区分借贷方向,对金额做加减调整。
- 如果
importlist是直接从PXSelectOrderBy查询获取的结果,也可以跳过手动排序,但自定义合并多数据源的列表必须手动排序。
内容的提问来源于stack exchange,提问作者Muralidharan Ramakrishnan
相关产品推荐
相关产品推荐

