Acumatica 对未绑定字段中的行总数求和

Acumatica 对未绑定字段中的行总数求和,acumatica,Acumatica,我正在尝试修改PO301000,以便在文档视图中添加一个“总计”未绑定字段,该字段对grid Transaction选项卡上的POLINE的OrderQty求和 我想使用PXUnboundFormula,但字段保持为0 以下是我尝试过的: [PXDecimal] [PXDefault(TypeCode.Decimal, "0.0")] [PXUIField(DisplayName = "Total des lignes")] [PXUnboundFormula(typeof(POLine.ord

我正在尝试修改PO301000,以便在文档视图中添加一个“总计”未绑定字段,该字段对grid Transaction选项卡上的POLINE的OrderQty求和

我想使用PXUnboundFormula,但字段保持为0

以下是我尝试过的:

[PXDecimal]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Total des lignes")]
[PXUnboundFormula(typeof(POLine.orderQty), typeof(SumCalc<POOrderExt.usrTotalLignes>))]
public virtual void POOrder_UsrTotalLignes_CacheAttached(PXCache sender)
{

}
发援会的定义:

public abstract class usrTotalLignes : IBqlField { }
[PXDecimal]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXUIField(DisplayName = "Total des lignes")]
public virtual Decimal? UsrTotalLignes { get; set; }
这似乎奏效了

我还遵循了T100:

protected virtual void POLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
        {
            POLine orderLine = (POLine)e.Row;
            POOrder order = Base.Document.Current;
            POOrderExt orderExt = order.GetExtension<POOrderExt>();
            bool isLineUpdated = false;

            if (orderLine != null)
            {
                orderExt.UsrTotalLignes += orderLine.OrderQty;
                isLineUpdated = true;
            }

            if (isLineUpdated)
            {
                Base.Document.Update(order);
            }
        }

        protected virtual void POLine_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
        {
            POLine newOrderLine = (POLine)e.Row;
            POLine oldOrderLine = (POLine)e.OldRow;
            POOrder order = Base.Document.Current;
            POOrderExt orderExt = order.GetExtension<POOrderExt>();
            bool isLineUpdated = false;

            if (!sender.ObjectsEqual<POLine.orderQty>(newOrderLine, oldOrderLine))
            {
                if (oldOrderLine.OrderQty != null)
                {
                    orderExt.UsrTotalLignes -= oldOrderLine.OrderQty;
                }
                if (newOrderLine.OrderQty != null)
                {
                    orderExt.UsrTotalLignes += newOrderLine.OrderQty;
                }
                isLineUpdated = true;
            }

            if (isLineUpdated)
            {
                Base.Document.Update(order);
            }
        }

        protected virtual void POLine_RowDeleted(PXCache sender, PXRowDeletedEventArgs e)
        {
            POLine orderLine = (POLine)e.Row;
            POOrder order = Base.Document.Current;
            POOrderExt orderExt = order.GetExtension<POOrderExt>();
            bool isLineUpdated = false;

            if (orderLine != null)
            {
                orderExt.UsrTotalLignes -= orderLine.OrderQty;
                isLineUpdated = true;
            }

            if (isLineUpdated)
            {
                Base.Document.Update(order);
            }
        }
而不是

POOrder order = (POOrder)e.Row 
否则,由于某种原因,我不明白,当第一次加载记录时,它工作得很好。然后,当我更改任何包含“提交”的字段时,它再次调用了rowSelectingEvent,这次e.row是列表中的下一个POOrder

知道为什么会这样吗


谢谢

您可以使用已经可用的字段“OrderQty”,但该字段未在UI中公开。您可以直接编辑.aspx文件并替换添加的新字段的DataField=“OrderQty”,或者也可以从定制项目中添加字段。看看下面的截图。

您可以使用已经可用的字段“OrderQty”,但该字段未在UI中公开。您可以直接编辑.aspx文件并替换添加的新字段的DataField=“OrderQty”,或者也可以从定制项目中添加字段。看看下面的截图。

正如John answer提到的,在POLine.OrderQty DAC字段中有一个PXFormula属性,该属性带有一个SumCalc BQL元素,目标是POOrder.OrderQty总字段:

#region OrderQty
public abstract class orderQty : PX.Data.IBqlField
{
}
protected Decimal? _OrderQty;
[PXDBQuantity(typeof(POLineS.uOM), typeof(POLineS.baseOrderQty), HandleEmptyKey = true, BqlField = typeof(POLine.orderQty))]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXFormula(null, typeof(SumCalc<POOrder.orderQty>))]
[PXUIField(DisplayName = "Order Qty.", Visibility = PXUIVisibility.Visible)]
public virtual Decimal? OrderQty
{
    get
    {
        return this._OrderQty;
    }
    set
    {
        this._OrderQty = value;
    }
}
#endregion
#地区订单数量
公共抽象类orderQty:PX.Data.IBqlField
{
}
保护十进制_订单数量;
[PXDBQuantity(typeof(POLineS.uOM)、typeof(POLineS.baseOrderQty)、HandleEmptyKey=true、BqlField=typeof(POLine.orderQty))]
[PXDefault(TypeCode.Decimal,“0.0”)]
[PXFormula(null,typeof(SumCalc))]
[PXUIField(DisplayName=“订单数量”,可见性=PXUIVisibility.Visible)]
公共虚拟十进制?订单数量
{
得到
{
返回此。_OrderQty;
}
设置
{
此._OrderQty=值;
}
}
#端区

有时,您可能需要实现更复杂的逻辑,这不适合简单的公式求和计算

您可以扩展POOrderEntry并在基本事务数据视图上调用Select,以迭代“文档详细信息”选项卡中显示的所有记录,并手动计算每行的OrderQty之和:

public class POOrderEntry_Extension : PXGraphExtension<POOrderEntry>
{      
  public virtual void POOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
  {
      POOrder order = e.Row as POOrder;

      if (order != null)
      {
        sender.SetValue<POOrderExt.usrTotalQuantiteCommande>(order, ComputeQuantiteCommandeTotal());
      }
  }

  public virtual void POOrder_UsrTotalQuantiteCommande_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
  {
      e.ReturnValue = ComputeQuantiteCommandeTotal();
  }

  public virtual decimal ComputeQuantiteCommandeTotal()
  {
      decimal total = 0M;

      foreach (POLine line in Base.Transactions.Select())
      {
          total += (line.OrderQty != null ? line.OrderQty.Value : 0M);
      }

      return total;
  }
}
public类POOrderEntry\u扩展名:PXGraphExtension
{      
公共虚拟无效POOrder_RowSelected(PXCache发送方,PXRowSelectedEventArgs e)
{
POOrder order=e.行作为POOrder;
如果(订单!=null)
{
SetValue(order,ComputeQuantiteCommandeTotal());
}
}
公共虚拟void POOrder\u usrtotatalQuantiteCommande\u字段选择(PXCache发送器,PXFieldSelectingEventArgs e)
{
e、 ReturnValue=ComputeQuantiteCommandeTotal();
}
公共虚拟十进制ComputeQuantiteCommandeTotal()
{
小数总数=0米;
foreach(Base.Transactions.Select()中的POLine行)
{
合计+=(line.OrderQty!=null?line.OrderQty.Value:0M);
}
返回总数;
}
}

正如John answer提到的,在POLine.OrderQty DAC字段中有一个PXFormula属性,该属性带有一个SumCalc BQL元素,目标是POOrder.OrderQty总字段:

#region OrderQty
public abstract class orderQty : PX.Data.IBqlField
{
}
protected Decimal? _OrderQty;
[PXDBQuantity(typeof(POLineS.uOM), typeof(POLineS.baseOrderQty), HandleEmptyKey = true, BqlField = typeof(POLine.orderQty))]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXFormula(null, typeof(SumCalc<POOrder.orderQty>))]
[PXUIField(DisplayName = "Order Qty.", Visibility = PXUIVisibility.Visible)]
public virtual Decimal? OrderQty
{
    get
    {
        return this._OrderQty;
    }
    set
    {
        this._OrderQty = value;
    }
}
#endregion
#地区订单数量
公共抽象类orderQty:PX.Data.IBqlField
{
}
保护十进制_订单数量;
[PXDBQuantity(typeof(POLineS.uOM)、typeof(POLineS.baseOrderQty)、HandleEmptyKey=true、BqlField=typeof(POLine.orderQty))]
[PXDefault(TypeCode.Decimal,“0.0”)]
[PXFormula(null,typeof(SumCalc))]
[PXUIField(DisplayName=“订单数量”,可见性=PXUIVisibility.Visible)]
公共虚拟十进制?订单数量
{
得到
{
返回此。_OrderQty;
}
设置
{
此._OrderQty=值;
}
}
#端区

有时,您可能需要实现更复杂的逻辑,这不适合简单的公式求和计算

您可以扩展POOrderEntry并在基本事务数据视图上调用Select,以迭代“文档详细信息”选项卡中显示的所有记录,并手动计算每行的OrderQty之和:

public class POOrderEntry_Extension : PXGraphExtension<POOrderEntry>
{      
  public virtual void POOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
  {
      POOrder order = e.Row as POOrder;

      if (order != null)
      {
        sender.SetValue<POOrderExt.usrTotalQuantiteCommande>(order, ComputeQuantiteCommandeTotal());
      }
  }

  public virtual void POOrder_UsrTotalQuantiteCommande_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
  {
      e.ReturnValue = ComputeQuantiteCommandeTotal();
  }

  public virtual decimal ComputeQuantiteCommandeTotal()
  {
      decimal total = 0M;

      foreach (POLine line in Base.Transactions.Select())
      {
          total += (line.OrderQty != null ? line.OrderQty.Value : 0M);
      }

      return total;
  }
}
public类POOrderEntry\u扩展名:PXGraphExtension
{      
公共虚拟无效POOrder_RowSelected(PXCache发送方,PXRowSelectedEventArgs e)
{
POOrder order=e.行作为POOrder;
如果(订单!=null)
{
SetValue(order,ComputeQuantiteCommandeTotal());
}
}
公共虚拟void POOrder\u usrtotatalQuantiteCommande\u字段选择(PXCache发送器,PXFieldSelectingEventArgs e)
{
e、 ReturnValue=ComputeQuantiteCommandeTotal();
}
公共虚拟十进制ComputeQuantiteCommandeTotal()
{
小数总数=0米;
foreach(Base.Transactions.Select()中的POLine行)
{
合计+=(line.OrderQty!=null?line.OrderQty.Value:0M);
}
返回总数;
}
}

我既恨你又爱你。但我想知道为什么我的尝试没有成功。如果没有人能帮助我理解我的错误,我会将你的答案标记为接受。你可以直接访问交易选项卡(文档详细信息)数据视图中的记录。使用数据视图选择方法,我添加了一个答案来演示如何。我既恨你,也爱你。但我想知道为什么我的尝试没有成功。如果没有人可以帮助我理解我的错误,我会将您的答案标记为已接受。您可以使用DataView选择方法直接访问事务选项卡(文档详细信息)DataView中的记录,我添加了一个答案以演示如何操作。
POOrder order = (POOrder)e.Row 
#region OrderQty
public abstract class orderQty : PX.Data.IBqlField
{
}
protected Decimal? _OrderQty;
[PXDBQuantity(typeof(POLineS.uOM), typeof(POLineS.baseOrderQty), HandleEmptyKey = true, BqlField = typeof(POLine.orderQty))]
[PXDefault(TypeCode.Decimal, "0.0")]
[PXFormula(null, typeof(SumCalc<POOrder.orderQty>))]
[PXUIField(DisplayName = "Order Qty.", Visibility = PXUIVisibility.Visible)]
public virtual Decimal? OrderQty
{
    get
    {
        return this._OrderQty;
    }
    set
    {
        this._OrderQty = value;
    }
}
#endregion
public class POOrderEntry_Extension : PXGraphExtension<POOrderEntry>
{      
  public virtual void POOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
  {
      POOrder order = e.Row as POOrder;

      if (order != null)
      {
        sender.SetValue<POOrderExt.usrTotalQuantiteCommande>(order, ComputeQuantiteCommandeTotal());
      }
  }

  public virtual void POOrder_UsrTotalQuantiteCommande_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
  {
      e.ReturnValue = ComputeQuantiteCommandeTotal();
  }

  public virtual decimal ComputeQuantiteCommandeTotal()
  {
      decimal total = 0M;

      foreach (POLine line in Base.Transactions.Select())
      {
          total += (line.OrderQty != null ? line.OrderQty.Value : 0M);
      }

      return total;
  }
}