首页 > 解决方案 > 用户在对话框中确认后插入 SO 行

问题描述

输入客户后,我试图在“交易”网格中添加一行,但前提是用户接受它 - 会显示一个对话框以进行此确认。

我已将逻辑简化为非常简单的 SOLine 插入。

使用此代码,结果是成功的:

    protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        if (e.Row == null)
        {
            return;
        }

        SOOrder record = (SOOrder)e.Row;

        if (!sender.ObjectsEqual<SOOrder.customerID>(e.Row, e.OldRow)
                && record.CustomerID != null)
        {
            SOLine sOLineNewRow = new SOLine();
            sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);
            SOLineExt sOLineExtRow = PXCache<SOLine>.GetExtension<SOLineExt>(sOLineNewRow);

            sOLineNewRow.InventoryID = 311;
            this.Base.Transactions.Update(sOLineNewRow);

            sOLineNewRow.OrderQty = (decimal)7;
            this.Base.Transactions.Update(sOLineNewRow);


            sOLineNewRow.CuryUnitPrice = (decimal)8;
            this.Base.Transactions.Update(sOLineNewRow);
        }
    }

但是,当我在 Ask() 方法中包含对话框时,不会执行逻辑。调试后,我注意到 if 运算符中的逻辑甚至没有被访问。

    protected virtual void SOOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        if (e.Row == null)
        {
            return;
        }

        SOOrder record = (SOOrder)e.Row;

        if (!sender.ObjectsEqual<SOOrder.customerID>(e.Row, e.OldRow)
                && record.CustomerID != null)
        {
            if (this.Base.Document.Ask("Confirmation",
                                                        "The selected customer will have the default line. Do you want to insert it?",
                                                        MessageButtons.YesNo,
                                                        MessageIcon.Question) == WebDialogResult.Yes)
            {
                SOLine sOLineNewRow = new SOLine();
                sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);
                SOLineExt sOLineExtRow = PXCache<SOLine>.GetExtension<SOLineExt>(sOLineNewRow);

                sOLineNewRow.InventoryID = 311;
                this.Base.Transactions.Update(sOLineNewRow);

                sOLineNewRow.OrderQty = (decimal)7;
                this.Base.Transactions.Update(sOLineNewRow);


                sOLineNewRow.CuryUnitPrice = (decimal)8;
                this.Base.Transactions.Update(sOLineNewRow);
            }
        }

    }

有谁知道为什么会发生这种情况?

更新的问题

我在 Action 中复制了逻辑,结果在那里成功:

public PXAction<SOOrder> ChangeAmount;
       [PXUIField(DisplayName = "Action Test", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select)]
       [PXButton(CommitChanges = true)]
       public virtual void changeAmount()
       {
           PXTrace.WriteInformation("BeforeAskAction");

           if (this.Base.Document.Ask("Confirmation",
                                                       "The selected customer will have the default line. Do you want to insert it?",
                                                       MessageButtons.YesNo,
                                                       MessageIcon.Question) == WebDialogResult.Yes)
           {
               PXTrace.WriteInformation("AfterAskAction");

               SOLine sOLineNewRow = new SOLine();
               sOLineNewRow = this.Base.Transactions.Insert(sOLineNewRow);

               sOLineNewRow.InventoryID = 311;
               this.Base.Transactions.Update(sOLineNewRow);

               sOLineNewRow.OrderQty = (decimal)7;
               this.Base.Transactions.Update(sOLineNewRow);

               sOLineNewRow.CuryUnitPrice = (decimal)8;
               this.Base.Transactions.Update(sOLineNewRow);
           }
       }

记录了“BeforeAskAction”和“AfterAskAction”跟踪。

在我使用事件处理程序的原始场景中,只输入了“之前”跟踪。

我使用以下数据成员进行了测试: - Document - CurrentDocument - Transactions - 我使用 SOLine DAC 创建的虚拟 DM。在所有这些场景中,结果在操作中成功,但在事件处理程序中失败。

更新 2

最初,我在 SOOrder_CustomerID_FieldUpdated 中有逻辑。在这种情况下,记录被插入,但是我无法继续使用它,因为 CuryUnitPrice 没有分配代码中指示的数量。它分配了项目的默认价格。

我使用这篇文章作为参考(每隔一段时间更新一次销售价格),但结果仍然显示默认金额。当使用 RowUpdated 事件时 - 未实现 Ask() 方法 - 我的 CuryUnitPrice 金额已分配

标签: acumatica

解决方案


当框架方法没有表现出预期的行为时,可能是因为它没有在受支持的上下文中执行。

在PXAction事件处理程序的上下文中使用 DataView Ask()方法是很常见的。

如果此方法在其当前调用上下文中似乎无法正常工作,请尝试在 Action 事件处理程序中移动它。


推荐阅读