通用查询失败,DAC扩展字段包含PXDBCalced或自定义属性

时间:2017-05-18 15:09:16

标签: acumatica

我已向ARTran添加了一个DAC扩展,其中包含一个字段,用于提供折扣单价(在发票屏幕上显示给用户)

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

现在我正在尝试撰写一个简单的通用查询,其中包含SOOrder内部连接SOLine和SOLine左连接ARTran(以及一些参数来指定订单的日期范围)。当我查看查询并选择返回记录的日期范围时,它返回错误:“错误#111:处理字段时发生错误光盘单位价格:对象引用未设置为对象实例。”

结果网格当前不引用ARTran表中的任何字段。即使内部加入ARTran(确保表中有记录),也会发生这种情况。

我系统地删除了元素,并确定何时删除了PXDBCalced属性,查询成功运行。然后我尝试将其更改为使用自定义属性,即使添加了自定义属性,即使其中没​​有功能代码,查询也会再次失败并显示该错误。即使通过自定义属性存在FieldSelecting事件代码,也要在其中设置一个永远不会到达该事件的断点。

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

如何解决此问题的任何细节或建议将不胜感激。

追踪:

  

错误#111:处理字段时发生错误Disc Unit Price:对象引用未设置为对象的实例..

     

System.NullReferenceException:未将对象引用设置为对象的实例。

     

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&amp; position,Boolean isReadOnly)

     

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

     

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

     

at _CustomMethod(Object,Object [])

     

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

     

在PX.Data.PXView.Select(Object [] current,Object []参数,Object []搜索,String [] sortcolumns,Boolean [] descendings,PXFilterRow []过滤器,Int32&amp; startRow,Int32 maximumRows,Int32&amp; ; totalRows)

     

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

     

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

     

at _CustomMethod(Object,Object [])

     

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

     

在PX.Data.PXView.Select(Object [] current,Object []参数,Object []搜索,String [] sortcolumns,Boolean [] descendings,PXFilterRow []过滤器,Int32&amp; startRow,Int32 maximumRows,Int32&amp; ; totalRows)

     

在PX.Data.PXGraph.ExecuteSelect(String viewName,Object []参数,Object []搜索,String [] sortcolumns,Boolean [] descendings,PXFilterRow []过滤器,Int32&amp; startRow,Int32 maximumRows,Int32&amp; totalRows )

1 个答案:

答案 0 :(得分:0)

针对此问题的一个非常简单的解决方法:在Acumatica中,所有DAC字段必须是可以为空的类型,因此一旦声明了Nullable<decimal>类型或decimal?类型的UsrDiscUnitPrice字段,您应该是很高兴:

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; }
}