Acumatica 如何为复杂查询聚合BQL中的字段

Acumatica 如何为复杂查询聚合BQL中的字段,acumatica,Acumatica,我有一个连接三个表的BQL查询,如下所示: foreach (PXResult<GLTran, Branch, xTACOpenSourceDetail> rec in PXSelectJoin<GLTran, InnerJoin<Branch,

我有一个连接三个表的BQL查询,如下所示:

foreach (PXResult<GLTran, Branch, xTACOpenSourceDetail> rec in
                                PXSelectJoin<GLTran,
                                             InnerJoin<Branch,
                                                 On<GLTran.branchID, Equal<Branch.branchID>>,
                                             InnerJoin<xTACOpenSourceDetail,
                                                 On<Branch.branchCD, Equal<xTACOpenSourceDetail.string03>,
                                                 And<xTACOpenSourceDetail.openSourceName, Equal<Constants.openSourceName>,
                                                 And<xTACOpenSourceDetail.dataID, Equal<Constants.privateer>>>>>>,
                                        Where<Branch.branchCD, NotEqual<Required<Branch.branchCD>>,
                                        And<GLTran.posted, Equal<True>,
                                        And<GLTran.ledgerID, Equal<Required<GLTran.ledgerID>>,
                                        And<GLTran.tranDate, GreaterEqual<Required<GLTran.tranDate>>>>>>,
                                        OrderBy<Asc<xTACOpenSourceDetail.string01, Asc<GLTran.batchNbr>>>>.Select(Base, osdBranch.String03, ledger.LedgerID, tacsmlm.Date01))
SELECT  SUM(GLTran.CuryDebitAmt) OVER (PARTITION BY GLTran.BatchNbr, Branch.BranchCD) as 'BatchTotal'
       ,GLTran.*
       ,Branch.*
       ,xTACOpenSourceDetail.*

FROM    GLTran
        Inner Join Branch
            On GLTran.branchID = Branch.branchID
            AND Branch.CompanyID = GLTran.CompanyID
        Inner Join xTACOpenSourceDetail
            On Branch.branchCD = xTACOpenSourceDetail.string03
            And xTACOpenSourceDetail.openSourceName = 'TAC FM Map Company Branch'
            And xTACOpenSourceDetail.dataID = 'Privateer'
            AND xTACOpenSourceDetail.CompanyID = GLTran.CompanyID


Where   Branch.branchCD <> '000 0000'
        And GLTran.posted = 1
        And GLTran.ledgerID = 6
        And GLTran.tranDate >= '08/03/2017'
        AND GLTran.CompanyID = 2

Order
By      xTACOpenSourceDetail.string01 ASC
        ,GLTran.batchNbr ASC
foreach(PXResult rec in
PXSelectJoin.Select(Base、osdBranch.String03、ledger.LedgerID、tacsmlm.Date01))
我想添加一个聚合字段,即GLTran.BatNbr和Branch.BranchCD分组的GLTran.CuryDebitAmt之和

我可以在SQL中使用“求和覆盖”功能轻松实现这一点,如下所示:

foreach (PXResult<GLTran, Branch, xTACOpenSourceDetail> rec in
                                PXSelectJoin<GLTran,
                                             InnerJoin<Branch,
                                                 On<GLTran.branchID, Equal<Branch.branchID>>,
                                             InnerJoin<xTACOpenSourceDetail,
                                                 On<Branch.branchCD, Equal<xTACOpenSourceDetail.string03>,
                                                 And<xTACOpenSourceDetail.openSourceName, Equal<Constants.openSourceName>,
                                                 And<xTACOpenSourceDetail.dataID, Equal<Constants.privateer>>>>>>,
                                        Where<Branch.branchCD, NotEqual<Required<Branch.branchCD>>,
                                        And<GLTran.posted, Equal<True>,
                                        And<GLTran.ledgerID, Equal<Required<GLTran.ledgerID>>,
                                        And<GLTran.tranDate, GreaterEqual<Required<GLTran.tranDate>>>>>>,
                                        OrderBy<Asc<xTACOpenSourceDetail.string01, Asc<GLTran.batchNbr>>>>.Select(Base, osdBranch.String03, ledger.LedgerID, tacsmlm.Date01))
SELECT  SUM(GLTran.CuryDebitAmt) OVER (PARTITION BY GLTran.BatchNbr, Branch.BranchCD) as 'BatchTotal'
       ,GLTran.*
       ,Branch.*
       ,xTACOpenSourceDetail.*

FROM    GLTran
        Inner Join Branch
            On GLTran.branchID = Branch.branchID
            AND Branch.CompanyID = GLTran.CompanyID
        Inner Join xTACOpenSourceDetail
            On Branch.branchCD = xTACOpenSourceDetail.string03
            And xTACOpenSourceDetail.openSourceName = 'TAC FM Map Company Branch'
            And xTACOpenSourceDetail.dataID = 'Privateer'
            AND xTACOpenSourceDetail.CompanyID = GLTran.CompanyID


Where   Branch.branchCD <> '000 0000'
        And GLTran.posted = 1
        And GLTran.ledgerID = 6
        And GLTran.tranDate >= '08/03/2017'
        AND GLTran.CompanyID = 2

Order
By      xTACOpenSourceDetail.string01 ASC
        ,GLTran.batchNbr ASC
在(按GLTran.BatchNbr、Branch.BranchCD划分)上选择SUM(GLTran.CuryDebitAmt)作为“BatchTotal”
,GLTran*
,分行*
,xTACOpenSourceDetail*
来自GLTran
内连接分支
在GLTran.branchID=Branch.branchID上
和Branch.CompanyID=GLTran.CompanyID
内部连接xTACOpenSourceDetail
在Branch.branchCD=xTACOpenSourceDetail.string03上
和xTACOpenSourceDetail.openSourceName='TAC FM Map Company Branch'
和xTACOpenSourceDetail.dataID='Privateer'
和xTACOpenSourceDetail.CompanyID=GLTran.CompanyID
其中Branch.branchCD'000 0000'
和GLTran.posted=1
和GLTran.ledgerID=6
和GLTran.tranDate>=“2017年3月8日”
和GLTran.CompanyID=2
命令
由xTACOpenSourceDetail.string01 ASC提供
,GLTran.batchNbr ASC

…但我不知道如何在BQL中添加此单个求和字段。非常感谢您的帮助。

您将使用
PXSelectGroupBy
并在BQL的Aggreate中指示哪些字段将“求和”其值。任何未调用的字段都将是最大值

如果您在Acumatica源代码中搜索
SUM。选择(this,adj.AdjdOrderType,adj.AdjdOrderNbr,adj.AdjgDocType,adj.AdjgRefNbr);

您的问题的另一个替代解决方案是创建一个
PXProjection
,它可以是组值的总和,然后您可以在常规选择中包括BQL中的投影表和基表。我不知道与一个或另一个相比的性能优势-只是另一个选项。

您将使用
PXSelectGroupBy
并在BQL的Aggreate中指示哪些字段将“求和”其值。任何未调用的字段都将是最大值

如果您在Acumatica源代码中搜索
SUM。选择(this,adj.AdjdOrderType,adj.AdjdOrderNbr,adj.AdjgDocType,adj.AdjgRefNbr);

您的问题的另一个替代解决方案是创建一个
PXProjection
,它可以是组值的总和,然后您可以在常规选择中包括BQL中的投影表和基表。我不知道这两者相比的性能优势——只是另一种选择。

谢谢,布伦丹;布伦丹·汉克斯;D