如何使用PXRestrictor

时间:2018-02-16 07:48:53

标签: acumatica

我一直在玩这个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)
{

}

我收到了错误:

enter image description here

我尝试了Equal和NotEqual条件,但我认为问题在于ARSalesPrice不是图的一部分。我做错了什么?

TIA

1 个答案:

答案 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语句。