将库存项目查找添加到面板



我在Item class屏幕中添加了一些自定义代码,以创建具有相同类的Inventory Item。当用户单击"创建项目"按钮时,会弹出一个面板,在提交之前输入项目名称。我需要该字段像"库存项目"屏幕上的原始库存ID字段一样进行查找。我在面板上有查找,但每当你选择一个项目时,它都会切换回列表中的第一个项目。

public PXFilter<InventoryItem> MyPanel; // in INItemClassMaint extension
public PXSelect<InventoryItem, Where<InventoryItem.stkItem, Equal<boolTrue>, And<Match<Current<AccessInfo.userName>>>>> Item;
// on in201000.aspx page
<px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="MyPanel" AcceptButtonID="CstButton6" DesignView="Hidden" Caption="Create Item" CaptionVisible="True" LoadOnDemand="True" CreateOnDemand="False">
<px:PXFormView runat="server" ID="CstFormView3" DataMember="Item" DataSourceID="ds" DefaultControlID="edInventoryCD">
<Template>
<px:PXLayoutRule runat="server" ID="CstPXLayoutRule4" StartColumn="True" />
<px:PXSegmentMask runat="server" ID="CstPXSegmentMask10" DataField="InventoryCD" /></Template></px:PXFormView>
<px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
<px:PXButton runat="server" ID="CstButton6" Text="Create" DialogResult="OK">
<AutoCallBack Command="Save" /></px:PXButton>
</px:PXPanel></px:PXSmartPanel>

关于如何正确地做到这一点,有什么想法吗?感谢

当使用PXFilter类型的MyPanel数据视图启动时,最初的路径是正确的。InventoryItem用作MyPanel视图的主DAC时出现了第一个问题:

  1. INItemClassMaintBLC中,已经有一个InventoryItem用作主DAC的数据视图(Items),通过声明另一个具有相同主DAC的视图,可以强制两个视图共享相同的PXCache实例,除非它们绑定到表示UI中完全相同记录的PXForm
  2. PXFilter类型的数据视图不能与至少有一个键字段的DAC一起使用,否则每当用户更改某个键字段值时,框架都会调用Cancel命令

下面是项目类别屏幕上添加自定义对话框的示例,用于创建当前项目类别的新库存项目:

  • Aspx中自定义PXSmartPanel的声明:

    <px:PXSmartPanel runat="server" ID="CstSmartPanel2" Key="CreateStockItemDialog" Caption="Create Item" AutoRepaint="True"
    AcceptButtonID="CstButton6" CaptionVisible="True" >
    <px:PXFormView runat="server" ID="CstFormView3" DataMember="CreateStockItemDialog" SkinID="Transparent">
    <Template>
    <px:PXLayoutRule runat="server" StartColumn="True" />
    <px:PXSegmentMask runat="server" ID="CstPXSegmentMask10" DataField="InventoryCD" CommitChanges="true" />
    </Template>
    </px:PXFormView>
    <px:PXLayoutRule runat="server" StartRow="True" />
    <px:PXPanel runat="server" ID="CstPanel5" SkinID="Buttons">
    <px:PXButton runat="server" ID="CstButton6" Text="OK" DialogResult="OK" />
    </px:PXPanel>
    </px:PXSmartPanel>
    
  • INItemClassMaint BLC扩展的实现:

    public class INItemClassMaintExt : PXGraphExtension<INItemClassMaint>
    {
    [Serializable]
    public class CreateStockItemParams : IBqlTable
    {
    #region InventoryCD
    public abstract class inventoryCD : PX.Data.IBqlField
    {
    }
    [PXString]
    [PXUIField(DisplayName = "Inventory ID")]
    public virtual string InventoryCD { get; set; }
    #endregion
    }
    public PXFilter<CreateStockItemParams> CreateStockItemDialog;
    public PXDBAction<INItemClass> CreateStockItem;
    [PXButton]
    [PXUIField(DisplayName = "Create Stock Item")]
    protected void createStockItem()
    {
    var result = CreateStockItemDialog.AskExt((graph, viewname) =>
    {
    CreateStockItemDialog.Cache.Clear();
    });
    if (result != WebDialogResult.OK) return;
    var itemParams = CreateStockItemDialog.Current;
    if (string.IsNullOrEmpty(itemParams.InventoryCD))
    {
    CreateStockItemDialog.Cache.RaiseExceptionHandling<CreateStockItemParams.inventoryCD>(itemParams,
    itemParams.InventoryCD, new PXSetPropertyException(ErrorMessages.FieldIsEmpty, 
    PXUIFieldAttribute.GetDisplayName< CreateStockItemParams.inventoryCD>(CreateStockItemDialog.Cache)));
    return;
    }
    InventoryItemMaint maint = PXGraph.CreateInstance<InventoryItemMaint>();
    var newItem = new InventoryItem();
    newItem.InventoryCD = itemParams.InventoryCD;
    newItem = maint.Item.Insert(newItem);
    newItem.ItemClassID = Base.itemclass.Current.ItemClassID;
    maint.Item.Update(newItem);
    throw new PXRedirectRequiredException(maint, "New Stock Item");
    }
    protected void CreateStockItemParams_InventoryCD_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
    e.IsAltered = true;
    object ret = e.ReturnValue;
    PXDimensionAttribute restoreCombo = null;
    foreach (PXEventSubscriberAttribute attr in sender.Graph.Caches[typeof(InventoryItem)]
    .GetAttributesReadonly<InventoryItem.inventoryCD>())
    {
    if (attr is PXDimensionAttribute)
    {
    if (((PXDimensionAttribute)attr).ValidComboRequired)
    {
    ((PXDimensionAttribute)attr).ValidComboRequired = false;
    restoreCombo = (PXDimensionAttribute)attr;
    break;
    }
    }
    }
    sender.Graph.Caches[typeof(InventoryItem)].
    RaiseFieldSelecting<InventoryItem.inventoryCD>(null, ref ret, true);
    if (restoreCombo != null)
    {
    restoreCombo.ValidComboRequired = true;
    }
    e.ReturnState = ret;
    }
    protected void CreateStockItemParams_InventoryCD_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
    {
    object val = e.NewValue;
    sender.Graph.Caches[typeof(InventoryItem)].RaiseFieldVerifying<InventoryItem.inventoryCD>(null, ref val);
    var item = (InventoryItem)PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.SelectWindowed(Base, 0, 1, val);
    if (item != null)
    {
    throw new PXSetPropertyException("Stock Item with Inventory ID {0} already exists.",
    sender.Graph.Caches[typeof(InventoryItem)].GetValueExt<InventoryItem.inventoryCD>(item));
    }
    e.NewValue = val;
    }
    }
    

INItemClassMaintExt类中要突出显示的关键项目:

  1. 使用自定义CreateStockItemParamsDAC,该DAC未定义关键字段
  2. FieldSelecting FieldVerifying事件的INItemClassMaintExt.InventoryCD字段处理程序,以复制库存项目屏幕中存货ID查找的行为(支持多个分段和分段级验证)

最新更新