使用搜索过滤 PXselector
Filtering PXselector with search
我有一个使用已声明的自定义 dac 的自定义网格。最初我将 PXselector 属性设置为 POOrder.orderNbr
使用此选择器,它会在我的网格选择器
中获取 所有 POrders
[PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
[PXSelector(typeof(POOrder.orderNbr))]
[PXUIField(DisplayName = "Po#")]
public string Po { get; set; }
public class po : IBqlField { }
但我希望选择器过滤出现在 文档详细信息->POReceiptLine 上的采购订单。我尝试使用搜索进行过滤,但只得到收据上的最低值 POOrder.ordnbr。下面的图片应该能说明我的意思。我希望它显示所有 POOrder.orderNbr 但它只检索第一个最低价值订单。
[PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
[PXSelector(typeof(Search<POOrder.orderNbr,Where<POOrder.orderNbr,Equal<Current2<POReceiptLine.pONbr>>>>))]
[PXUIField(DisplayName = "Po#")]
public string Po { get; set; }
public class po : IBqlField { }
我相信如果你内部加入POReceiptLine DAC,然后聚合相关的采购订单以消除可能的重复会更好:
[PXSelector(typeof(Search5<POOrder.orderNbr,
InnerJoin<POReceiptLine, On<POReceiptLine.pOType, Equal<POOrder.orderType>,
And<POReceiptLine.pONbr, Equal<POOrder.orderNbr>,
And<POReceiptLine.receiptNbr, Equal<Current<POReceipt.receiptNbr>>>>>>,
Aggregate<GroupBy<POOrder.orderType,
GroupBy<POOrder.orderNbr>>>>))]
selector 中的主要问题是您要查找订单号等于当前收据行的 POOrder。这意味着根据 selected 行,值会发生变化,但始终只会产生一个结果。解决方案是改为将条件更改为采购收据文档。
为此,您有两种选择。您可以直接搜索 POReceiptLine.poNbr,然后 select 或将显示 table 中的列,或者您将 POOrder 加入 POReceiptLine。
- 在 POReceiptLine 上搜索
[PXSelector(typeof(Search<POReceiptLine.pONbr,
Where<POReceiptLine.receiptType,
Equal<Optional<POReceipt.receiptType>>,
And<POReceiptLine.receiptNbr,
Equal<Optional<POReceipt.receiptNbr>>>>>), DirtyRead = true)]
- 在 POOrder 上搜索
[PXSelector(typeof(Search2<POOrder.orderNbr,
InnerJoin<POReceiptLine, On<POReceiptLine.pOType,
Equal<POOrder.orderType>,
And<POReceiptLine.pONbr,
Equal<POOrder.orderNbr>>>>,
Where<POReceiptLine.receiptType,
Equal<Optional<POReceipt.receiptType>>,
And<POReceiptLine.receiptNbr,
Equal<Optional<POReceipt.receiptNbr>>>>>))]
还要注意参数DirtyRead = true
。此参数将告诉 selector 获取缓存中的信息,而不仅仅是从数据库中获取信息。因为您正在 select 从同一页面编辑内容,所以您需要先保存整个文档,然后才能 select 记录。不幸的是,它不适用于第二个选项,因为连接是在数据库级别完成的。
我有一个使用已声明的自定义 dac 的自定义网格。最初我将 PXselector 属性设置为 POOrder.orderNbr
使用此选择器,它会在我的网格选择器
中获取 所有 POrders [PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
[PXSelector(typeof(POOrder.orderNbr))]
[PXUIField(DisplayName = "Po#")]
public string Po { get; set; }
public class po : IBqlField { }
但我希望选择器过滤出现在 文档详细信息->POReceiptLine 上的采购订单。我尝试使用搜索进行过滤,但只得到收据上的最低值 POOrder.ordnbr。下面的图片应该能说明我的意思。我希望它显示所有 POOrder.orderNbr 但它只检索第一个最低价值订单。
[PXDBString(50, IsKey = true, IsUnicode = true, InputMask = "")]
[PXSelector(typeof(Search<POOrder.orderNbr,Where<POOrder.orderNbr,Equal<Current2<POReceiptLine.pONbr>>>>))]
[PXUIField(DisplayName = "Po#")]
public string Po { get; set; }
public class po : IBqlField { }
我相信如果你内部加入POReceiptLine DAC,然后聚合相关的采购订单以消除可能的重复会更好:
[PXSelector(typeof(Search5<POOrder.orderNbr,
InnerJoin<POReceiptLine, On<POReceiptLine.pOType, Equal<POOrder.orderType>,
And<POReceiptLine.pONbr, Equal<POOrder.orderNbr>,
And<POReceiptLine.receiptNbr, Equal<Current<POReceipt.receiptNbr>>>>>>,
Aggregate<GroupBy<POOrder.orderType,
GroupBy<POOrder.orderNbr>>>>))]
selector 中的主要问题是您要查找订单号等于当前收据行的 POOrder。这意味着根据 selected 行,值会发生变化,但始终只会产生一个结果。解决方案是改为将条件更改为采购收据文档。
为此,您有两种选择。您可以直接搜索 POReceiptLine.poNbr,然后 select 或将显示 table 中的列,或者您将 POOrder 加入 POReceiptLine。
- 在 POReceiptLine 上搜索
[PXSelector(typeof(Search<POReceiptLine.pONbr,
Where<POReceiptLine.receiptType,
Equal<Optional<POReceipt.receiptType>>,
And<POReceiptLine.receiptNbr,
Equal<Optional<POReceipt.receiptNbr>>>>>), DirtyRead = true)]
- 在 POOrder 上搜索
[PXSelector(typeof(Search2<POOrder.orderNbr,
InnerJoin<POReceiptLine, On<POReceiptLine.pOType,
Equal<POOrder.orderType>,
And<POReceiptLine.pONbr,
Equal<POOrder.orderNbr>>>>,
Where<POReceiptLine.receiptType,
Equal<Optional<POReceipt.receiptType>>,
And<POReceiptLine.receiptNbr,
Equal<Optional<POReceipt.receiptNbr>>>>>))]
还要注意参数DirtyRead = true
。此参数将告诉 selector 获取缓存中的信息,而不仅仅是从数据库中获取信息。因为您正在 select 从同一页面编辑内容,所以您需要先保存整个文档,然后才能 select 记录。不幸的是,它不适用于第二个选项,因为连接是在数据库级别完成的。