Acumatica ERP升级中过时类处理:ActiveProject*属性适配咨询
解决Acumatica 5.3 → 17.2升级中ActiveProject*属性替换问题
我刚好处理过类似的跨版本升级场景,针对你遇到的ActiveProjectForModuleAttribute这类旧属性被移除的问题,Acumatica官方在6.x之后的版本已经用更灵活的统一方案替代了这些专用属性,下面是具体的调整步骤和最佳实践:
核心替代:用ProjectAttribute实现等效功能
原来的ActiveProjectForModuleAttribute是针对特定模块筛选活动项目的专用属性,现在已经被整合到通用的ProjectAttribute中,通过参数就能实现完全一致的逻辑。
1. 直接替换属性声明
假设你原来的自定义字段代码是这样的:
[ActiveProjectForModuleAttribute(typeof(APModule))] public abstract class UsrProjectID : IBqlField { }
现在只需要替换成:
[ProjectAttribute(FilterByModule = true)] public abstract class UsrProjectID : IBqlField { }
FilterByModule = true这个参数会自动识别当前操作的模块(比如AP应付、AR应收),只显示该模块启用的活动项目,和旧属性的核心行为完全匹配。
2. 定制化过滤(如果需要额外逻辑)
如果你的业务场景需要更严格的筛选(比如仅显示状态为Active的项目,或者匹配单据本位币的项目),可以通过两种方式实现:
方式一:使用ProjectAttribute的扩展参数
// 同时过滤模块和活动状态,匹配单据本位币 [ProjectAttribute(FilterByModule = true, FilterByBaseCury = true)] public abstract class UsrProjectID : IBqlField { }
FilterByBaseCury = true会自动匹配当前单据的本位币和项目的本位币。
方式二:在事件中手动添加过滤逻辑
如果需要更复杂的自定义规则,可以在DAC的RowSelected事件中动态修改选择器的查询:
protected void MyCustomDAC_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { var row = (MyCustomDAC)e.Row; if (row == null) return; // 获取项目选择器的状态对象 var selectorState = cache.GetStateExt<MyCustomDAC.usrProjectID>(row) as PXSelectorState; if (selectorState != null) { // 仅显示状态为Active的项目 selectorState.Cache.Restrict<PMProject.status>(PMProject.Status.Active); } }
官方推荐的升级最佳实践
根据Acumatica的官方升级文档,这类专用属性的合并是为了统一项目选择的逻辑,减少冗余API:
- 所有模块相关的项目筛选都通过
ProjectAttribute的FilterByModule参数实现 - 通用项目选择直接使用不带参数的
[ProjectAttribute] - 如果需要跨模块的特殊筛选,建议扩展
ProjectAttribute而非重新实现
常见排查点
如果替换后项目列表不符合预期,可以检查这几点:
- 当前操作的模块是否在项目的启用模块列表中(在**Projects (PM301000)**页面查看项目的
Module字段) - 用户是否拥有对应模块的项目访问权限
- 项目的
Status字段是否设置为Active
内容的提问来源于stack exchange,提问作者Tony Lanzer
相关产品推荐
相关产品推荐

