如何自定义 SOLine InventoryID 选择器?

How can I customize the SOLine InventoryID selector?

我想自定义 SOLine InventoryID 选择器,以根据它们所属的 class 的值过滤掉某些库存项目。我已经阅读了 [PXRestrictor] 属性以及如何使用它来过滤选择器。这似乎可行,除了项目 Class 名称在该 DAC 中不可用,所以我尝试了这个:

[PXRestrictor(typeof(SelectFrom<InventoryItem>.
    InnerJoin<INItemClass>.On<INItemClass.itemClassID.IsEqual<InventoryItem.itemClassID>>.
    Where<INItemClass.itemClassCD.IsEqual<itemClassValue>>), "Custom items")]

但这显然是不允许的。

似乎我需要重写选择器本身,但现有的选择器相当复杂并且隐藏在属性层之下,我什至不确定如何复制它,更不用说那个选项看起来很接近-看见了。

我该怎么做,或者这根本不是一个好的选择?

PXRestrictor 与 where 子句一起使用以指定如何限制。

[PXRestrictor(typeof(
    Where<Current<InventoryItem.itemClassID>, Equal<itemClassValue>>
    ), "Custom Items")]

在上面的示例中,itemClassValue 必须是 classID 的类型。

如果选择器需要存在于任何地方,您可以与字段上的当前属性合并,选择器被定义为 DAC 扩展;如果仅在特定图形中,则可以与 CacheAttached 合并。

更新

正如您指出您需要在评论中允许项目 classes 的整个树一样,您可以尝试这种方法,这种方法在我只需要允许某些值的情况下对我有用条件。

为您的 BASE 项目 class 在 SOLine 上添加一个 PXInt 字段。使用 RowSelecting 事件设置它,然后在您的限制器中使用它。

示例基本项目 Class ID 字段:

#region BaseItemClassID
[PXInt]
public virtual int? BaseItemClassID { get; set; }
public abstract class baseItemClassID : PX.Data.BQL.BqlInt.Field<baseItemClassID> { }
#endregion

在 CacheAttached 中使用的限制器仅限制为您的基本项目 class:

[PXRestrictor(typeof(Where<InventoryItem.baseItemClassID, Equal<myBaseItemClassType>>), "")]

如果这适用于所有 SOLine 记录,您需要将“何时只允许我的特定项目 class 树”添加到限制器。请记住,限制器必须 return True 才能给出结果,因此它可能需要是“Where NOT my condition OR BaseItemClassID == myBaseItemClassID”。

在我的例子中,我需要一个简单的条件来允许使用标准位置,我将一些位置配置为特殊用途以隔离某些库存。当我想允许使用标准位置时,我只是将 PXBool 字段设置为 true,限制器会翻转允许的选择。我认为这个概念可能适用于您的情况以及上面概述的情况。