如何在 ax 2012 中查找 table 中的所有字段?

How to make lookup of all fields in a table in ax 2012?

我有一个表格,用户可以在 dropdown/combobox 中 select AOT 中任何可用的 table(第 1 条,上面写着销售 table)

现在我想在 table selected 中的所有字段中的第 2 号进行查找。 1. 我需要根据 table 名称来获取它... 我希望查找包含字段的系统名称和字段的标签。 这可能吗?我已经尝试了很多解决方案,但我还没有得到它。

如有任何建议,我们将不胜感激。

查看窗体 SysQueryForm 和 SysQueryFieldLookUp。在那里你可以看到标准是如何处理这个问题的。

我可以立即想到两种主要的方法。反射和使用 SysModelELements table。第一种方式会给你名称和标签,第二种方式不会可靠地给你标签。

第一份工作通过反思证明了这一点。第二个用 SysModelElements tables 显示它,速度更快,但不会给你标签。您可以使用 DictField 对象来枚举标签(如第二种方法所示)。

第一种方法最可靠,因为第二种方法可能会出现一些我没有考虑过的情况,例如 table 视图或地图。

方法一:

static void Job96(Args _args)
{
    str             tableName = 'SalesTable';
    DictTable       dictTable;
    DictField       dictField;
    int             i;

    dictTable = new DictTable(tableName2id(tableName));

    if (dictTable)
    {
        for (i=1; i<=dictTable.fieldCnt(); i++)
        {
            dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(i));
            info(strFmt("Field Name: '%1'; Field Label: '%2'; IsSystem: %3",
                        dictField.name(),
                        dictField.label(),
                        dictField.isSystem()));
        }
    }
    else
    {
        error(strFmt("Table '%1' not found!", tableName));
    }
}

方法二

static void Job97(Args _args)
{
    tableName           tableName = 'SalesTable';
    SysModelElement     tables;
    SysModelElement     fields;
    DictField           dictField;

    while select tables
        where tables.ElementType            == UtilElementType::Table       &&
              tables.Name                   == tableName
        join fields
            where fields.ElementType        == UtilElementType::TableField  &&
                  fields.ParentModelElement == tables.RecId
    {
        dictField = new DictField(tables.AxId, fields.AxId);

        info(strFmt("Field Name: '%1'; Field Label: '%2'; IsSystem: %3",
                        dictField.name(),
                        dictField.label(),
                        dictField.isSystem()));
    }
}

这是我的最终解决方案:

我制作了一个常规 table (TableFieldLookupTmp),其中包含以下字段:tableId、标签和字段。 我从 dicttable 循环插入这个 table。

如果之前已经添加了table,我只做查找。 它工作得很快。

谢谢大家的帮助。

public void lookup()

{

SysTableLookup SysTableLookup;

TableFieldLookupTmp TableFieldLookupTmp;

QueryBuildDataSource queryBuildDataSource;
QueryBuildRange     queryBuildRange;
Query query         = new Query();

tableName           tableName = 'SalesTable';
int tmpTableid =    tablename2id(tableName);
int i;

DictField           dictField;
DictTable dictTable = new DictTable(tableName2id(tableName)); 

if(!(select TableFieldLookupTmp where TableFieldLookupTmp.TablenumId == tmpTableid).recid)
{
    ttsBegin;
    if (dictTable)
    {
        for (i=1; i<=dictTable.fieldCnt(); i++)
        {
            dictField = new DictField(dictTable.id(), dictTable.fieldCnt2Id(i));

            if(subStr(dictField.name(),0,4) == "DEL_")
                continue;
            else
            {
                TableFieldLookupTmp.Label = dictField.label();
                TableFieldLookupTmp.field = dictField.name();
                TableFieldLookupTmp.TableNumId = tmpTableid;
                TableFieldLookupTmp.insert();
            }
        }
    }
    else
    {
        error(strFmt("Table '%1' not found!", tableName));
    }
    ttsCommit;

}


sysTableLookup = SysTableLookup::newParameters(tableNum(TableFieldLookupTmp), this);

sysTableLookup.addLookupField(fieldNum(TableFieldLookupTmp, field));
sysTableLookup.addLookupField(fieldNum(TableFieldLookupTmp, label));

queryBuildDataSource = query.addDataSource(tableNum(TableFieldLookupTmp));
queryBuildDataSource.addSortField(fieldNum(TableFieldLookupTmp, field), SortOrder::Ascending);
queryBuildRange = queryBuildDataSource.addRange(fieldNum(TableFieldLookupTmp, TablenumId));
queryBuildRange.value(int2str(tmpTableid));

//queryBuildRange.value('!DEL_*');

sysTableLookup.parmQuery(query);

sysTableLookup.performFormLookup();

//super();

}