对于多个数据插入,我们有一个有效的方法:RecordSortedList
RecordSortedList rsl;
MyTable myTable;
;
rsl = new RecordSortedList(myTable.tableid);
rsl.sortOrder(fieldname2id(myTable.tableId,'RecId'));
myTable.field1 = 'Value1';
rsl.ins(myTable);
myTable.field1 = 'Value2';
rsl.ins(myTable);
rsl.insertDatabase();
同样可以从db一次性检索多个记录吗?像
这样的东西int i =1;
while(i<10000)
{
//enter records from db into a buffer in db
i++
}
//now bring the buffer from db in a single trip
//and do the data manipulation in AX
我的目的是优化数据库之旅。 请建议。
答案 0 :(得分:2)
是的,它被称为RecordLinkList
- http://msdn.microsoft.com/en-us/library/aa643250(v=ax.50).aspx
recordLinkList是一个可以保存记录的双链表 不同类型的同时。它没有键入或排序。
recordLinkList对于传递记录特别有用 不同的表作为参数而不是检索相同的记录 试。强>
recordSortedList的大小没有限制;它是 程序员有责任控制其规模,因此, 记忆消耗。
您还可以添加不同类型的记录。
static void RecordLinkList(Args _args)
{
RecordLinkList rll = new RecordLinkList();
SalesTable salesTable;
CustTable custTable;
InventTrans inventTrans;
Address address;
boolean iterate;
;
select firstonly salesTable;
select firstonly custTable;
select firstonly inventTrans;
select firstonly address;
rll.ins(salesTable);
rll.ins(custTable);
rll.ins(inventTrans);
rll.ins(address);
iterate = rll.first();
while (iterate)
{
switch (rll.fileId()) // FileId == TableId
{
case tablenum(SalesTable):
salesTable = rll.peek();
info(strfmt("SalesTable");
break;
case tablenum(CustTable):
custTable = rll.peek();
info("CustTable");
break;
case tablenum(InventTrans):
inventTrans = rll.peek();
info("InventTrans");
break;
default:
error(strfmt("Table %1 (%2) not expected", tableid2name(rll.fileId()), rll.fileId()));
}
iterate = rll.next();
}
info("Done");
}
答案 1 :(得分:1)
如上所述的insertDatabase方法(如果您不需要排序顺序,请使用RecordInsertList类而不是RecordSortedList
):
在一次数据库中插入多条记录。
然而,这主要来自程序员的观点。 SQL goes like this中的操作:
INSERT INTO MyTable ( Column1, Column2 )
VALUES ( Value1, Value2 ),
( Value1, Value2 ), ...
以这种方式插入的记录数量有限制,因此AX内核可能会拆分列表以对SQL服务器进行多次调用。
从DB到AX的另一种方式很简单:
while select myTable where ...
将其翻译为SQL:
SELECT T1.Column1, T1.Column2 FROM MyTable T1 WHERE...
这会将表中的数据尽可能高效地传输到AX 。
您可以选择使用QueryRun
对象,但对SQL的调用保持不变。
如果您对表执行简单更新,请考虑使用update_recordset,因为这可能会将更新移至SQL服务器并消除往返。