SOOrder上的Acumatica未绑定用户字段 [英] Acumatica Unbound User Fields on SOOrder
本文介绍了SOOrder上的Acumatica未绑定用户字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在SOOrder DAC扩展上有一个用户字段,它是文档上一些行的总和(基于Soline扩展中的一个字段)。当我添加新行时,合计正在正确更新。然而,当我第一次加载文档时,屏幕显示为0.00。我创建了一个SOOrderEntry扩展,并将代码放入Soline_RowSelecting事件处理程序。当我加载文档时,它进入代码,看起来它正在正确设置字段,但它们没有显示在屏幕上。从Soline_CuryLineAmt_FieldUpdated调用相同的方法,该方法运行良好。以下是我使用的代码:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
//Used to prevent recursive calls in RowSelecting
bool _isCalculating = false;
protected virtual void SOLine_RowSelecting(PXCache cache, PXRowSelectingEventArgs e)
{
var row = e.Row as SOLine;
if (row == null) return;
using (new PXConnectionScope())
{
if (!_isCalculating)
CalcTotals();
}
}
protected virtual void SOLine_CuryLineAmt_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
if (!_isCalculating)
CalcTotals();
}
public void CalcTotals()
{
SOOrder order = Base.CurrentDocument.Select();
if (order == null) return;
_isCalculating = true;
var orderExt = order.GetExtension<SOOrderExt>();
orderExt.UsrMyCustomField = 0m;
//Get totals
foreach (SOLine lineSum in Base.Transactions.Select())
{
var lineSumExt = lineSum.GetExtension<SOLineExt>();
if (lineSumExt.UsrMyCondition)
orderExt.UsrMyCustomField += lineSum.CuryLineAmt;
}
_isCalculating = false;
}
}
推荐答案
每次回调都会调用RowSelected来选择数据。也不需要对FieldUpated事件重新计算,因为在更新记录时将调用RowSelected。因此,请考虑删除Soline_CuryLineAmt_FieldUpated
您已经为Soline DAC声明了RowSelected事件。然后,该事件选择All Soline来计算总数。这就相当于在选择一个细节时计算所有细节的总和,那气味就缺乏递归模式。因此,请考虑在主文档(在本例中为SOOrder)上声明RowSelected,并删除您必须中断递归的所有变通方法。
计算中没有空检查。Acumatica DAC字段可以为空。对于您的代码,您可能会在向数字添加空的情况下结束,这将导致在运行时出现类型冲突。因此,在使用CuryLineAmt的值计算总数之前,请考虑检查CuryLineAmt是否为空。
/li> 您正在UsrMyCustomfield DAC字段中累计总计 使用+=加法赋值运算符。它起作用了,但我会 建议不要这么做。DAC字段不是用于注册的 计算或临时值占位符。因此,请考虑 在局部变量中累加总和,并只赋值最终 DAC字段的计算值。
考虑所有这些点来计算总计的代码:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
SOOrder order = e.Row as SOOrder;
if (order != null)
{
SOOrderExt orderExt = order.GetExtension<SOOrderExt>();
if (orderExt != null)
{
decimal total = 0M;
foreach (SOLine line in Base.Transactions.Select())
{
total += line.CuryLineAmt.HasValue ? line.CuryLineAmt.Value : 0M;
}
orderExt.UsrMyCustomField = total;
}
}
}
}
这篇关于SOOrder上的Acumatica未绑定用户字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文