一、批量插入/创建

使用 record.create() 插入数据时,一次只能插入一条,有多条数据需要插入时只能通过循环的方式,这样效率非常慢,耗时会随着数据量的增大而呈线性增长,有一种巧妙的方式可以进行批量插入:利用父子关系来批量插入,该方式可以显著提升效率,还节约了用量(usage),并且还可以实现事务处理中 commit 跟 rollback 的功能

实现原理:

假设该自定义记录类型为 A,创建一个父记录类型 B( B 没有实际业务意义),建立 A 跟 B 的父子关系,当要多次循环使用 record.create 创建 A 记录时,可以用父子关系的插入方式改为:使用 record.create() 创建 B 记录,使用 record.setSublistValue() 循环设置 A 记录的值,这样只需要使用 record.save() 提交一次记录,大大节约了跟数据库交互的次数

常规插入代码:

var rec = record.create({
type : 'salesorder'
});
rec.setValue({
fieldId : 'entity',
value : header.entity
});
var id = rec.save();

批量插入代码:

var rec = record.create({
type : 'customrecord_test_batch_parent',
isDynamic : false
});
var sublist = 'recmachcustrecord_tb_parent';
for (var i = 0; i < 100; i++) {
  rec.setSublistValue({
      sublistId : sublist,
      fieldId : 'custrecord_tb_name',
      value : 'zs' + i,
      line : i
  });
  rec.setSublistValue({
      sublistId : sublist,
      fieldId : 'custrecord_tb_addr',
      value : 'beijing' + i,
      line : i
  });
  rec.setSublistValue({
      sublistId : sublist,
      fieldId : 'custrecord_tb_email',
      value : i + '@qq.com',
      line : i
  });
}
rec.save();

二、批量更新

var rec = record.create({

  type : 'customrecord_test_batch_parent', 

  isDynamic : false

});

var parentId = rec.save(); 

var parentRec = record.load({

  type : 'customrecord_test_batch_parent',

    id : parentId,

  isDynamic : false

});

var sublist = 'recmachcustrecord_tb_parent';

var idAry = [ 21, 121 ];

for (var i = 0; i < idAry.length; i++) { 

  parentRec.setSublistValue({

  sublistId : sublist, 

    fieldId : 'id',

    value : idAry[i],

    line : i

}); 

  parentRec.setSublistValue({

  sublistId : sublist,

  fieldId : 'custrecord_tb_name', 

    value : 'zs007',

  line : i

}); 

  parentRec.setSublistValue({

  sublistId : sublist,

  fieldId : 'custrecord_tb_addr',

    value : 'beijing007',

  line : i

}); 

  parentRec.setSublistValue({

  sublistId : sublist,

  fieldId : 'custrecord_tb_email', 

    value : '007@qq.com',

  line : i

  }); 

}

parentRec.save();

其中第一个 setSublistValue 的字段是固定为 id,也就是设置内部 id 的值「每一条行数据都是独立的自定义记录」。

特别注意如下几点:

  • 现象:如果不给必输字段赋值,会报“请输入XXX的值”这样的错误,即使要更新的数据这些字段都是有值的也会报

    解决办法:

    A. 每次都给必输字段设置值(用 search.lookupFields() 查出来在赋值上去即可);

    B. 取消必输设置,改为在表格上设置必输
  • 现象:用 setSublistValue 只设置了需要更新字段的值,但是发现有些其他没有赋值字段的值自动清空了

    分析:字段勾选了“在列表中显示”,则该记录作为子列表时,该字段会显示在行上,此时如果未赋值,就会自动清空

    解决办法:

    A. 每次都给这些字段设置值。

    B. 不要勾选“在列表中显示”,需要显示在列表的字段通过视图来配置
  • 现象:类型为“多项选择”的字段,如果没有给他赋值会自动清空

    解决办法:每次都给多项选择字段设置值
  • 现象:非活动字段不能通过父子关系来赋值

    解决办法:暂无

三、批量删除

var subListId = 'recmachcustrecord_tb_parent'; 

var rec = record.create({

  type : 'customrecord_test_batch_parent',

  isDynamic : true

});

var parentId = rec.save();

var parentRec = record.load({

  type : 'customrecord_test_batch_parent', 

    id : parentId,

  isDynamic : true

});

var ids = [ 1, 11 ];

for (var i = 0; i < ids.length; i++) {

  parentRec.selectNewLine({ 

      sublistId : subListId

}); 

  parentRec.setCurrentSublistValue({

  sublistId : subListId,

    fieldId : 'id',

  value : ids[i]

  });

  parentRec.commitLine({

  sublistId : subListId

  });

}

parentRec.save();

// 删除

var currentRec = record.load({

  type : 'customrecord_test_batch_parent',

  id : parentId

});

for (var x = 0; x < currentRec.getLineCount({ sublistId : subListId

});) { 

  currentRec.removeLine({

  sublistId : subListId,

  line : x

  });

} 

currentRec.save();

四、其它说明

  1. 对于日期时间、数值类型的字段,是否勾选“在列表中显示”,批量创建时赋值是会有区别的

    1. 日期类型字段不勾选”在列表中显示“,赋值时会报错"type":"error.SuiteScriptError","name":"DATE_EXPECTED","message":"You entered 'null' into a field where a calendar date was expected.\nPlease go back and change this value to the correct date.”
    2. 小数类型字段赋值需要使用数字字符串,否则赋不上值
  2. parent记录会越来越多,可以在操作完成后删除,操作方式:将头行关联字段设置为“运行相关字段并将其值设置为空”
  3. 子记录不勾选“允许子记录编辑”报错:"type":"error.SuiteScriptError","name":"UNEXPECTED_ERROR","message":null,"stack":["anonymous(N/serverRecordService)……
  4. 父子记录的权限不一致(访问类型不同)报错:"type":"error.SuiteScriptError","name":"UNEXPECTED_ERROR","message":null,"stack":["anonymous(N/serverRecordService)……

NetSuite 开发日记:批量增删改的更多相关文章

  1. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  2. entity framework 5 批量增删改效率优化

    对于数据的批量增删改最慢的就是操作一条就提交一次事务. 以下是对增删改操作的优化测试 同样的300条数据 批量新增只提交一次事务 用时:10673.5444ms 批量新增只提交一次事务并把contex ...

  3. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  4. Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk

    一.批量查询  mget             GET /_mget {   "docs":[       {         "_index":" ...

  5. MYSQL冷知识——ON DUPLICATE KEY 批量增删改

    一 有个需求要批量增删改,并且是混合的,也就是仅不存在才增. 删简单,因为有个deleteStaute之类的字段,删除本质上就是就是一个修改 所以就是实现批量混合增改,然而组长说mysql不支持混合增 ...

  6. Elasticsearch由浅入深(六)批量操作:mget批量查询、bulk批量增删改、路由原理、增删改内部原理、document查询内部原理、bulk api的奇特json格式

    mget批量查询 批量查询的好处就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的 ...

  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-2.使用Mybatis注解开发视频列表增删改查

    笔记 2.使用Mybatis注解开发视频列表增删改查     讲解:使用Mybatis3.x注解方式 增删改查实操, 控制台打印sql语句              1.控制台打印sql语句      ...

  8. 基于gin的golang web开发:mysql增删改查

    Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...

  9. Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)

    在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...

  10. MyBatis批量增删改查操作

      前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...

随机推荐

  1. MindSponge分子动力学模拟——Constraint约束

    技术背景 在前面的几篇博客中,我们已经介绍了MindSponge的基本使用方法,比如定义一个分子系统.计算分子的单点能以及迭代器的使用等.有了这些基础的教程,用户以及可以执行一些比较简单的模拟任务,比 ...

  2. Win10 误删winsock注册表修复。 winsock.reg

    手贱删除了注册表的winsock项, 导致无法上网. 导入后需要重启电脑才能上网, 这个文件是我在别人电脑里导出来的. 下载地址: https://pan.baidu.com/s/1wH8SdeWsx ...

  3. Python基础语法--课程笔记

    Smiling & Weeping ----我的心是旷野的鸟,在你的眼睛里找到了它的天空 定义和使用类: 1.声明类: class类名: 成员变量,成员函数 2.定义类的对象: 对象名 = 类 ...

  4. PYQT5学习(13):QMidArea同时显示多个窗口,创建多个独立的窗口

    QMidArea  参考文章:https://blog.csdn.net/jia666666/article/details/81670569 一种同时显示多个窗口的方法,创建多个独立的窗口,这些独立 ...

  5. Solution -「CF 1303G」Sum of Prefix Sums

    Description Link. 对于一棵树,选出一条链 \((u,v)\),把链上结点从 \(u\) 到 \(v\) 放成一个 长度 \(l\) 的数组,使得 \(\sum_{i=1}^{l}\s ...

  6. pandas -- DataFrame的级联以及合并操作

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...

  7. 【ZT】关于字符集

    utf8 全包容了gbk ,并不是说超集和子集:8i 的数据库 的 utf8 是  4位定长的字符编码:9i 和以上数据库的utf8   有4位定长AL32UTF8和  不定长的  UTF8  ,都是 ...

  8. Merge-Lrc 合并歌词的小工具

    Merge-Lrc 背景 音乐区有群友希望各种乱七八糟的歌词(lrc 格式居多,里面甚至还有翻译)可以整理成单一的文件,或者一个仅翻译的歌词可以和原文的歌词合并.于是就开发了这款工具.地址:https ...

  9. Regions 题解

    Regions 这里提供一种时间复杂度不那么优秀但十分好写也好理解的做法. 题目大意 给定一颗 \(n\) 个节点的树,每个节点拥有一个颜色,进行若干次询问,每次询问给出两种颜色 \(A,B\),求所 ...

  10. excel对比两个文档,判断范围内的取值是否在另一个列表内存在(vlookup函数的使用)

    背景: sheet1表为原始数据: sheet2表为新的数据副本, 目标是查询sheet2列表中是否存在sheet1表的数据,并且标记出来,且获取sheet2列表的一些数据至sheet1列表中,补充D ...