在x ++中构建和使用QueryRun

时间:2014-07-28 19:29:32

标签: axapta x++

我需要能够在X ++中动态构建查询。我可以这样做,让它工作。我的问题是:

有没有办法,使用Query类,将整个结果集放在1个缓冲区中。我理解:

While(queryRun.Next())
{
    common = queryRun.get(tableName2Id('InventTable'));
}

但这只是按记录记录。我想要一次完整的结果表。有任何想法吗?我一直在寻找。

由于

3 个答案:

答案 0 :(得分:2)

实际上,这可以做到。我今天想通了。问题是queryRun.next()让你认为这是迭代的唯一方法......实际上如果你这样做:

Common c;
if(queryRun.next())
{
   c = queryRun.get(tableId);
}

while(c)
{
   ...;
   next c;
}

你可以看到queryRun.get()确实获得了整套记录。因此,只要您使用.next()一次,get方法就会实际获取缓冲区中查询返回的每条记录。

希望这对你们有帮助!

答案 1 :(得分:1)

正如10p所说,除了直接SQL之外,不能使用queryRun或AX中的任何其他内容。但即使使用直接SQL,您也必须迭代一个没有表缓冲区的结果集。它处理起来很重,被认为是安全问题。

使用表缓冲区,您将永远不会使用结果集。它非常重要,因为您可以使用AX表进行对象关系映射。因此,您可以一次管理1条记录。

如果你想操作一整套数据,你必须进行批量操作(insert_recorset,update_recordset,delete_from),但你永远不会在AX中拥有整个数据。它将在SQL引擎级别驱动SQL命令。

答案 2 :(得分:0)

缓冲区不能一次有超过1条记录。

您可以使用insert_recordset在一次服务器旅行中将一个或多个表中的数据直接复制到一个结果目标表中。

示例:

InventTable inventTable;
MyInventTable myInventTable;
;

insert_recordset myInventTable (ItemId, Alias)
    select ItemId, NameAlias from inventTable
        where inventTable.ItemType == ItemType::Service;

使用QueryRun无法完成。