我一直在玩这个PXRestrictor,我有点失去了如何在当前图表的不相关表上使用它。因此,在销售订单中,我想限制查找屏幕上的项目。我希望我在ARSalesPrice表 NOT 上添加的项目显示在查找屏幕中。我重写了SOline InventoryID的属性,如下所示
[SOLineInventoryItem(Filterable=true)]
[PXDefault()]
[PXRestrictor(typeof(Where<ARSalesPrice.inventoryID,Equal<InventoryItem.inventoryID>>), "RESTRICTION ACTIVATED !!!")]
protected virtual void SOLine_InventoryID_CacheAttached(PXCache cache)
{
}
我收到了错误:
我尝试了Equal和NotEqual条件,但我认为问题在于ARSalesPrice不是图的一部分。我做错了什么?
TIA
答案 0 :(得分:2)
您只能在相同的字段上使用选择器中使用DAC的限制器。最有可能在您的示例中ARSalesPrice
不在SOLine.InventoryID
的选择器中,因此您无法通过此dac进行限制。
您实际上可以在SOLineInventoryItemAttribute
的属性中看到两个正在使用的PXR限制器:
[PXDBInt()]
[PXUIField(DisplayName = "Inventory ID", Visibility = PXUIVisibility.Visible)]
[PXRestrictor(typeof(Where<InventoryItem.itemStatus, NotEqual<InventoryItemStatus.noSales>>), IN.Messages.ItemCannotSale)]
[PXRestrictor(typeof(Where<InventoryItem.itemStatus, NotEqual<InventoryItemStatus.unknown>>), PM.Messages.ReservedForProject)]
public class SOLineInventoryItemAttribute : CrossItemAttribute
{
//...
}
限制器基本上为结果的基本选择器添加where条件,如果限制器的条件为真,则向用户显示提供的错误消息。在您的示例中,您似乎正在尝试执行某种类型的联接,这种联接将无法按照您的方式运行。典型用途是针对某种类型的常量值检查字段值(例如:标记为非卖出的项目Where<InventoryItem.itemStatus, NotEqual<InventoryItemStatus.noSales>>
)。
要完成您需要的操作,您必须完全更改基本选择器(使用您自己的选择器覆盖选择器)并使用限制器作为新选择器表的条件(但您示例中的现有限制器将不起作用)。
使用限制器很好,不限制基本选择器中的值,否则如果where条件在选择器中,则返回值not found error。将条件移动到限制器允许用户知道该值是实际值,但是不允许X条件,其中X是PXRestrictor中的消息。
我相信如果连接结果表明ARSalesPrice表中有记录,那么有一个Exists<>
bql命令可能会给你一个真值。查看Acumatica源代码示例。
此处的参考是销售订单(SOOrder
)dac的另一个示例,它显示了选择器和多个限制器:
[PXSelector(typeof(Search5<SOOrderType.orderType,
InnerJoin<SOOrderTypeOperation, On<SOOrderTypeOperation.orderType, Equal<SOOrderType.orderType>, And<SOOrderTypeOperation.operation, Equal<SOOrderType.defaultOperation>>>,
LeftJoin<SOSetupApproval, On<SOOrderType.orderType, Equal<SOSetupApproval.orderType>>>>,
Aggregate<GroupBy<SOOrderType.orderType>>>))]
[PXRestrictor(typeof(Where<SOOrderTypeOperation.iNDocType, NotEqual<INTranType.transfer>, Or<FeatureInstalled<FeaturesSet.warehouse>>>), ErrorMessages.ElementDoesntExist, typeof(SOOrderType.orderType))]
[PXRestrictor(typeof(Where<SOOrderType.requireAllocation, NotEqual<True>, Or<AllocationAllowed>>), ErrorMessages.ElementDoesntExist, typeof(SOOrderType.orderType))]
[PXRestrictor(typeof(Where<SOOrderType.active,Equal<True>>), null)]
您可以针对不同条件应用多个限制器。在这里,您可以看到带有附加限制器的PXSelector语句。