2017-04-18 1 views
0

私はProductLineおよびProductLineItem DACを持っています。製品ラインには、関連するインベントリアイテムのコレクションが含まれています。PXSelectorで検索BQLを使用すると、レコードの削除が防止されます

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になります。 Search2 <ことなく、より基本的なものにPXSelectorを変更

> ...

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

...レコードが正常に削除します。

セレクタでSearch <> BQLを使用しても、詳細グリッドからレコードを削除するにはどうすればよいですか?

答えて

1

問題は、キーフィールドと、このフィールドには、削除しようとProductLineItemレコードの選択InventoryItemを返さないために定義されたBQL検索さProductLineItem.InventoryIDフィールドで行われます。

フレームワークはの一環として操作を削除しない非常にまず最初に、FieldUpdatingがすべて削除されたレコードのキーフィールドのハンドラをFieldUpdated呼び出すことがあります。場合によっては、のためにこれらのハンドラが失敗しました。PXSelectorAttributeInventoryItemが削除されました。ProductLineItemレコードで選択されていません。詳細については、Acumatica API Referenceを参照してください。

このissieを解決する最も簡単な方法は、まだ現在の製品ラインと現在のProductLineItem記録のために選択した項目に追加されていないアクティブなアイテムの両方を返すためにProductLineItem.InventoryIDフィールド上BQL検索を修正することです:

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

はあなたにルスランありがとうございます。他の誰かがこの回答を参照する必要がありますが、提供されたサンプルコードには、最後の演算子がCurrent <>を使用すべきではなく、もちろんlineIDの代わりにinventoryIDと比較されるという小さな誤差があります。 'Or > >> –

+0

@NickolasHook、これを指摘していただきありがとうございます。代わりに 'ProductLineItem.inventoryID'を使用するようにコードを更新しました。しかし、私は現在の<>演算子の使用がまだ必要であると信じています。また、** AutoRefresh **を*** True ***に設定して、AspxのPXSelector入力で、検索グリッドの内容が選択したレコードに表示されるようにすることをお勧めします。 – RuslanDev

関連する問題