usrField SOLine 的聚合值不起作用

Aggregate value of usrField SOLine not working

我对从 SOLineExt 上的 usr 字段获取聚合值的方法有点迷茫。我的目标是基于 SOLine 中的此值对用户字段进行简单聚合:

itemExt.UsrMinutes * (int)row.OrderQty;

在 SOLineExt 中,上面的值存储在 UsrMultByQuant 中,它可以很好地获取值,但我似乎无法聚合 SOLineExt 值以将 UsrMultByQuant 的总和放入我名为 UsrTotalWorkMinutes 的 SOOrder 字段中

     [PXDBInt]
     [PXUIField(DisplayName="TotalWorkMinutes")]
     [PXFormula(null, typeof(SumCalc<SOLineExt.usrMultByQuant>))]
     public virtual int? UsrTotalWorkMinutes{get;set;}
    public abstract class usrTotalWorkMinutes : IBqlField{}

我参考了 T200 第 7 课,我还尝试实现一个字段selecting(按照 t300 中第 11.8 课的说明)尝试使用该方法从 SOLineExt table 没有成功。

欢迎任何建议,谢谢

编辑: 我从 PXformula 中删除了空值,现在收到此错误。 我还稍微修改了 dac,使 PXParent 属性为 select 当前 SOLine

[PXDBInt]
[PXUIField(DisplayName="TotalWorkMinutes")]
[PXFormula(typeof(SumCalc<SOLineExt.usrMultByQuant>))]
[PXParent(typeof(Select<SOLine,
                 Where<SOLine.orderNbr, Equal<Current<SOOrder.orderNbr>>>>))]
public virtual int? UsrCuryWorkMinutes{get;set;}
    public abstract class usrCuryWorkMinutes : IBqlField{}

仍然没有计算出我的 SOLineExt 值,并且在删除 null 后我收到了上述错误。

下面的 2 扩展 类 应该足以实现请求的行为(注意,字段 UsrCuryWorkMinutes 和 UsrMultByQuant 是十进制类型):

public class SOOrderExt : PXCacheExtension<SOOrder>
{
    public abstract class usrCuryWorkMinutes : IBqlField { }
    [PXDBDecimal(2)]
    [PXUIField(DisplayName = "Total Work Minutes")]
    public virtual decimal? UsrCuryWorkMinutes { get; set; }
}

public class SOLineExt : PXCacheExtension<SOLine>
{
    public abstract class usrMinutes : IBqlField { }
    [PXDBInt]
    [PXUIField(DisplayName = "Work Minutes")]
    public virtual int? UsrMinutes { get; set; }

    public abstract class usrMultByQuant : IBqlField { }
    [PXDBDecimal(2)]
    [PXUIField(DisplayName = "Total Work Minutes", Enabled = false)]
    [PXFormula(typeof(Mult<IsNull<SOLine.orderQty, decimal0>, SOLineExt.usrMinutes>),
        typeof(SumCalc<SOOrderExt.usrCuryWorkMinutes>))]
    public virtual decimal? UsrMultByQuant { get; set; }
}

SOLineExt 中不需要 PXParentAttribute,因为原始的 SOLine.OrderNbr 字段已经用 PXParentAttribute 修饰以聚合从 SOLine 到 SOOrder 的其他值:

[System.SerializableAttribute()]
[PXCacheName(Messages.SOLine)]
public partial class SOLine : PX.Data.IBqlTable, ILSPrimary, IDiscountable, ISortOrder
{
    ...
    #region OrderNbr
    public abstract class orderNbr : PX.Data.IBqlField
    {
    }
    protected String _OrderNbr;
    [PXDBString(15, IsUnicode = true, IsKey = true, InputMask = "")]
    [PXDBDefault(typeof(SOOrder.orderNbr), DefaultForUpdate = false)]
    [PXParent(typeof(Select<SOOrder, Where<SOOrder.orderType, Equal<Current<SOLine.orderType>>, And<SOOrder.orderNbr, Equal<Current<SOLine.orderNbr>>>>>))]
    [PXUIField(DisplayName = "Order Nbr.", Visible = false, Enabled = false)]
    public virtual String OrderNbr
    {
        ...
    }
    #endregion
    ...
}