【问题标题】:Aggregate and Sum on calculated field计算字段上的聚合和求和
【发布时间】:2018-07-26 23:19:16
【问题描述】:

鉴于以下客户的交易(发票和贷项通知单)

DocType OrigDocAmt     CustomerID
------- -------------- -----------
CRM      100            10278
CRM      150            10278
CRM       75            10278
INV      200            10278

我需要得到总金额。考虑到INV应该是负数

select sum(case when DocType = 'INV' then -OrigDocAmt else OrigDocAmt end) TheTotal from 
ARRegister where CustomerID=10278

TheTotal
---------------------------------------
125

如何编写聚合 BQL 来做到这一点?我不能只调用 Sum,因为它会给我 525。

提前致谢!

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    如果您使用 DAC 字段,您可以使用 PXUnboundFormula 和 SumCalc:

    [PXUnboundFormula(typeof(Switch<Case<Where<ARRegister.docType, Equal<ARInvoiceType.invoice>>, 
                             Minus<ARRegister.origDocAmt>>, ARRegister.origDocAmt>), 
                      typeof(SumCalc<DAC.totalField>))]
    

    如果您在图表中执行松散的 BQL 查询,您可以进行 2 个 BQL 查询,一个用于 INV 类型,一个用于所有其他类型,然后将没有 BQL 的两个总数的结果相加。对于更复杂的业务规则,SQL 等声明式解决方案变得笨拙,需要像 Samvel Petrosov 建议的迭代方法。

    【讨论】:

      【解决方案2】:

      我建议您使用 PXSelectGroupBy 将 DocTypeCustomerID 分组并遍历这些组并计算总数,如下所示:

      int? customerID = 4899;
      decimal? totalAmount = 0M;
      using (IEnumerator<PXResult<ARRegister>> invoices = PXSelectGroupBy<ARRegister, Where<ARRegister.customerID, Equal<Required<ARRegister.customerID>>>, Aggregate<GroupBy<ARRegister.docType, GroupBy<ARRegister.customerID, Sum<ARRegister.origDocAmt>>>>>.Select(this.Base, customerID).GetEnumerator())
      {
          while (invoices.MoveNext())
          {
              ARRegister groupedInvoice = invoices.Current;
              totalAmount += groupedInvoice.DocType == "INV" ? groupedInvoice.OrigDocAmt * -1 : groupedInvoice.OrigDocAmt;
          }
      }
      

      我在组上编写循环的原因是 Acumatica 的 Sum&lt;&gt; 运算符不支持使用 Case&lt;&gt; 运算符,并且您不能在列上编写带有条件的聚合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-19
        • 2011-07-22
        • 1970-01-01
        • 2019-04-06
        • 2016-10-13
        • 2013-09-01
        • 2020-01-27
        相关资源
        最近更新 更多