2017-04-18 82 views
0

我有ProductLineProductLineItem DAC。产品线包含相关库存物料的集合。带搜索BQL的PXSelector可防止记录删除

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提供尚未添加到当前产品线的活动项目。但是,如果像这样编写选择器,试图从网格中删除项目会显示红色的“x”指示符,但会显示record is never actually removed

改变PXSelector到一个更基本的一个没有搜索2 <> ...

[PXSelector(typeof(InventoryItem.inventoryID), 
    typeof(InventoryItem.inventoryCD), 
    typeof(InventoryItem.descr), 
    SubstituteKey = typeof(InventoryItem.inventoryCD))] 

...记录正常删除。

如何在选择器中使用搜索<> BQL并仍然能够从细节网格中删除记录?

回答

1

问题发生,因为ProductLineItem.InventoryID场是一个关键领域,这个领域不返回为您选择尝试删除ProductLineItem记录InventoryItem定义的BQL搜索的地方。

框架并为删除操作的一部分的第一件事就是调用FieldUpdatingFieldUpdated处理程序全部删除的记录重点领域。在您的情况下,这些处理程序由于PXSelectorAttribute失败,无法找到为删除的ProductLineItem记录选择的InventoryItem。有关更多详细信息,请参见Acumatica API Reference

解决这个issie最简单的方法是修改对ProductLineItem.InventoryID领域BQL搜索返回两个有效的项目没有被添加到选择当前ProductLineItem记录当前的产品线和项目:

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

谢谢鲁斯兰。如果其他人提到这个答案,我会注意到提供的示例代码有一个小错误,即最后一个操作符不应使用Current <>,当然与inventoryID而不是lineID: '或>' –

+0

@NickolasHook,非常感谢您指出 - 我已更新代码以使用ProductLineItem.inventoryID代替。但是我确实认为使用Current <>操作符仍然是必需的。此外,我建议设置** AutoRefresh **为*** True ***,以便在Aspx中进行PXSelector输入,以确保为选定记录显示查找网格的内容。 – RuslanDev