我在X ++中使用以下代码来获取表名:
client server public static container tableNames()
{
tableId tableId;
int tablecounter;
Dictionary dict = new Dictionary();
container tableNamesList;
for (tablecounter=1; tablecounter<=dict.tableCnt(); tablecounter++)
{
tableId = dict.tableCnt2Id(tablecounter);
tableNamesList = conIns(tableNamesList,1,dict.tableName(tableId));
}
return tableNamesList;
}
业务连接器代码:
tablesList = (AxaptaContainer)Global.ax.
CallStaticClassMethod("Code_Generator", "tableNames");
for (int i = 1; i <= tablesList.Count; i++)
{
tableName = tablesList.get_Item(i).ToString();
tables.Add(tableName);
}
应用程序在获取数据时会挂起2-3分钟。可能是什么原因?任何优化?
答案 0 :(得分:2)
使用+ =,而不是使用CoIns,它会更快
tableNamesList += dict.tableName(tableId);
CoIns必须找出放置插入物的容器中的位置。 + =只是将其添加到最后
答案 1 :(得分:0)
如前所述,在将元素附加到容器时避免使用conIns(),因为它会生成容器的新副本。使用+ =代替追加。
此外,您可能需要检查权限并省略临时表,表映射和其他特殊情况。标准Ax有一种方法来构建一个表名查找表单,将表中的内容考虑在内。检查方法Global :: pickTable()以获取详细信息。
您也可以通过业务连接器避免一些调用,并以类似的方式在Ax中构建整个列表,并在单个函数调用中返回该列表。
答案 2 :(得分:0)
如果您使用的是Dynamics Ax 2012,则可以跳过treeNode内容并使用SysModelElement表获取数据并立即将其作为.Net数组返回,以便在另一端轻松完成。
public static System.Collections.ArrayList FetchTableNames_ModelElementTables()
{
SysModelElement element;
SysModelElementType elementType;
System.Collections.ArrayList tableNames = new System.Collections.ArrayList();
;
// The SysModelElementType table contains the element types
// and we need the recId for the next selection
select firstonly RecId
from elementType
where elementType.Name == 'Table';
// With the recId of the table element type,
// select all of the elements with that type (hence, select all of the tables)
while select Name
from element
where element.ElementType == elementType.RecId
{
tableNames.Add(element.Name);
}
return tableNames;
}
}
答案 3 :(得分:0)
好吧,我尝试了很多东西,最后,我决定创建一个由所有表名组成的表。该表将有一个Job填充它。我从这张表中取出记录。