在我的一个自定义中,我需要在用户修改其中一个控件的值之后直接显示弹出窗口(在这种情况下,是销售订单输入屏幕的SOLine中的自定义字段)。此弹出窗口显示网格中的一些其他值,用户必须在完成行之前选择这些值。
使用标准流程,SmartPanel已添加到屏幕上。
如果我从一个动作/ PXLookupButton调用它,弹出窗口显示并正确填充网格。
如果我将其移至“FieldUpdated”或“RowSelected”事件,则会显示智能面板,但网格始终为空。再一次,如果我再单击按钮,网格将保持为空,直到我取消修改并仅使用按钮重新输入。
我也尝试在这些事件中调用动作的按下方法,但同样的结果也会发生。
观察SQL分析器和调试器事件我可以看到正在执行BQL语句并返回正确的行,它只是不显示在智能面板的网格中。
是否可以处理此类请求?我假设我需要将其移动到不同的方法和/或传递一些额外的值,但没有找到正确的组合。
这适用于Acumatica 5.3 / 6.1
任何意见都会受到赞赏。
答案 0 :(得分:3)
RowUpdated 处理程序允许我实现请求的行为,并在字段值更改后显示 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
}
Aspx中非常基本的 SmartPanel 声明:
<px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="SOLineParam" Caption="Item Quantity" AutoRepaint="True"
CaptionVisible="True" AcceptButtonID="CstButton6" AutoReload="true" >
<px:PXFormView runat="server" ID="CstFormView3" DataMember="SOLineParam" SkinID="Transparent" >
<Template>
<px:PXLayoutRule runat="server" StartColumn="True" />
<px:PXNumberEdit runat="server" ID="CstPXNumberEdit10" DataField="OrderQty" />
</Template>
</px:PXFormView>
<px:PXLayoutRule runat="server" StartRow="True" />
<px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
<px:PXButton runat="server" ID="CstButton6" DialogResult="OK" CommandName="ChangeOk" CommandSourceID="ds" />
<px:PXButton runat="server" ID="CstButton7" DialogResult="Cancel" Text="Cancel" />
</px:PXPanel>
</px:PXSmartPanel>
使用SOOrderEntry
BLC扩展程序完成订阅 RowUpdated 处理程序,SOLine
DAC向用户显示项目数量对话框:
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();
}
}
}
扩展程序的另一部分是 SmartPanel 调用的ChangeOk
操作,以更新文档详细信息中所选记录的数量网格。要隐藏屏幕工具栏中的ChangeOk
操作,还需要将以下命令添加到PXDataSource.CallbackCommands
集合中:
<px:PXDSCallbackCommand Name="ChangeOk" Visible="False" />