Acumatica 如何对数据委托数组进行排序

Acumatica 如何对数据委托数组进行排序,acumatica,Acumatica,我在数据委托中使用两个视图填充数据。我必须根据交易日期排序,计算流动余额。如何对数据进行排序并填充运行余额 委托代码如下所示 [PXVirtualDAC] public PXSelectOrderBy<FundBalanceData, OrderBy<Asc<FundBalanceData.tranDate>>> fbdata; protected virtual IEnumerable FBData() { List&

我在数据委托中使用两个视图填充数据。我必须根据交易日期排序,计算流动余额。如何对数据进行排序并填充运行余额

委托代码如下所示

[PXVirtualDAC]
    public PXSelectOrderBy<FundBalanceData, OrderBy<Asc<FundBalanceData.tranDate>>> fbdata;
    protected virtual IEnumerable FBData()
    {
        List<FundBalanceData> importlist = new List<FundBalanceData>();

        PXSelectBase<ARPayment> cmd = new PXSelectJoin<ARPayment, InnerJoin<GLTran, On<ARPayment.batchNbr, Equal<GLTran.batchNbr>>,
                                                       InnerJoin<PMProject, On<GLTran.projectID, Equal<PMProject.contractID>>>>,
                                                       Where<GLTran.projectID, Equal<Current<PMProject.contractID>>,
                                                       And<ARPayment.docType, Equal<ARPaymentType.prepayment>>>>(Base);
        foreach(PXResult<ARPayment,GLTran,PMProject> line in cmd.Select())
        {
            FundBalanceData data = new FundBalanceData();
            ARPayment arp = line;
            PMProject pmp = line;
            GLTran glt = line;
            data.BAccountID = arp.CustomerID;
            data.CreditAmount = glt.CreditAmt;
            data.DebitAmount = glt.DebitAmt;
            data.RefNbr = arp.RefNbr;
            data.DocType = arp.DocType;
            data.Desc = arp.DocDesc;
            data.TranDate = arp.DocDate;
            importlist.Add(data);
        }


        PXSelectBase<APAdjust> cmd2 = new PXSelectJoin<APAdjust, LeftJoin<GLTran, On<APAdjust.adjBatchNbr, Equal<GLTran.batchNbr>, And<APAdjust.adjdAPAcct, Equal<GLTran.accountID>>>,
                                                     InnerJoin<APPayment, On<APAdjust.adjgRefNbr, Equal<APPayment.refNbr>, And<APAdjust.adjgDocType, Equal<APPayment.docType>>>,
                                                     InnerJoin<APTran,On<APTran.refNbr,Equal<APAdjust.adjdRefNbr>,And<APTran.tranType,Equal<APAdjust.adjdDocType>>>>>>,
                                                     //InnerJoin<GLTran, On<APTran.projectID, Equal<GLTran.projectID>>>>>,
                                                     Where<APAdjust.adjgDocType, Equal<APPaymentType.prepayment>, And<APTran.projectID, Equal<Current<PMProject.contractID>>, And<GLTran.accountID, NotEqual<APPayment.aPAccountID>>>>>(Base);

        foreach (PXResult<APAdjust,GLTran,APPayment,APTran> line in cmd2.Select())
        {
            FundBalanceData data = new FundBalanceData();
            APPayment arp = line;
            GLTran glt = line;
            APAdjust apd = line;
            data.BAccountID = arp.VendorID;
            data.CreditAmount = glt.CreditAmt;
            data.DebitAmount = glt.DebitAmt;
            data.RefNbr = arp.RefNbr;
            data.DocType = arp.DocType;
            data.Desc = arp.DocDesc;
            data.TranDate = arp.DocDate;
            importlist.Add(data);
        }
        decimal? balance = decimal.Zero;
        foreach(FundBalanceData data in importlist)
        {
            balance = balance + (data.CreditAmount - data.DebitAmount);
            data.Balance = balance;
        }
        return importlist;
    }
[PXVirtualDAC]

公共PXSelectOrderBy以下是关于T200 Acumatica Framework基础课程数据视图结果集排序的部分:

数据视图按照以下规则执行委托:

  • 如果定义了委托,则调用该委托
    • 如果委托返回null,则执行BQL命令
    • 如果委托返回一个对象,则根据BQL命令的OrderBy子句对结果重新排序
  • 如果未定义委托,请执行BQL命令
数据视图返回的结果集始终按顺序排序 在数据视图对象的类型中指定的BY子句。如果你分类 在委托内以不同的方式记录数据,即结果集 将在数据视图返回之前重新排序

代码中余额的计算在返回结果集之前完成。这就是为什么在你们等待的时候它并没有被计算出来。在返回结果集后,将进行排序

更新1

cmd
cmd2
更改为以下查询:

PXSelectBase<ARPayment> cmd = new PXSelectJoin<ARPayment, InnerJoin<GLTran, On<ARPayment.batchNbr, Equal<GLTran.batchNbr>>,
                                                       InnerJoin<PMProject, On<GLTran.projectID, Equal<PMProject.contractID>>>>,
                                                       Where<GLTran.projectID, Equal<Current<PMProject.contractID>>,
                                                       And<ARPayment.docType, Equal<ARPaymentType.prepayment>>>,OrderBy<Asc<ARPayment.DocDate>>>(Base);




PXSelectBase<APAdjust> cmd2 = new PXSelectJoin<APAdjust, LeftJoin<GLTran, On<APAdjust.adjBatchNbr, Equal<GLTran.batchNbr>, And<APAdjust.adjdAPAcct, Equal<GLTran.accountID>>>,
                                                     InnerJoin<APPayment, On<APAdjust.adjgRefNbr, Equal<APPayment.refNbr>, And<APAdjust.adjgDocType, Equal<APPayment.docType>>>,
                                                     InnerJoin<APTran,On<APTran.refNbr,Equal<APAdjust.adjdRefNbr>,And<APTran.tranType,Equal<APAdjust.adjdDocType>>>>>>,
                                                     //InnerJoin<GLTran, On<APTran.projectID, Equal<GLTran.projectID>>>>>,
                                                     Where<APAdjust.adjgDocType, Equal<APPaymentType.prepayment>, And<APTran.projectID, Equal<Current<PMProject.contractID>>, And<GLTran.accountID, NotEqual<APPayment.aPAccountID>>>>,OrderBy<Asc<APPayment.DocDate>>>(Base);
或者如果TranDate不是DateTime

importlist= importlist.OrderBy(x => x.TranDate).ToList(); 

view order by不会按order by(仅按键)对显示的记录进行排序。我认为唯一的方法是确保按您想要的顺序从视图委托返回列表。我尝试对importlist数组进行排序,但没有成功。网格中的最终结果是按日期排序的。我必须计算代理中的平衡,以在网格上显示适当的平衡。目前,由于AR和AP未在数据代理中排序,计算的余额不正确。我尝试了数组排序,但在DateTime上没有工作?字段。@MuralidharanRamakrishnan我已经在答案中添加了修改过的BQL查询请尝试它们我已经尝试过了,但仍然存在问题。它需要在从2填充数据后进行排序view@MuralidharanRamakrishnan第二行的余额是1000,第三行的余额是500?或者应该是14300和13800?@MuralidharanRamakrishnan尝试在最后一个循环
importlist=importlist.OrderBy(x=>x.TranDate.Value).ToList()之前添加以下行
importlist=importlist.OrderBy(x=>x.TranDate.ToList()如果
TranDate
不是
DateTime?
importlist= importlist.OrderBy(x => x.TranDate).ToList();