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

获取Data Entity字段类型:字符串长度与枚举名称需求

获取Data Entity字段的类型、字符串长度及枚举信息(X++)

原代码中直接将字段转为字符串后调用typeOf(),只能得到字符串本身的类型,无法获取Data Entity字段的真实元数据。要解决这个问题,需要通过DataEntityViewField类访问字段的完整元数据,结合元数据工具类获取类型、长度和枚举信息。

修正后的代码示例

public static void main(Args _args)
{
    var entityNames = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetDataEntityViewNames();
    var enumerator = entityNames.GetEnumerator();

    while (enumerator.MoveNext())
    {
        str entityName = enumerator.Current;
        Info(strFmt("Data Entity: %1", entityName));

        DataEntityView dataEntity = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetDataEntityView(entityName);
        var fieldsEnumerator = dataEntity.Fields.GetEnumerator();

        while (fieldsEnumerator.MoveNext())
        {
            DataEntityViewField field = fieldsEnumerator.Current;
            str fieldName = field.Name;
            ExtendedDataTypeName dataTypeName = field.DataType;
            Types fieldType = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetExtendedDataTypeType(dataTypeName);

            Info(strFmt("Field: %1, Type: %2", fieldName, enum2Str(fieldType)));

            // 处理字符串类型,获取长度
            if (fieldType == Types::String)
            {
                int stringLength = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetExtendedDataTypeStringSize(dataTypeName);
                Info(strFmt("  String length: %1", stringLength));
            }
            // 处理枚举类型,获取枚举名称及值
            else if (fieldType == Types::Enum)
            {
                EnumId enumId = Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetExtendedDataTypeEnumId(dataTypeName);
                str enumName = enumId2Name(enumId);
                Info(strFmt("  Enum name: %1", enumName));

                // 遍历枚举值与标签
                SysDictEnum dictEnum = new SysDictEnum(enumId);
                for (int i = 0; i < dictEnum.values(); i++)
                {
                    Info(strFmt("    Enum value: %1 - %2", dictEnum.index2Value(i), dictEnum.index2Label(i)));
                }
            }
        }
        break; // 仅演示第一个实体,移除可遍历所有实体
    }
}

关键逻辑说明

  • 获取字段元数据:dataEntity.Fields返回的是DataEntityViewField集合,直接获取该对象可得到字段的名称、扩展数据类型等核心属性,无需转为字符串。
  • 判断字段类型:通过Microsoft.Dynamics.Ax.Xpp.MetadataSupport::GetExtendedDataTypeType(),传入字段的扩展数据类型名称,得到真实的Types枚举类型。
  • 字符串长度获取:使用GetExtendedDataTypeStringSize()方法,基于扩展数据类型名称获取字符串的最大长度。
  • 枚举信息获取:
    1. 通过GetExtendedDataTypeEnumId()获取枚举的ID;
    2. 用enumId2Name()将ID转为枚举名称;
    3. 实例化SysDictEnum遍历枚举的所有值和对应的标签。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:48:12