Farseer

导航

D365 FO最佳实践BP(三)-循环插入记录使用RecordInsertList

当在循环中执行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还慢。

posted on 2020-05-21 14:37  佛西亚  阅读(416)  评论(0编辑  收藏  举报