带有搜索BQL的PXSelector可防止删除记录

时间:2017-04-18 21:16:31

标签: acumatica

我有 ProductLine ProductLineItem DAC。产品系列包含一组相关的库存项目。

public class ProductLine : IBqlTable
{
    [PXDBIdentity()]
    public virtual int? LineID { get; set; }
    public abstract class lineID : IBqlField { }

    [PXDBString(50, IsKey = true)]
    [PXUIField(DisplayName = "Line ID")]
    [PXDefault]
    [PXSelector(typeof(ProductLine.lineCD),
        typeof(ProductLine.lineCD),
        typeof(ProductLine.description))]
    public virtual string LineCD { get; set; }
    public abstract class lineCD : IBqlField { }
    // ...
}

public class ProductLineItem : IBqlTable
{
    [PXDBInt(IsKey = true)]
    [PXDBDefault(typeof(ProductLine.lineID))]
    [PXParent(typeof(Select<ProductLine,
        Where<ProductLine.lineID,
            Equal<Current<ProductLineItem.lineID>>>>))]
    public virtual int? LineID { get; set; }
    public abstract class lineID : IBqlField { }

    [PXDBInt(IsKey = true)]
    [PXUIField(DisplayName = "Inventory ID")]
    [PXSelector(
        typeof(Search2<InventoryItem.inventoryID,
            LeftJoin<ProductLineItem,
                On<ProductLineItem.lineID, Equal<Current<ProductLineItem.lineID>>,
                    And<ProductLineItem.inventoryID, Equal<InventoryItem.inventoryID>>>>,
            Where<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>,
                And<ProductLineItem.lineID, IsNull>>>),
        new Type[] {
            typeof(InventoryItem.inventoryCD),
            typeof(InventoryItem.descr)
        },
        SubstituteKey = typeof(InventoryItem.inventoryCD))]
    public virtual int? InventoryID { get; set; }
    public abstract class inventoryID : IBqlField { }
    // ...
}

然后在非常简单的FormDetail条目页面中实现它们。

public class ProductLineEntry : PXGraph<ProductLineEntry, ProductLine>
{
    public PXSelect<ProductLine> ProductLines;
    public PXSelect<ProductLineItem,
        Where<ProductLineItem.lineID,
            Equal<Current<ProductLine.lineID>>>> ProductLineItems;
}

ProductLineItem.inventoryID上的PXSelector提供尚未添加到当前产品系列的活动项目。但是,当像这样写入选择器时,尝试从网格中删除项目会导致红色&#34; x&#34;指示符出现但record is never actually removed

在没有Search2&lt;&gt; ...

的情况下将PXSelector更改为更基本的选择器
[PXSelector(typeof(InventoryItem.inventoryID),
    typeof(InventoryItem.inventoryCD),
    typeof(InventoryItem.descr),
    SubstituteKey = typeof(InventoryItem.inventoryCD))]

......记录正常删除。

如何使用搜索&lt;&gt;选择器中的BQL仍然能够从详细信息网格中删除记录吗?

1 个答案:

答案 0 :(得分:1)

问题发生的原因是 ProductLineItem.InventoryID 字段是关键字段,并且为此字段定义的BQL搜索未返回为选择的 InventoryItem ProductLineItem 记录您尝试删除。

该框架作为 删除 操作的一部分,首先要调用 FieldUpdating FieldUpdated 所有已删除记录键字段的处理程序。在您的情况下,由于 PXSelectorAttribute 无法找到为已删除的 ProductLineItem 记录选择的 InventoryItem ,这些处理程序会失败。有关详细信息,请参阅Acumatica API Reference

解决此问题的最简单方法是修改 ProductLineItem.InventoryID 字段中的BQL搜索,以返回尚未添加到当前产品系列的活动项目和为当前选择的项目 ProductLineItem 记录:

Where2<Where<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>,
           And<ProductLineItem.lineID, IsNull>>>,
    Or<InventoryItem.inventoryID, Equal<Current<ProductLineItem.inventoryID>>>>