如何自定义 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,限制器会翻转允许的选择。我认为这个概念可能适用于您的情况以及上面概述的情况。
我想自定义 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,限制器会翻转允许的选择。我认为这个概念可能适用于您的情况以及上面概述的情况。