将备用 ID 字段添加到 SOLine 网格上的库存 ID 选择器

Add Alternate ID field to the Inventory ID selector on the SOLine grid

我正在尝试将备用 ID 字段添加到 SOLine 详细信息网格上的搜索选择器。我的代码如下:

    [PXNonInstantiatedExtension]
public class SO_SOLine_ExistingColumn : PXCacheExtension<PX.Objects.SO.SOLine>
{
  #region InventoryID
[PXMergeAttributes(Method = MergeMethod.Append)]
[PXSelector(typeof(Search2<InventoryItem.inventoryCD, LeftJoin<INItemXRef, On<InventoryItem.inventoryID, Equal<INItemXRef.inventoryID>>>>),

        typeof(PX.Objects.IN.InventoryItem.inventoryCD),
        typeof(PX.Objects.IN.INItemXRef.alternateID),
        typeof(PX.Objects.IN.InventoryItem.descr),
        typeof(PX.Objects.IN.InventoryItem.itemClassID),
        typeof(PX.Objects.IN.InventoryItem.itemStatus),
        typeof(PX.Objects.IN.InventoryItem.itemType),
        typeof(PX.Objects.IN.InventoryItem.baseUnit),
        typeof(PX.Objects.IN.InventoryItem.salesUnit),
        typeof(PX.Objects.IN.InventoryItem.purchaseUnit),
        typeof(PX.Objects.IN.InventoryItem.basePrice))]
   public int? InventoryID { get; set; }
    #endregion
}
     public void SOLine_InventoryID_CacheAttached(PXCache sender)
{
}

这会将备用 ID 字段添加到选择器中,并且可能会短暂地 returns 选择正确的库存 CD,但随后库存 CD 会更改整数 ID,这当然会引发一个错误指示器,因为无法识别 ID。

您需要让您的选择器搜索 InventoryID,然后添加一个 "SubstituteKey" 选项,该选项将在 UI 选择器中显示 InventoryCD。示例:[PXSelector(typeof(InventoryItem.inventoryID), SubstituteKey = typeof(InventoryItem.inventoryCD))]

George,InventoryItem 和 INItemXRef DAC 之间存在一对多关系 - 将 PX.Objects.IN.INItemXRef.alternateID BQL 字段添加到 PXSelectorAttribute 的声明中不足以完成任务。

  1. 声明 InventoryItem DAC 的未绑定文本字段以存储每个库存项目的备用 ID:

    public class InventoryItemExt : PXCacheExtension<InventoryItem>
    {
        #region AlternateIDs
        public abstract class alternateIDs : IBqlField { }
    
        [PXString]
        [PXUIField(DisplayName = "Alternate IDs")]
        public virtual string AlternateIDs { get; set; }
        #endregion
    }
    
  2. 在 SOOrderEntry BLC 扩展中订阅 RowSelecting 事件(强制使用 PXConnectionScope 与数据库建立另一个连接)以连接每行的备用 ID,并使用计算出的字符串值填充未绑定的备用 ID 字段:

    public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry>
    {
        public override void Initialize()
        {
            Base.RowSelecting.AddHandler<InventoryItem>((sender, e) =>
            {
                InventoryItem item = e.Row as InventoryItem;
                if (item == null) return;
    
                string alternateIDs = string.Empty;
                using (new PXConnectionScope())
                {
                    foreach (INItemXRef crossRef in PXSelect<INItemXRef,
                        Where<INItemXRef.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>.Select(Base, item.InventoryID))
                    {
                        alternateIDs = string.IsNullOrEmpty(alternateIDs) ?
                            crossRef.AlternateID : alternateIDs + "; " + crossRef.AlternateID;
                    }
                }
                item.GetExtension<InventoryItemExt>().AlternateIDs = alternateIDs;
            });
        }
    }
    
  3. 启动“销售订单”屏幕的布局编辑器 (SO301000) 和“操作”菜单中的select“编辑 Aspx”选项:

  4. 在 Aspx 文件中找到 InventoryID 的声明select或:

    <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" />
    
  5. 对于 InventoryID select或者,将 FastFilterFields 属性 设置为 AlternateIDs 并通过声明 AlternateIDs 列附加列,然后单击生成自定义脚本:

    <px:PXSegmentMask CommitChanges="True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" >
        <GridProperties FastFilterFields="AlternateIDs">
            <Columns>
                <px:PXGridColumn DataField="AlternateIDs" AutoGenerateOption="Add" Width="250px" />
            </Columns>
        </GridProperties>
    </px:PXSegmentMask>