提供以下客户的交易(发票和贷记凭证)
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。
谢谢!
答案 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对DocType
和CustomerID
进行分组,然后遍历该组并计算总金额,如下所示:
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。