【问题标题】:Updating ALL SOLine items unit prices dynamically when a new SOLine is added添加新 SOLine 时动态更新所有 SOLine 项目单价
【发布时间】:2016-08-01 23:25:23
【问题描述】:

我有一个由 PXAction 调用的存储过程。我知道使用存储过程违反了 Acumatica 的最佳实践,但我还没有为我的目标找到替代解决方案。存储过程根据决定单价的 breakQuantity 评估每个行项目及其关联的价格类别。如果多个项目属于同一价格 class== 或超过中断数量,则单价降低。

我开始的是行更新

 protected virtual void SOLine_RowUpdating(PXCache sender, PXRowUpdatingEventArgs e)
    {
        SOLine row = (SOLine)e.Row;
        formalizeOrderTotal(row);
    }

然后在我的formalizeOrderTotal 函数中,它在SOLine in lines.Select() 上执行了一个foreach 循环来增加订单数量。作为测试,我只是尝试将所有订单数量相加并将其应用于每个订单项。这仅在刷新后更新,这否定了将存储过程移动到 c# 函数/Acumatica 事件处理程序的目的。

如果有人对更新缓存中的所有行项目有一些建议,如果您能提供一些输入,我们将不胜感激。

【问题讨论】:

  • 'This only updated after refresh',你是指在刷新屏幕/网格之后?
  • 你是对的!抱歉,我没有具体说明。
  • Base.Transactions.View.RequestRefresh();将解决您的问题。

标签: acumatica


【解决方案1】:

尝试使用Base.Transactions.View.RequestRefresh();,它将要求网格自行刷新。在此示例中,我将每条线的数量设置为网格中存在的 SOLine 数。

using PX.Data;
namespace PX.Objects.SO
{

    public class SOOrderEntry_Extension:PXGraphExtension<SOOrderEntry>
    {
        protected virtual void SOLine_RowUpdating(PXCache sender, PXRowUpdatingEventArgs e)
        {
            SOLine row = (SOLine)e.Row;
            formalizeOrderTotal(row);
        }

        private void formalizeOrderTotal(SOLine row)
        {
            foreach (SOLine line in Base.Transactions.Select())
            {
                if(line.Qty == Base.Transactions.Select().Count)
                {
                    continue;
                }

                line.Qty = Base.Transactions.Select().Count;
                Base.Transactions.Update(line);
                Base.Transactions.View.RequestRefresh();
            }
        }
    }
}

【讨论】:

  • 谢谢西蒙,我现在就试试!
  • 成功了!我将尝试使用 RequestRefresh() 来尝试应用价格更新。谢谢西蒙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多