2017-04-18 3 views
0

Ich habe ProductLine und ProductLineItem DACs. Eine Produktlinie enthält eine Sammlung von zugehörigen Inventarartikeln.PXSelector mit Suche BQL verhindert das Löschen von Dateien

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 { } 
    // ... 
} 

Diese werden dann in einer sehr einfachen FormDetail-Einstiegsseite implementiert.

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

Der PXSelector auf der ProductLineItem.inventoryID bietet aktive Elemente nicht bereits auf die aktuelle Produktlinie hinzugefügt. Wenn der Selector jedoch wie folgt geschrieben wird, wird beim Versuch, ein Element aus dem Raster zu löschen, der rote "x" Indikator angezeigt, aber der record is never actually removed.

Ändern der PXSelector zu einer grundlegen eine ohne das Search2 <> ...

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

... löschen die Datensätze normal.

Wie kann ich eine Suche <> BQL im Selector verwenden und trotzdem Datensätze aus dem Details Grid löschen?

Antwort

1

Das Problem findet wegen der ProductLineItem.InventoryID Feld ein Schlüsselfeld und die Suche nach diesem Feld nicht den InventoryItem für die ProductLineItem Datensatz ausgewählt definiert BQL wobei Rückkehr Sie zu löschen versuchen.

Das allererste, was der Rahmen hat als Teil des Betrieb Löschen ist FieldUpdating aufzurufen und FieldUpdated Handler für alle Datensatz Schlüsselfelder gelöscht. In Ihrem Fall schlagen diese Handler aufgrund PXSelectorAttribute nicht in der Lage, das InventoryItem ausgewählt für den gelöschten ProductLineItem Datensatz zu finden. Weitere Informationen finden Sie unter Acumatica API Reference.

Der einfachste Weg, um dieses issie zu lösen, ist die BQL Suche auf dem ProductLineItem.InventoryID Feld revidieren sowohl die aktiven Elemente in die aktuellen Produktlinie und das Element für den aktuell ProductLineItem Datensatz ausgewählt hinzugefügt noch nicht zurück :

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

Danke Ruslan. Sollte jemand anderes auf diese Antwort verweisen, werde ich feststellen, dass der Beispielcode einen kleinen Fehler hat, da der letzte Operator nicht Current <> verwenden sollte und natürlich mit InventoryID anstelle von lineID verglichen wird: 'Or > ' –

+0

@NickolasHook, danke, dass du das herausgibst - Ich habe den Code aktualisiert, um stattdessen' ProductLineItem.inventoryID' zu verwenden. Ich glaube jedoch, dass die Verwendung von Current <> noch erforderlich ist. Außerdem würde ich vorschlagen, ** AutoRefresh ** auf *** True *** für den PXSelector-Eingang in Aspx zu setzen, um sicherzustellen, dass der Inhalt des Suchrasters für den ausgewählten Datensatz angezeigt wird. – RuslanDev

Verwandte Themen