SOOrder上的Acumatica未绑定用户字段 [英] Acumatica Unbound User Fields on SOOrder

查看:10
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆