2017-05-18 2 views
0

ich eine DAC-Erweiterung hinzugefügt habe mit einem Feld Artran den Discount Einheitspreis (für den Benutzer auf dem Rechnung Bildschirm angezeigt), umAllgemeine Anfrage nicht mit DAC Erweiterungsfeld mit PXDBCalced oder benutzerdefiniertem Attribute

public class ARTran_Extension : PXCacheExtension<ARTran> 
{ 
    [PXDecimal] 
    [PXUIField(DisplayName = "Disc Unit Price", Enabled = false)] 
    [PXDefault(TypeCode.Decimal, "0")] 
    [PXDBCalced(typeof(Div<Mult<IsNull<ARTran.curyUnitPrice, Zero>, Sub<_100Percents, IsNull<ARTran.discPct, Zero>>>, _100Percents>), typeof(decimal))] 
    public virtual decimal UsrDiscUnitPrice { get; set; } 
    public abstract class usrDiscUnitPrice : IBqlField { } 
} 

Jetzt Ich versuche eine einfache generische Anfrage zu verfassen, die SOOrder Inner Join SOLine und SOLine Left Join ARTran hat (und einige Parameter, um einen Datumsbereich von Aufträgen anzugeben). Wenn ich die Anfrage anzeigen und einen Datumsbereich auswähle, der Datensätze zurückgibt, gibt es einen Fehler zurück: "Fehler # 111: Fehler beim Verarbeiten des Felds Disc Unit Price: Objektreferenz wurde nicht auf eine Instanz eines Objekts gesetzt."

Das Ergebnisraster referenziert derzeit keine Felder aus der ARTran-Tabelle. Dies tritt auch beim internen Verbinden von ARTran auf (wobei sichergestellt wird, dass Datensätze aus der Tabelle vorhanden sind).

Ich systematisch Elemente eliminiert und identifiziert, wenn das PXDBCalced-Attribut entfernt wird die Abfrage erfolgreich ausgeführt. Ich habe dann versucht, es so zu ändern, dass ein benutzerdefiniertes Attribut verwendet wurde. Selbst wenn ein benutzerdefiniertes Attribut hinzugefügt wurde, auch wenn es keinen funktionalen Code enthält, schlägt die Abfrage erneut mit diesem Fehler fehl. Selbst wenn über das benutzerdefinierte Attribut FieldSelecting-Ereigniscode vorhanden ist, wird nie ein Haltepunkt innerhalb dieses Ereignisses festgelegt.

public class ARTranDiscUnitPriceAttribute : PXEventSubscriberAttribute, IPXFieldSelectingSubscriber 
{ 
    public virtual void FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e) 
    { 
     /* 
     ARTran artran = (ARTran)e.Row; 
     if (artran == null) return; 
     e.ReturnValue = (artran.CuryUnitPrice ?? 0) * (100 - (artran.DiscPct ?? 0))/100; 
     */ 
    } 
} 

public class ARTran_Extension : PXCacheExtension<ARTran> 
{ 
    [PXDecimal] 
    [PXUIField(DisplayName = "Disc Unit Price")] 
    [PXDefault(TypeCode.Decimal, "0")] 
    [ARTranDiscUnitPrice] 
    public virtual decimal UsrDiscUnitPrice { get; set; } 
    public abstract class usrDiscUnitPrice : IBqlField { } 
} 

Alle Details oder Vorschläge zur Lösung dieses Problems wären sehr willkommen.

Der Trace:

Error #111: An error occurred while processing the field Disc Unit Price : Object reference not set to an instance of an object..

System.NullReferenceException: Object reference not set to an instance of an object.

at _SetValueByOrdinal(ARTran , Int32 , Object , PXCacheExtension[])

at PX.Data.PXCache`1.SetValueByOrdinal(TNode data, Int32 ordinal, Object value, PXCacheExtension[] extensions)

at PX.Data.PXCache`1.SetValue(Object data, Int32 ordinal, Object value)

at PX.Data.PXDBCalcedAttribute.RowSelecting(PXCache sender, PXRowSelectingEventArgs e)

at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly)

at PX.Data.PXCache.OnRowSelecting(Object item, PXDataRecord record, Int32& position, Boolean isReadOnly)

at PX.Data.PXGenericInqGrph.d__9.MoveNext()

at _CustomMethod(Object , Object[])

at PX.Data.PXView.InvokeDelegate(Object[] parameters)

at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows)

at PX.Data.PXProcessingBase`1._SelectRecords(Int32 startRow, Int32 maxRows)

at PX.Data.Maintenance.GI.GIFilteredProcessing._List()

at _CustomMethod(Object , Object[])

at PX.Data.PXView.InvokeDelegate(Object[] parameters)

at PX.Data.PXView.Select(Object[] currents, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows)

at PX.Data.PXGraph.ExecuteSelect(String viewName, Object[] parameters, Object[] searches, String[] sortcolumns, Boolean[] descendings, PXFilterRow[] filters, Int32& startRow, Int32 maximumRows, Int32& totalRows)

Antwort

0

Ein super einfache Lösung für dieses Problem: in Acumatica alle DAC-Felder eines Nullable-Typ sein muss, so dass, sobald Sie Ihr UsrDiscUnitPrice Feld des Nullable<decimal> Typ oder der decimal? Typ deklarieren, Sie sollten gut gehen:

public class ARTran_Extension : PXCacheExtension<ARTran> 
{ 
    public abstract class usrDiscUnitPrice : IBqlField { } 

    [PXDecimal] 
    [PXUIField(DisplayName = "Disc Unit Price")] 
    [PXDefault(TypeCode.Decimal, "0")] 
    [ARTranDiscUnitPrice] 
    public virtual decimal? UsrDiscUnitPrice { get; set; } 
} 
+0

Wow. Ich kann nicht glauben, dass ich das nicht bemerkt habe. Danke, Ruslan. –

Verwandte Themen