如何获取表字段所使用的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字段对应枚举类型的IDENUMIDTABLE通过ENUMID关联获取枚举类型的名称ENUMVALUETABLE关联获取该枚举的所有值和对应名称- 字符串类型的长度直接从
FIELDSIZE字段读取
内容的提问来源于stack exchange,提问作者Mohammad Yusuf
相关产品推荐
相关产品推荐

