C# 如何自定义SOLine InventoryID选择器?

C# 如何自定义SOLine InventoryID选择器?,c#,acumatica,C#,Acumatica,我想定制SOLineInventoryID选择器,根据它们所属的类的值筛选出某些库存项目。我已经了解了[PXRestrictor]属性以及如何使用它来过滤选择器。这似乎是可行的,只是该DAC中没有项类名,所以我尝试了以下方法: [PXRestrictor(typeof(SelectFrom<InventoryItem>. InnerJoin<INItemClass>.On<INItemClass.itemClassID.IsEqual<Inventor

我想定制SOLine
InventoryID
选择器,根据它们所属的类的值筛选出某些库存项目。我已经了解了
[PXRestrictor]
属性以及如何使用它来过滤选择器。这似乎是可行的,只是该DAC中没有项类名,所以我尝试了以下方法:

[PXRestrictor(typeof(SelectFrom<InventoryItem>.
    InnerJoin<INItemClass>.On<INItemClass.itemClassID.IsEqual<InventoryItem.itemClassID>>.
    Where<INItemClass.itemClassCD.IsEqual<itemClassValue>>), "Custom items")]
[PX限流器(类型)(从中选择。
在……上。
其中),“定制项目”)]
但这显然是不允许的

似乎我需要覆盖选择器本身,但现有的选择器相当复杂,隐藏在属性层之下,我甚至不知道如何复制它,更不用说这个选项看起来相当短视


我怎样才能做到这一点,或者这根本不是一个好的选择?

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

[PXRestrictor(typeof(
    Where<Current<InventoryItem.itemClassID>, Equal<itemClassValue>>
    ), "Custom Items")]
[PX限流器(类型)(
哪里
),“定制项目”)]
在上面的示例中,itemClassValue必须是classID的类型

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

更新

正如您所指出的,您需要在注释中允许项目类的整个树,您可以尝试这种方法,这种方法在我只需要在某个条件下允许某些值的情况下对我有效

将PXInt字段添加到基本项类的SOLine中。使用行选择事件设置它,然后在限制器中使用它

示例基本项类ID字段:

#region BaseItemClassID
[PXInt]
public virtual int? BaseItemClassID { get; set; }
public abstract class baseItemClassID : PX.Data.BQL.BqlInt.Field<baseItemClassID> { }
#endregion
#区域BaseItemClassID
[PXInt]
公共虚拟整数?BaseItemClassID{get;set;}
公共抽象类baseItemClassID:PX.Data.BQL.BqlInt.Field{}
#端区
要在缓存中使用的限制器附加为仅限制基本项类的项:

[PXRestrictor(typeof(Where<InventoryItem.baseItemClassID, Equal<myBaseItemClassType>>), "")]
[PX限制器(typeof(Where),“”)]
如果这适用于所有SOLine记录,则需要将“何时只允许我的特定项目类树”添加到限制器。记住,限制器必须返回True才能给出结果,因此它可能需要是“Where NOT my condition或BaseItemClassID==myBaseItemClassID”


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

PXRestrictor与where子句一起使用,用于指定如何进行限制

[PXRestrictor(typeof(
    Where<Current<InventoryItem.itemClassID>, Equal<itemClassValue>>
    ), "Custom Items")]
[PX限流器(类型)(
哪里
),“定制项目”)]
在上面的示例中,itemClassValue必须是classID的类型

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

更新

正如您所指出的,您需要在注释中允许项目类的整个树,您可以尝试这种方法,这种方法在我只需要在某个条件下允许某些值的情况下对我有效

将PXInt字段添加到基本项类的SOLine中。使用行选择事件设置它,然后在限制器中使用它

示例基本项类ID字段:

#region BaseItemClassID
[PXInt]
public virtual int? BaseItemClassID { get; set; }
public abstract class baseItemClassID : PX.Data.BQL.BqlInt.Field<baseItemClassID> { }
#endregion
#区域BaseItemClassID
[PXInt]
公共虚拟整数?BaseItemClassID{get;set;}
公共抽象类baseItemClassID:PX.Data.BQL.BqlInt.Field{}
#端区
要在缓存中使用的限制器附加为仅限制基本项类的项:

[PXRestrictor(typeof(Where<InventoryItem.baseItemClassID, Equal<myBaseItemClassType>>), "")]
[PX限制器(typeof(Where),“”)]
如果这适用于所有SOLine记录,则需要将“何时只允许我的特定项目类树”添加到限制器。记住,限制器必须返回True才能给出结果,因此它可能需要是“Where NOT my condition或BaseItemClassID==myBaseItemClassID”


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

是的,我理解,但如果我不能加入,
itemClassCD
不可用,
itemClassID
需要
int
。我试图匹配某种类型的
StartsWith
函数,因为我有一堆分段类,它们以相同的方式开始,应该全部排除。我想你把事情弄得太复杂了。如果您知道ItemClassCD,那么您就知道ItemClassID。Equal必须是包含该值的常量类型,或者是从某处检索该值的电流。InventoryID的选择器应该已经在查找InventoryItem,因此您将限制为InventoryItem上的itemClassID,而不是SOLine。如果您需要它是变量,您可以为INItemClass创建一个视图,而不是将itemClassValue作为常量,您可以使用INItemClass.itemClassID的当前值。您可能是对的。我设法让它为一(1)个项目类工作。然而,这仍然不能解决我想要包含所有子项类的问题。你有解决办法吗?那当然有点复杂。我不知道我会怎么做。我整个下午都在努力获取一组PXRestrictor属性,以根据不同的条件限制位置列表,并注意到您原始帖子的语法问题。是否可以检查
ItemClassID
数组或其他内容?对,我