当在循环中执行insert的时候,AX会给出BP提醒,比如运行下面的代码
1 public static void main(Args _args) 2 { 3 BulkInsertTest bulkInsertTest; 4 5 ttsbegin; 6 for (int i = 0 ; i < 100; i++) 7 { 8 bulkInsertTest.ItemName = "品名" + int2Str(i); 9 bulkInsertTest.insert(); 10 } 11 ttscommit; 12 }
BPCheckInsertMethodInLoop: Insert method can be replaced with RecordInsertList in method main。
BP检查的提醒如上所示,意思很明白,就是在循环里插入的时候考虑用RecordInsertList代替。
改成用RecordInsertList的方式批量插入。
1 public static void main(Args _args) 2 { 3 BulkInsertTest bulkInsertTest; 4 RecordInsertList recordInsertList = new RecordInsertList(tableNum(BulkInsertTest)); 5 6 ttsbegin; 7 for (int i = 0 ; i < 100; i++) 8 { 9 bulkInsertTest.ItemName = "品名" + int2Str(i); 10 recordInsertList.add(bulkInsertTest); 11 } 12 recordInsertList.insertDatabase(); 13 ttscommit; 14 }
RecordInsertList用来批量插入记录,把insert语句批量提交给数据库。
注意这里的insertDataBase,并不是要等到执行这个方法才会提交给数据库,因为如果数据量过大,add方法积攒的insert语句过多
提交给数据库会有问题,Kernel负责判断在合适的时候提交给数据库,所以如果插入的条数很多,可能在add方法执行的时候就已经写入到数据库里了,最后的insertDatabase方法负责把剩余的SQL提交给数据库。
有几种场景会将RecordInsertList降级成一条条插入,比如表的insert方法被覆盖了,表的插入启用了数据库日志记录,在实例化RecordInsertList的时候,可以选择跳过这些。
不过如果insert里执行了很重要的业务逻辑,就不能随便跳过,所以遇到这些BP的时候,要认真分析是否要遵循BP,如果RecordInsertList被降级了,效率肯定比一条条insert还慢。