zoukankan      html  css  js  c++  java
  • 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还慢。

  • 相关阅读:
    Java数据类型转换
    github的入门使用
    移动端的头部标签和meta
    gulp&gulp-less
    前端工程筹建NodeJs+gulp+bower
    jQuery 遍历
    JavaScript for...in 语句
    console.log在线调试
    sessionStorage html5客户端本地存储之sessionStorage及storage事件
    一个页面从输入url到加载完成的过程都发生了什么,请详细说明
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/12929020.html
Copyright © 2011-2022 走看看