Acumatica 对未绑定字段中的行总数求和
我正在尝试修改PO301000,以便在文档视图中添加一个“总计”未绑定字段,该字段对grid Transaction选项卡上的POLINE的OrderQty求和 我想使用PXUnboundFormula,但字段保持为0 以下是我尝试过的: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
[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;
}
}