如何在 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();
}
我有一个表格,用户可以在 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();
}