You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Acumatica:修改已编译为DLL的自定义Usr字段下拉选项方法咨询

修改编译后Usr字段的下拉列表选项方案

嘿,我完全懂你碰到的这个麻烦——自定义的Usr字段被编译成DLL了,手里没原始代码没法改,屏幕层级重写PXStringList又没起效。别慌,这里有个靠谱的解决办法,用CacheAttached属性就能在运行时动态修改这个字段的下拉选项,完全不用碰原始DLL。

核心思路

Acumatica的PXCacheAttached属性允许你在现有DAC字段上重写或追加属性,不管这个字段是在系统自带DAC里,还是已经编译成DLL的自定义字段里。它会在缓存初始化时生效,直接覆盖原始字段的StringList设置。

具体步骤

  1. 打开你的自定义项目:在Acumatica的Customization Editor里,找到目标屏幕对应的自定义项目。

  2. 添加代码文件:在左侧菜单的Files下,点击New > Code File,创建一个新的CS文件(比如CustomUsrFieldMods.cs)。

  3. 写入CacheAttached代码:根据你的实际DAC和字段,替换下面的示例代码:

    using PX.Data;
    using PX.Objects.SO; // 替换成你的DAC所在的命名空间
    
    public class SOOrderUsrFieldExtension : PXGraphExtension<SOOrderEntry> // 替换成目标屏幕的Graph类
    {
        // 针对UsrStatus字段重写下拉列表
        [PXCacheAttached(typeof(SOOrder.usrStatus))] // 注意字段抽象类的命名(通常是小写开头的usrXXX)
        [PXStringList(
            new string[] { "NEW", "INPR", "COMP" }, // 实际存储值
            new string[] { "新建", "处理中", "已完成" } // 界面显示文本
        )]
        [PXUIField(DisplayName = "自定义状态")]
        public static void _cacheAttached_UsrStatus(PXCache cache)
        {
            // 这里可以加额外逻辑,比如根据当前用户权限过滤选项
            // 示例:if (!PXAccess.HasPermission(PXAccessLevel.Admin)) { ... }
        }
    }
    
    • 注意:要确保自定义项目引用了包含该Usr字段的DLL(在项目的References里添加对应DLL),并且字段的抽象类名称正确(原始DLL里的字段抽象类一般是usrXXX,和实体属性UsrXXX对应)。
  4. 发布自定义项目:保存代码后发布项目,刷新屏幕就能看到下拉选项已经更新了。

进阶:动态生成下拉选项

如果你的下拉选项需要从其他表读取或者动态生成,可以用cache.SetList方法在CacheAttached里动态赋值:

[PXCacheAttached(typeof(SOOrder.usrStatus))]
[PXString]
[PXUIField(DisplayName = "动态状态")]
public static void _cacheAttached_UsrStatus(PXCache cache)
{
    // 从自定义表读取激活的状态选项
    var statusList = PXSelect<MyStatusTable, Where<MyStatusTable.active, Equal<True>>>
        .Select(cache.Graph)
        .RowCast<MyStatusTable>()
        .Select(row => new string[] { row.StatusCD, row.StatusName })
        .ToList();

    // 将动态生成的列表绑定到字段
    cache.SetList<SOOrder.usrStatus>(statusList);
}

为什么之前的屏幕重写没生效?

大概率是因为没用到PXCacheAttached属性——直接在Graph扩展里定义字段,是不会覆盖原始DLL里的字段属性的。必须通过PXCacheAttached绑定到原始字段上,才能替换它的StringList设置。

内容的提问来源于stack exchange,提问作者Dane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:47:59