Acumatica 一般查询失败,DAC扩展字段具有PXDBCalced或custom属性
我向ARTran添加了一个DAC扩展,其中包含一个字段,用于提供发票屏幕上显示给用户的折扣单价Acumatica 一般查询失败,DAC扩展字段具有PXDBCalced或custom属性,acumatica,Acumatica,我向ARTran添加了一个DAC扩展,其中包含一个字段,用于提供发票屏幕上显示给用户的折扣单价 public class ARTran_Extension : PXCacheExtension<ARTran> { [PXDecimal] [PXUIField(DisplayName = "Disc Unit Price", Enabled = false)] [PXDefault(TypeCode.Decimal, "0"
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 Left Join ARTran,以及两个参数来指定订单的日期范围。当我查看查询并选择返回记录的日期范围时,它返回一个错误:错误111:处理字段“光盘单价:对象引用未设置为对象实例”时出错
结果网格当前未引用ARTran表中的任何字段。即使内部连接ARTran以确保表中有记录,也会发生这种情况
我系统地消除了元素,并在删除PXDBCalced属性时确定查询成功运行。然后我尝试将其改为使用自定义属性,发现即使添加了自定义属性,即使其中没有功能代码,查询也会再次失败,并出现该错误。即使存在通过自定义属性选择事件代码的字段,也会在其中设置一个断点,该事件永远不会到达
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:处理字段“磁盘单价:对象引用未设置为对象的实例”时出错
System.NullReferenceException:对象引用未设置为对象的实例
at_SetValueByOrdinalTran,Int32,Object,PXCacheExtension[]
在PX.Data.PXCache`1.SetValueByOrdinalTNode数据中,Int32序号,对象值,PXCacheExtension[]扩展名
在PX.Data.PXCache`1.SetValueObject Data,Int32序号,Object value
在PX.Data.PXDBCalcedAttribute.RowSelectingPXCache发送方,PXRowSelectingEventArgs e
在PX.Data.PXCache.onrow选择对象项,PXDataRecord记录,Int32&位置,布尔值为只读
在PX.Data.PXCache.onrow选择对象项,PXDataRecord记录,Int32&位置,布尔值为只读
在PX.Data.PX genericinqgrph.d_u9.MoveNext
在_CustomMethodObject,Object[]
在PX.Data.PXView.InvokeDelegateObject[]参数处
在PX.Data.PXView.SelectObject[]当前、Object[]参数、Object[]搜索、String[]sortcolumns、Boolean[]下降、PXFilterRow[]过滤器、Int32&startRow、Int32 maximumRows、Int32&totalRows
在PX.Data.PXProcessingBase`1.\u选择RecordsIn32 startRow,Int32 maxRows
在PX.Data.Maintenance.GI.GIFilteredProcessing.\u列表
在_CustomMethodObject,Object[]
在PX.Data.PXView.InvokeDelegateObject[]参数处
在PX.Data.PXView.SelectObject[]当前、Object[]参数、Object[]搜索、String[]sortcolumns、Boolean[]下降、PXFilterRow[]过滤器、Int32&startRow、Int32 maximumRows、Int32&totalRows
在PX.Data.PXGraph.ExecuteSelectString视图名、对象[]参数、对象[]搜索、字符串[]排序列、布尔[]下降、PXFilterRow[]过滤器、Int32和startRow、Int32 maximumRows、Int32和totalRows
解决这个问题的一个超级简单的方法是:在Acumatica中,所有DAC字段都必须是可为空的类型,所以一旦您声明您的USRDisCountPrice字段是可为空的类型还是十进制的?类型,您应该准备就绪:
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; }
}