【问题标题】:Add Alternate ID field to the Inventory ID selector on the SOLine grid将备用 ID 字段添加到 SOLine 网格上的库存 ID 选择器
【发布时间】:2016-11-08 05:52:56
【问题描述】:

我正在尝试将备用 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)
{
}

这会将 Alternate ID 字段添加到选择器中,并且可能会在选择时短暂返回正确的 Inventory CD,但随后 Inventory CD 会更改整数 ID,这当然会引发错误指示符,因为 ID 是无法识别。

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    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 并使用计算的字符串值填充未绑定的 AlternateIDs 字段:

      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) 启动布局编辑器,然后从操作菜单中选择编辑 Aspx 选项:

    4. 在 Aspx 文件中找到 InventoryID 选择器的声明:

      <px:PXSegmentMask CommitChanges=“True" ID="edInventoryID" runat="server" DataField="InventoryID" AllowEdit="True" />
      
    5. 对于 InventoryID 选择器,将 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>
      

    【讨论】:

    • 感谢两位的回答。 Patrick - 替代键返回正确的 InventoryCD,但随后我收到错误,即系统中不存在 InventoryID。 Ruslan - 出于客户的目的,我需要为选择器中的每条记录重复使用单独的 AlternateID 的 InventoryID。我已经反复尝试,但我相信您已经知道,我无法修改您提供的代码
    • George,由于重复的 PXSelectorAttribute,您的原始尝试(即使根据 Patrick 的建议进行了更新)也不起作用。实际上,使用 PXSelectorAttribute 来装饰 InventoryID 并不完全正确,因为 Inventory CD 是分段键 - 分段键只允许使用 PXDimensionSelectorAttribute。
    • 附加注释:为选择器中的每条记录重复使用单独的 AlternateID 的 InventoryID 不会让您达到预期的结果,只会让用户感到困惑,因为尽管选择了 AlternateID,但选择器将始终突出显示第一个发现的库存 CD。针对 INItemXRef DAC 构建自定义选择器字段并在代码中填充 Inventory ID 似乎也是不可能的:InventoryID 是 5 个之一!为 INItemXRef DAC 定义的关键字段。前面建议的解决方案似乎是尽可能接近客户要求的唯一可接受的选择。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      相关资源
      最近更新 更多