我已向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 )
答案 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; }
}