Brendan 建议的解决方案肯定会奏效,但它似乎无法抵御基础 SOOrderEntry BLC 中可能发生的变化,并且可能会增加未来的维护成本。
在销售订单屏幕上,由于在 BLC 中实现了 SOOrder_RowSelected 处理程序,原始聚合值不会重复 - 它确保始终将所有基本聚合字段的 PXUIFieldAttribute 的 Enabled 属性设置为 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 的 Enabled 属性设置为 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 分享的担忧:周五晚上,彼得通过电子邮件向我发送了他的自定义设置,我用它来验证上述两步方法。根据报告的场景,PXFormulaAttribute 和自定义字段没有发现任何问题。如果您关心 PXFormulaAttribute 和 Copy-Paste 功能,请将基本 OrderQty 字段输入控件的 enabled 属性设置为 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
从剪贴板菜单中选择 Save as Template… 选项并验证生成的文档模板中是否存在自定义字段:
请注意:具有 Null 值的字段将始终从文档模板中排除