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

如何获取表字段所使用的EnumType(枚举类型)

X++ 实现方案

你可以通过SqlDictionary表的enumId字段直接获取枚举类型的ID,再关联EnumIdTable和EnumValueTable拿到枚举的名称和所有值。以下是完整代码,能输出目标表的字段名、类型信息(字符串长度/枚举值):

internal final class TableMetadataWithEnums
{
    public static void main(Args _args)
    {
        SqlDictionary       sqlDict;
        EnumIdTable         enumIdTable;
        EnumValueTable      enumValueTable;
        DictTable           dictTable;
        DictField           dictField;
        str                 fieldInfo;
        int                 tabId = 19503; // 替换为你的目标表ID

        dictTable = new DictTable(tabId);
        if (!dictTable)
        {
            error("指定的表ID不存在");
            return;
        }

        // 遍历表的所有字段
        while select sqlDict
            where sqlDict.tabId == tabId
            order by sqlDict.fieldId
        {
            dictField = new DictField(tabId, sqlDict.fieldId);
            if (!dictField) continue;

            switch (sqlDict.fieldType)
            {
                case Types::Enum:
                    // 获取枚举类型信息
                    select firstonly enumIdTable
                        where enumIdTable.enumId == sqlDict.enumId;

                    fieldInfo = strfmt("字段名: %1 | 类型: Enum(%2)", dictField.name(), enumIdTable.name);
                    info(fieldInfo);

                    // 输出枚举所有值
                    while select enumValueTable
                        where enumValueTable.enumId == sqlDict.enumId
                        order by enumValueTable.value
                    {
                        info(strfmt("  枚举值: %1 (%2)", enumValueTable.value, enumValueTable.name));
                    }
                    break;
                case Types::String:
                case Types::VarString:
                    fieldInfo = strfmt("字段名: %1 | 类型: %2 | 长度: %3", dictField.name(), sqlDict.fieldType, sqlDict.fieldSize);
                    info(fieldInfo);
                    break;
                default:
                    fieldInfo = strfmt("字段名: %1 | 类型: %2", dictField.name(), sqlDict.fieldType);
                    info(fieldInfo);
                    break;
            }
        }
    }
}

代码说明:

  • 用SqlDictionary的enumId字段关联到EnumIdTable,拿到枚举类型的名称
  • 通过EnumValueTable根据enumId查询所有枚举值的数值和名称
  • 针对字符串/可变字符串类型,直接读取fieldSize获取长度
  • 用DictField和DictTable辅助获取更友好的字段名和表信息

T-SQL 实现方案

直接查询AX的系统表,不需要X++环境就能获取元数据,同样能拿到字段名、类型、字符串长度和枚举值:

-- 替换为你的目标表ID,这里是19503
DECLARE @TargetTabId INT = 19503;

-- 第一步:获取表的所有字段基础信息,包括枚举ID
WITH TableFields AS (
    SELECT
        f.FIELDID,
        f.NAME AS FieldName,
        f.FIELDTYPE,
        CASE f.FIELDTYPE
            WHEN 0 THEN 'String'
            WHEN 1 THEN 'Integer'
            WHEN 2 THEN 'Real'
            WHEN 3 THEN 'Date'
            WHEN 4 THEN 'Enum'
            WHEN 6 THEN 'UtcDateTime'
            WHEN 8 THEN 'VarString'
            ELSE 'Unknown'
        END AS FieldTypeDesc,
        f.FIELDSIZE,
        f.ENUMID
    FROM SQLDICTIONARY f
    WHERE f.TABID = @TargetTabId
      AND f.FIELDID > 0 -- 排除系统字段
)
-- 第二步:关联枚举表,输出完整信息
SELECT
    tf.FieldName,
    tf.FieldTypeDesc,
    tf.FIELDSIZE AS StringLength,
    e.NAME AS EnumTypeName,
    ev.VALUE AS EnumValue,
    ev.NAME AS EnumValueName
FROM TableFields tf
LEFT JOIN ENUMIDTABLE e ON tf.ENUMID = e.ENUMID
LEFT JOIN ENUMVALUETABLE ev ON tf.ENUMID = ev.ENUMID
ORDER BY tf.FIELDID, ev.VALUE;

查询说明:

  • SQLDICTIONARY存储字段的基础信息,ENUMID字段对应枚举类型的ID
  • ENUMIDTABLE通过ENUMID关联获取枚举类型的名称
  • ENUMVALUETABLE关联获取该枚举的所有值和对应名称
  • 字符串类型的长度直接从FIELDSIZE字段读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:52:27