总计和计算字段上的总和

时间:2018-07-26 00:56:06

标签: acumatica

提供以下客户的交易(发票和贷记凭证)

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。

谢谢!

2 个答案:

答案 0 :(得分: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建议的迭代方法。

答案 1 :(得分:0)

我建议您使用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<>运算符不支持与Case<>运算符一起使用,并且您不能在列上写有条件的Aggregate。