2017-04-18 58 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