从AX获取表名的查询耗时太长

时间:2013-02-01 10:27:04

标签: axapta x++

我在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分钟。可能是什么原因?任何优化?

4 个答案:

答案 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填充它。我从这张表中取出记录。