如何在Acumatica AM207500页面配置PXFormulaCombo并保留OnRootFieldsNeeded属性?
解决Acumatica AM207500配置维护界面公式字段缺失字段选择的问题
核心原因
手动在ASPX添加OnRootFieldsNeeded属性后被自动清除,是因为Acumatica会根据DAC(数据访问类)和Graph(业务逻辑类)的元数据自动同步ASPX控件属性,直接修改ASPX的属性会被系统覆盖。
正确实现步骤
1. 在自定义DAC字段中绑定公式编辑器事件
如果你的自定义字段是在DAC中定义的,给字段添加PXFormulaEditorAttribute并指定事件处理方法:
[PXFormulaEditor(RootFieldsNeeded = nameof(MyCustomRootFieldsNeeded))] [PXDecimal(6)] [PXUIField(DisplayName = "自定义公式字段")] public virtual decimal? UsrCustomFormulaField { get; set; } public abstract class usrCustomFormulaField : PX.Data.BQL.BqlDecimal.Field<usrCustomFormulaField> { } // 实现字段选择列表的事件方法 protected virtual IEnumerable MyCustomRootFieldsNeeded(PXCache cache, object item) { // 返回可供选择的字段,参考QtyRequired的逻辑 yield return new PXFormulaField(nameof(AMConfigurationItem.QtyRequired), "需求数量"); yield return new PXFormulaField(nameof(AMConfigurationItem.InventoryID), "物料ID"); // 添加其他需要展示的字段 }
2. 针对DAC扩展字段的Graph事件注册
如果是通过DAC扩展添加的字段,在对应的Graph扩展类中注册事件:
public class AMConfigurationMaint_Extension : PXGraphExtension<AMConfigurationMaint> { public override void Initialize() { base.Initialize(); // 绑定自定义字段的RootFieldsNeeded事件 Base.ConfigurationItem.Cache.GetAttributes<AMConfigurationItemExt.usrCustomFormulaField>(null) .OfType<PXFormulaEditorAttribute>() .FirstOrDefault()?.SetRootFieldsNeededHandler(Base.ConfigurationItem.Cache, nameof(MyCustomRootFieldsNeeded)); } protected virtual IEnumerable MyCustomRootFieldsNeeded(PXCache cache, object item) { // 返回字段列表,示例同上 yield return new PXFormulaField(nameof(AMConfigurationItem.QtyRequired), "需求数量"); yield return new PXFormulaField(nameof(AMConfigurationItem.InventoryID), "物料ID"); } }
3. 通过自定义项目修改ASPX(确保属性不被覆盖)
完成后端事件绑定后,在Acumatica自定义项目中打开AM207500的ASPX,找到自定义字段控件并添加属性:
<px:PXFormulaEditor ID="edUsrCustomFormulaField" runat="server" DataField="UsrCustomFormulaField" OnRootFieldsNeeded="MyCustomRootFieldsNeeded" />
此时后端已注册对应事件,Acumatica会保留该属性,不会自动清除。
关键注意事项
- 必须通过Acumatica自定义项目修改ASPX,不能直接修改服务器原始文件,否则会被系统覆盖。
RootFieldsNeeded方法需返回PXFormulaField对象集合,每个对象对应一个可选字段,包含字段名和显示名称。- 参考标准字段
QtyRequired的实现逻辑,确保返回的字段在当前界面数据源中可用。
内容的提问来源于stack exchange,提问作者Rick
相关产品推荐
相关产品推荐

