PXFormula 属性计算不正确
PXFormula attribute isn't calculating correctly
我对销售订单 (SO301000) 屏幕进行了如下自定义:
- 我在 header 部分 (SOOrder) 上创建了一个名为 'Total Revenue' (SOOrderExt.UsrTotalRevenue) 的用户字段:
- 我已将 PXFormula 属性添加到 Ext。网格中的价格字段(SOLine.CuryLineAmt)如下:
这计算正确,直到有人试图复制一个订单来创建另一个订单。发生这种情况时,该值会加倍 - 就好像它是原始订单加上复制的订单的总和。此时,即使您删除复制订单中的订单项,它也会在 header 中保留汇总值。我不知道它会在哪里获得这个价值。我错过了一步吗?我需要在某处添加某种类型的刷新吗?
如果您需要从复制中排除字段值,您可以在数据视图上使用 PXCopyPasteHiddenFieldsAttribute。
这是销售订单条目的当前文档视图。您将需要扩展图表,包括视图,并将您的字段添加到排除字段列表中。类似于我下面的内容...
[PXCopyPasteHiddenFields(typeof(SOOrder.cancelled), typeof(SOOrder.preAuthTranNumber), typeof(SOOrder.ownerID), typeof(SOOrder.workgroupID), typeof(SOOrder.UsrTotalRevenue))]
public PXSelect<SOOrder, Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Current<SOOrder.orderNbr>>>>> CurrentDocument;
sumcalc 公式的工作方式是添加差值,而不是总和。因此,对已经不正常的值进行更改不会 "fix" 它自己。例如,如果您添加一个值为 11 的销售行,它只会添加 11,而不是尝试对所有销售行求和。同样,如果您删除,它只会减去 11。这就是为什么您无法删除用户字段中的行以恢复为零的原因。
编辑:仅供参考,PXCopyPasteHiddenFieldsAttribute 可直接用于 DAC,而不仅仅是图形数据视图 属性。
示例:
[PXCopyPasteHiddenFields(
typeof(MyBaseDacExtension.someField1),
typeof(MyBaseDacExtension.someField2)))]
[PXTable(typeof(MyBaseDac.keyField1), IsOptional = true)]
public class MyBaseDacExtension : PXCacheExtension<MyBaseDac>
{
...
}
Brendan 建议的解决方案肯定会奏效,但它似乎并不能保证基础 SOOrderEntry BLC 中可能发生的变化,并且可能会增加未来的维护成本。
在销售订单屏幕上,none 原始聚合值得到重复,这要归功于 BLC 中实施的 SOOrder_RowSelected 处理程序 - 它确保始终设置启用 属性对于所有基本聚合字段,PXUIFieldAttribute 为 False。这是唯一需要的额外步骤,因为在 SOOrder_RowSelected 处理程序中间调用了 PXUIFieldAttribute.SetEnabled(cache, doc, true);
方法:
public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
...
protected virtual void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
SOOrder doc = e.Row as SOOrder;
if (doc == null)
{
return;
}
...
bool allowAllocation = soordertype.Current != null && soordertype.Current.RequireAllocation != true
|| PXAccess.FeatureInstalled<FeaturesSet.warehouseLocation>()
|| PXAccess.FeatureInstalled<FeaturesSet.lotSerialTracking>()
|| PXAccess.FeatureInstalled<FeaturesSet.subItem>()
|| PXAccess.FeatureInstalled<FeaturesSet.replenishment>()
|| PXAccess.FeatureInstalled<FeaturesSet.sOToPOLink>();
if (doc == null || doc.Completed == true || doc.Cancelled == true || !allowAllocation)
{
PXUIFieldAttribute.SetEnabled(cache, doc, false);
cache.AllowDelete = false;
cache.AllowUpdate = allowAllocation;
...
}
else
{
...
PXUIFieldAttribute.SetEnabled(cache, doc, true);
PXUIFieldAttribute.SetEnabled<SOOrder.refTranExtNbr>(cache, doc, (doc.CreatePMInstance == true || doc.PMInstanceID.HasValue) && isCCPayment && isCashReturn && !isCCRefunded);
PXUIFieldAttribute.SetEnabled<SOOrder.status>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderWeight>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderVolume>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.packageWeight>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnpaidBalance>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyMiscTot>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyFreightCost>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.freightCostIsValid>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyFreightAmt>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.openOrderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.unbilledOrderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyPaymentTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyID>(cache, doc, curyenabled);
PXUIFieldAttribute.SetEnabled<SOOrder.preAuthTranNumber>(cache, doc, enableCCAuthEntering);
PXUIFieldAttribute.SetEnabled<SOOrder.cCPaymentStateDescr>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.cCAuthExpirationDate>(cache, doc, enableCCAuthEntering && String.IsNullOrEmpty(doc.PreAuthTranNumber) == false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyCCPreAuthAmount>(cache, doc, enableCCAuthEntering && String.IsNullOrEmpty(doc.PreAuthTranNumber) == false);
PXUIFieldAttribute.SetEnabled<SOOrder.pCResponseReasonText>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.captureTranNumber>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyCCCapturedAmt>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.origOrderType>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.origOrderNbr>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyVatExemptTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyVatTaxableTotal>(cache, doc, false);
...
}
...
}
...
}
话虽如此,要解决自定义聚合字段值翻倍的问题,您应该按照下面列出的 2 个步骤操作。这些是从粘贴文档时使用的模板中排除自定义聚合字段所必需的。
为 SOOrderEntry BLC 扩展中的 SOOrder DAC 实施 RowSelected 处理程序,以将自定义字段的 PXUIFieldAttribute 的启用 属性 设置为 False:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
var doc = e.Row as SOOrder;
if (doc == null) return;
if (doc != null && doc.Completed != true && doc.Cancelled != true && sender.AllowUpdate)
{
PXUIFieldAttribute.SetEnabled<SOOrderExt.usrTotalRevenue>(sender, doc, false);
}
}
}
对于自定义聚合字段输入控件,在Aspx页面中将Enabled 属性设置为False:
<px:PXNumberEdit DataField=“UsrTotalRevenue” Enabled="False" runat="server" ID="CstPXNumberEdit19" />
关于@Dmitry Kasatsky 分享的问题:周五晚上,Peter 通过电子邮件向我发送了他的自定义设置,我用它来验证上述两步方法。根据报告的情况,未发现 PXFormulaAttribute 和自定义字段存在任何问题。如果您关心 PXFormulaAttribute 和复制粘贴功能,请将基本 OrderQty 字段输入控件的启用 属性 设置为 True(等于默认 属性 值):
<px:PXNumberEdit ID="edOrderQty" runat="server" DataField="OrderQty" Enabled="True" />
并在 SOOrderEntry BLC 扩展中为 SOOrder DAC 实施 RowSelected 处理程序以撤消来自 SOOrderEntry BLC 的 PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(cache, doc, false);
命令:
protected virtual void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
SOOrder soorder = (SOOrder)e.Row;
if (soorder == null) return;
if (soorder != null && soorder.Completed != true && soorder.Cancelled != true && sender.AllowUpdate)
{
PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(sender, soorder, true);
}
}
这将启用订购数量。字段并最终导致复制粘贴文档中的重复值:
为了将来参考,检查文档模板是否包含自定义字段:
重新启动 IIS 或回收应用程序池以清除以前缓存的 Acumatica ScreenInfo
Select 另存为模板... 剪贴板菜单中的选项并验证自定义字段是否存在于生成的文档模板:
请注意:具有 Null 值的字段将始终从文档模板中排除
根据我们今天早些时候与 Peter 的讨论,最初有 2 个不同的场景导致自定义聚合字段值加倍:
当从剪贴板菜单中使用 Copy-Paste 按钮时(在上面的答案中解决):
复制订单操作来自操作 drop-down 按钮:
通过探索 SOOrderentry.CopyOrderProc 方法的源代码,您应该注意到在 Copy Order 函数中有一堆分配了 0
值的字段(其中包括最初在 Sales 上找到的所有聚合字段订单屏幕):
public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
...
public virtual void CopyOrderProc(SOOrder order, CopyParamFilter copyFilter)
{
...
foreach (PXResult<SOOrder, CurrencyInfo> res in PXSelectJoin<SOOrder, InnerJoin<CurrencyInfo, On<CurrencyInfo.curyInfoID, Equal<SOOrder.curyInfoID>>>, Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>.Select(this, order.OrderType, order.OrderNbr))
{
...
SOOrder copyorder = PXCache<SOOrder>.CreateCopy(quoteorder);
...
copyorder.ShipmentCntr = 0;
copyorder.OpenShipmentCntr = 0;
copyorder.OpenLineCntr = 0;
copyorder.ReleasedCntr = 0;
copyorder.BilledCntr = 0;
copyorder.OrderQty = 0m;
copyorder.OrderWeight = 0m;
copyorder.OrderVolume = 0m;
copyorder.OpenOrderQty = 0m;
copyorder.UnbilledOrderQty = 0m;
copyorder.CuryInfoID = neworder.CuryInfoID;
copyorder.Status = neworder.Status;
copyorder.Hold = neworder.Hold;
copyorder.Completed = neworder.Completed;
copyorder.Cancelled = neworder.Cancelled;
copyorder.InclCustOpenOrders = neworder.InclCustOpenOrders;
copyorder.OrderDate = neworder.OrderDate;
copyorder.RequestDate = neworder.RequestDate;
copyorder.ShipDate = neworder.ShipDate;
copyorder.CuryMiscTot = 0m;
copyorder.CuryUnbilledMiscTot = 0m;
copyorder.CuryLineTotal = 0m;
copyorder.CuryOpenLineTotal = 0m;
copyorder.CuryUnbilledLineTotal = 0m;
copyorder.CuryVatExemptTotal = 0m;
copyorder.CuryVatTaxableTotal = 0m;
copyorder.CuryTaxTotal = 0m;
copyorder.CuryOrderTotal = 0m;
copyorder.CuryOpenOrderTotal = 0m;
copyorder.CuryOpenTaxTotal = 0m;
copyorder.CuryUnbilledOrderTotal = 0m;
copyorder.CuryUnbilledTaxTotal = 0m;
...
}
...
}
...
}
要解决复制订单操作中自定义聚合字段值加倍的问题,您应该简单地覆盖 SOOrderEntry BLC 扩展中的 CopyOrderProc 方法,并在订阅 RowSelecting 处理程序的方法内将 0
值分配给遵循基本产品流程的自定义聚合字段:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public delegate void CopyOrderProcDel(SOOrder order, CopyParamFilter copyFilter);
[PXOverride]
public void CopyOrderProc(SOOrder order, CopyParamFilter copyFilter, CopyOrderProcDel del)
{
Base.RowSelecting.AddHandler<SOOrder>((sender, e) =>
{
if (e.Row == null) return;
SOOrderExt orderExt = sender.GetExtension<SOOrderExt>(e.Row);
orderExt.UsrTotalRevenue = 0m;
});
del(order, copyFilter);
}
}
我对销售订单 (SO301000) 屏幕进行了如下自定义:
- 我在 header 部分 (SOOrder) 上创建了一个名为 'Total Revenue' (SOOrderExt.UsrTotalRevenue) 的用户字段:
- 我已将 PXFormula 属性添加到 Ext。网格中的价格字段(SOLine.CuryLineAmt)如下:
这计算正确,直到有人试图复制一个订单来创建另一个订单。发生这种情况时,该值会加倍 - 就好像它是原始订单加上复制的订单的总和。此时,即使您删除复制订单中的订单项,它也会在 header 中保留汇总值。我不知道它会在哪里获得这个价值。我错过了一步吗?我需要在某处添加某种类型的刷新吗?
如果您需要从复制中排除字段值,您可以在数据视图上使用 PXCopyPasteHiddenFieldsAttribute。
这是销售订单条目的当前文档视图。您将需要扩展图表,包括视图,并将您的字段添加到排除字段列表中。类似于我下面的内容...
[PXCopyPasteHiddenFields(typeof(SOOrder.cancelled), typeof(SOOrder.preAuthTranNumber), typeof(SOOrder.ownerID), typeof(SOOrder.workgroupID), typeof(SOOrder.UsrTotalRevenue))]
public PXSelect<SOOrder, Where<SOOrder.orderType, Equal<Current<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Current<SOOrder.orderNbr>>>>> CurrentDocument;
sumcalc 公式的工作方式是添加差值,而不是总和。因此,对已经不正常的值进行更改不会 "fix" 它自己。例如,如果您添加一个值为 11 的销售行,它只会添加 11,而不是尝试对所有销售行求和。同样,如果您删除,它只会减去 11。这就是为什么您无法删除用户字段中的行以恢复为零的原因。
编辑:仅供参考,PXCopyPasteHiddenFieldsAttribute 可直接用于 DAC,而不仅仅是图形数据视图 属性。
示例:
[PXCopyPasteHiddenFields(
typeof(MyBaseDacExtension.someField1),
typeof(MyBaseDacExtension.someField2)))]
[PXTable(typeof(MyBaseDac.keyField1), IsOptional = true)]
public class MyBaseDacExtension : PXCacheExtension<MyBaseDac>
{
...
}
Brendan 建议的解决方案肯定会奏效,但它似乎并不能保证基础 SOOrderEntry BLC 中可能发生的变化,并且可能会增加未来的维护成本。
在销售订单屏幕上,none 原始聚合值得到重复,这要归功于 BLC 中实施的 SOOrder_RowSelected 处理程序 - 它确保始终设置启用 属性对于所有基本聚合字段,PXUIFieldAttribute 为 False。这是唯一需要的额外步骤,因为在 SOOrder_RowSelected 处理程序中间调用了 PXUIFieldAttribute.SetEnabled(cache, doc, true);
方法:
public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
...
protected virtual void SOOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
SOOrder doc = e.Row as SOOrder;
if (doc == null)
{
return;
}
...
bool allowAllocation = soordertype.Current != null && soordertype.Current.RequireAllocation != true
|| PXAccess.FeatureInstalled<FeaturesSet.warehouseLocation>()
|| PXAccess.FeatureInstalled<FeaturesSet.lotSerialTracking>()
|| PXAccess.FeatureInstalled<FeaturesSet.subItem>()
|| PXAccess.FeatureInstalled<FeaturesSet.replenishment>()
|| PXAccess.FeatureInstalled<FeaturesSet.sOToPOLink>();
if (doc == null || doc.Completed == true || doc.Cancelled == true || !allowAllocation)
{
PXUIFieldAttribute.SetEnabled(cache, doc, false);
cache.AllowDelete = false;
cache.AllowUpdate = allowAllocation;
...
}
else
{
...
PXUIFieldAttribute.SetEnabled(cache, doc, true);
PXUIFieldAttribute.SetEnabled<SOOrder.refTranExtNbr>(cache, doc, (doc.CreatePMInstance == true || doc.PMInstanceID.HasValue) && isCCPayment && isCashReturn && !isCCRefunded);
PXUIFieldAttribute.SetEnabled<SOOrder.status>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderWeight>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.orderVolume>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.packageWeight>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnpaidBalance>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyMiscTot>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyFreightCost>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.freightCostIsValid>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyFreightAmt>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.openOrderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyOpenTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.unbilledOrderQty>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledOrderTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledLineTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyUnbilledTaxTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyPaymentTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyID>(cache, doc, curyenabled);
PXUIFieldAttribute.SetEnabled<SOOrder.preAuthTranNumber>(cache, doc, enableCCAuthEntering);
PXUIFieldAttribute.SetEnabled<SOOrder.cCPaymentStateDescr>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.cCAuthExpirationDate>(cache, doc, enableCCAuthEntering && String.IsNullOrEmpty(doc.PreAuthTranNumber) == false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyCCPreAuthAmount>(cache, doc, enableCCAuthEntering && String.IsNullOrEmpty(doc.PreAuthTranNumber) == false);
PXUIFieldAttribute.SetEnabled<SOOrder.pCResponseReasonText>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.captureTranNumber>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyCCCapturedAmt>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.origOrderType>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.origOrderNbr>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyVatExemptTotal>(cache, doc, false);
PXUIFieldAttribute.SetEnabled<SOOrder.curyVatTaxableTotal>(cache, doc, false);
...
}
...
}
...
}
话虽如此,要解决自定义聚合字段值翻倍的问题,您应该按照下面列出的 2 个步骤操作。这些是从粘贴文档时使用的模板中排除自定义聚合字段所必需的。
为 SOOrderEntry BLC 扩展中的 SOOrder DAC 实施 RowSelected 处理程序,以将自定义字段的 PXUIFieldAttribute 的启用 属性 设置为 False:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry> { public void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e) { var doc = e.Row as SOOrder; if (doc == null) return; if (doc != null && doc.Completed != true && doc.Cancelled != true && sender.AllowUpdate) { PXUIFieldAttribute.SetEnabled<SOOrderExt.usrTotalRevenue>(sender, doc, false); } } }
对于自定义聚合字段输入控件,在Aspx页面中将Enabled 属性设置为False:
<px:PXNumberEdit DataField=“UsrTotalRevenue” Enabled="False" runat="server" ID="CstPXNumberEdit19" />
关于@Dmitry Kasatsky 分享的问题:周五晚上,Peter 通过电子邮件向我发送了他的自定义设置,我用它来验证上述两步方法。根据报告的情况,未发现 PXFormulaAttribute 和自定义字段存在任何问题。如果您关心 PXFormulaAttribute 和复制粘贴功能,请将基本 OrderQty 字段输入控件的启用 属性 设置为 True(等于默认 属性 值):
<px:PXNumberEdit ID="edOrderQty" runat="server" DataField="OrderQty" Enabled="True" />
并在 SOOrderEntry BLC 扩展中为 SOOrder DAC 实施 RowSelected 处理程序以撤消来自 SOOrderEntry BLC 的 PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(cache, doc, false);
命令:
protected virtual void SOOrder_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
SOOrder soorder = (SOOrder)e.Row;
if (soorder == null) return;
if (soorder != null && soorder.Completed != true && soorder.Cancelled != true && sender.AllowUpdate)
{
PXUIFieldAttribute.SetEnabled<SOOrder.orderQty>(sender, soorder, true);
}
}
这将启用订购数量。字段并最终导致复制粘贴文档中的重复值:
为了将来参考,检查文档模板是否包含自定义字段:
重新启动 IIS 或回收应用程序池以清除以前缓存的 Acumatica ScreenInfo
Select 另存为模板... 剪贴板菜单中的选项并验证自定义字段是否存在于生成的文档模板:
请注意:具有 Null 值的字段将始终从文档模板中排除
根据我们今天早些时候与 Peter 的讨论,最初有 2 个不同的场景导致自定义聚合字段值加倍:
当从剪贴板菜单中使用 Copy-Paste 按钮时(在上面的答案中解决):
复制订单操作来自操作 drop-down 按钮:
通过探索 SOOrderentry.CopyOrderProc 方法的源代码,您应该注意到在 Copy Order 函数中有一堆分配了 0
值的字段(其中包括最初在 Sales 上找到的所有聚合字段订单屏幕):
public class SOOrderEntry : PXGraph<SOOrderEntry, SOOrder>, PXImportAttribute.IPXPrepareItems
{
...
public virtual void CopyOrderProc(SOOrder order, CopyParamFilter copyFilter)
{
...
foreach (PXResult<SOOrder, CurrencyInfo> res in PXSelectJoin<SOOrder, InnerJoin<CurrencyInfo, On<CurrencyInfo.curyInfoID, Equal<SOOrder.curyInfoID>>>, Where<SOOrder.orderType, Equal<Required<SOOrder.orderType>>, And<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>>.Select(this, order.OrderType, order.OrderNbr))
{
...
SOOrder copyorder = PXCache<SOOrder>.CreateCopy(quoteorder);
...
copyorder.ShipmentCntr = 0;
copyorder.OpenShipmentCntr = 0;
copyorder.OpenLineCntr = 0;
copyorder.ReleasedCntr = 0;
copyorder.BilledCntr = 0;
copyorder.OrderQty = 0m;
copyorder.OrderWeight = 0m;
copyorder.OrderVolume = 0m;
copyorder.OpenOrderQty = 0m;
copyorder.UnbilledOrderQty = 0m;
copyorder.CuryInfoID = neworder.CuryInfoID;
copyorder.Status = neworder.Status;
copyorder.Hold = neworder.Hold;
copyorder.Completed = neworder.Completed;
copyorder.Cancelled = neworder.Cancelled;
copyorder.InclCustOpenOrders = neworder.InclCustOpenOrders;
copyorder.OrderDate = neworder.OrderDate;
copyorder.RequestDate = neworder.RequestDate;
copyorder.ShipDate = neworder.ShipDate;
copyorder.CuryMiscTot = 0m;
copyorder.CuryUnbilledMiscTot = 0m;
copyorder.CuryLineTotal = 0m;
copyorder.CuryOpenLineTotal = 0m;
copyorder.CuryUnbilledLineTotal = 0m;
copyorder.CuryVatExemptTotal = 0m;
copyorder.CuryVatTaxableTotal = 0m;
copyorder.CuryTaxTotal = 0m;
copyorder.CuryOrderTotal = 0m;
copyorder.CuryOpenOrderTotal = 0m;
copyorder.CuryOpenTaxTotal = 0m;
copyorder.CuryUnbilledOrderTotal = 0m;
copyorder.CuryUnbilledTaxTotal = 0m;
...
}
...
}
...
}
要解决复制订单操作中自定义聚合字段值加倍的问题,您应该简单地覆盖 SOOrderEntry BLC 扩展中的 CopyOrderProc 方法,并在订阅 RowSelecting 处理程序的方法内将 0
值分配给遵循基本产品流程的自定义聚合字段:
public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
public delegate void CopyOrderProcDel(SOOrder order, CopyParamFilter copyFilter);
[PXOverride]
public void CopyOrderProc(SOOrder order, CopyParamFilter copyFilter, CopyOrderProcDel del)
{
Base.RowSelecting.AddHandler<SOOrder>((sender, e) =>
{
if (e.Row == null) return;
SOOrderExt orderExt = sender.GetExtension<SOOrderExt>(e.Row);
orderExt.UsrTotalRevenue = 0m;
});
del(order, copyFilter);
}
}