2017-08-07 3 views
0

ein Feld in BQL aggregieren habe ich eine BQL Abfrage Verbinden von drei Tabellen wie folgt:Wie für komplexe Abfrage

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)) 

Ich möchte ein aggregiertes Feld hinzuzufügen, nämlich die Summe der GLTran.CuryDebitAmt gruppiert nach GLTran .BatNbr und Branch.BranchCD.

Ich kann dies ganz einfach in SQL die Summe über Funktionalität wie folgt verwendet:

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 

... aber ich habe keine Ahnung, wie diese einzelnen in BQL summierten Feld hinzuzufügen. Jede Hilfe wird geschätzt.

Antwort

1

Sie erhalten eine PXSelectGroupBy und in Ihrem Aggreate für die BQL angeben, welche wird „SUM“ ihre Werte Felder. Jedes Feld, das nicht aufgerufen wird, ist der MAX-Wert.

Wenn Sie SUM< im Acumatica Quelle suchen, können Sie viel BQL Beispiele finden. Hier ist ein BQL-Beispiel von ARPaymentEntry. Nur zwei (curyAdjdAmt & adjAmt) Felder eine Summe enthalten, während alle anderen Felder zurückgegeben wird die MAX sein.

SOAdjust other = PXSelectGroupBy<SOAdjust, 
    Where<SOAdjust.voided, Equal<False>, 
     And<SOAdjust.adjdOrderType, Equal<Required<SOAdjust.adjdOrderType>>, 
     And<SOAdjust.adjdOrderNbr, Equal<Required<SOAdjust.adjdOrderNbr>>, 
     And< 
      Where<SOAdjust.adjgDocType, NotEqual<Required<SOAdjust.adjgDocType>>, 
      Or<SOAdjust.adjgRefNbr, NotEqual<Required<SOAdjust.adjgRefNbr>>>>>>>>, 
    Aggregate<GroupBy<SOAdjust.adjdOrderType, 
     GroupBy<SOAdjust.adjdOrderNbr, 
     Sum<SOAdjust.curyAdjdAmt, 
     Sum<SOAdjust.adjAmt>>>>>>.Select(this, adj.AdjdOrderType, adj.AdjdOrderNbr, adj.AdjgDocType, adj.AdjgRefNbr); 

Eine weitere alternative Lösung für Ihre Frage wäre ein PXProjection zu schaffen, die die Summe von Gruppenwerten sein können, die Sie dann in Ihrem normalen wählt den Projektionstisch vs der Basistabelle in Ihrem BQL enthalten. Ich kenne die Leistungsvorteile gegenüber dem einen oder dem anderen nicht - nur eine weitere Option.

+0

Danke, Brendan ..; D – pmfith