Acumatica 一般查询失败,DAC扩展字段具有PXDBCalced或custom属性

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"

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