Acumatica 在字段值更改后显示smartpanel-网格保持为空

Acumatica 在字段值更改后显示smartpanel-网格保持为空,acumatica,Acumatica,在我的一个定制中,我需要在用户修改其中一个控件的值后直接显示一个弹出窗口(在本例中,是销售订单输入屏幕的SOLine中的一个自定义字段)。此弹出窗口显示网格中的一些附加值,用户在完成行之前必须选择这些值 使用标准流程将SmartPanel添加到屏幕 如果我从action/PXLookupButton调用它,弹出窗口将显示,网格将正确填充 如果将其移动到“FieldUpdate”或“RowSelected”事件,则会显示smartpanel,但网格始终为空。再次,如果我单击按钮,网格将保持为空,直

在我的一个定制中,我需要在用户修改其中一个控件的值后直接显示一个弹出窗口(在本例中,是销售订单输入屏幕的SOLine中的一个自定义字段)。此弹出窗口显示网格中的一些附加值,用户在完成行之前必须选择这些值

使用标准流程将SmartPanel添加到屏幕

如果我从action/PXLookupButton调用它,弹出窗口将显示,网格将正确填充

如果将其移动到“FieldUpdate”或“RowSelected”事件,则会显示smartpanel,但网格始终为空。再次,如果我单击按钮,网格将保持为空,直到我取消修改并仅使用按钮重新输入

在这些事件中,我也尝试调用动作的press方法,但出现了相同的结果

通过观察SQL事件探查器和调试器事件,我可以看到BQL语句正在执行,并且返回了正确的行,但它没有显示在smartpanel的网格中

有可能处理这种类型的请求吗?我假设我需要将其移动到其他方法和/或传递一些附加值,但尚未找到正确的组合

这适用于Acumatica 5.3/6.1


任何输入都将不胜感激。

RowUpdate处理程序允许我实现请求的行为,并在字段值更改后显示SmartPanel

下面的示例依赖于为
SOLine
DAC声明的自定义未绑定触发器对话框字段。当用户选中或取消选中触发对话框标志时,系统将显示项目数量对话框,以更新所选SOLine记录的数量

public class SOLineExt : PXCacheExtension<SOLine>
{
    #region TriggerDialog
    public abstract class triggerDialog : PX.Data.IBqlField
    {
    }
    [PXBool]
    [PXUIField(DisplayName = "Trigger Dialog")]
    public virtual bool? TriggerDialog { get; set; }
    #endregion
}
扩展类的另一部分是
ChangeOk
操作,由SmartPanel调用,以更新文档详细信息网格中所选记录的数量。要从屏幕工具栏隐藏
ChangeOk
操作,还需要将以下命令添加到
PXDataSource.CallbackCommands
集合中:

<px:PXDSCallbackCommand Name="ChangeOk" Visible="False" />

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    [Serializable]
    public class SOLineParams : IBqlTable
    {
        #region OrderQty
        public abstract class orderQty : PX.Data.IBqlField
        {
        }

        [PXDBDecimal]
        [PXDefault(TypeCode.Decimal, "0.0")]
        [PXUIField(DisplayName = "Quantity")]
        public virtual decimal? OrderQty { get; set; }
        #endregion
    }

    public PXFilter<SOLineParams> SOLineParam;

    public PXAction<SOOrder> ChangeOk;
    [PXUIField(DisplayName = "OK")]
    [PXButton(CommitChanges = true)]
    protected void changeOk()
    {
        var lineParams = SOLineParam.Current;
        Base.Transactions.Cache.SetValue<SOLine.orderQty>(Base.Transactions.Current, lineParams.OrderQty);
        SOLineParam.Cache.Clear();
    }

    public void SOLine_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
    {
        if (!sender.ObjectsEqual<SOLineExt.triggerDialog>(e.Row, e.OldRow) && e.ExternalCall == true)
        {
            SOLineParam.AskExt();
        }
    }
}
<px:PXDSCallbackCommand Name="ChangeOk" Visible="False" />