NetSuite 开发日记:批量增删改
一、批量插入/创建
使用 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();
四、其它说明
- 对于日期时间、数值类型的字段,是否勾选“在列表中显示”,批量创建时赋值是会有区别的
- 日期类型字段不勾选”在列表中显示“,赋值时会报错:
"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.” - 小数类型字段赋值需要使用数字字符串,否则赋不上值
- 日期类型字段不勾选”在列表中显示“,赋值时会报错:
- parent记录会越来越多,可以在操作完成后删除,操作方式:将头行关联字段设置为“运行相关字段并将其值设置为空”
- 子记录不勾选“允许子记录编辑”报错:
"type":"error.SuiteScriptError","name":"UNEXPECTED_ERROR","message":null,"stack":["anonymous(N/serverRecordService)…… - 父子记录的权限不一致(访问类型不同)报错:
"type":"error.SuiteScriptError","name":"UNEXPECTED_ERROR","message":null,"stack":["anonymous(N/serverRecordService)……
NetSuite 开发日记:批量增删改的更多相关文章
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- entity framework 5 批量增删改效率优化
对于数据的批量增删改最慢的就是操作一条就提交一次事务. 以下是对增删改操作的优化测试 同样的300条数据 批量新增只提交一次事务 用时:10673.5444ms 批量新增只提交一次事务并把contex ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk
一.批量查询 mget GET /_mget { "docs":[ { "_index":" ...
- MYSQL冷知识——ON DUPLICATE KEY 批量增删改
一 有个需求要批量增删改,并且是混合的,也就是仅不存在才增. 删简单,因为有个deleteStaute之类的字段,删除本质上就是就是一个修改 所以就是实现批量混合增改,然而组长说mysql不支持混合增 ...
- Elasticsearch由浅入深(六)批量操作:mget批量查询、bulk批量增删改、路由原理、增删改内部原理、document查询内部原理、bulk api的奇特json格式
mget批量查询 批量查询的好处就是一条一条的查询,比如说要查询100条数据,那么就要发送100次网络请求,这个开销还是很大的如果进行批量查询的话,查询100条数据,就只要发送1次网络请求,网络请求的 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_3-2.使用Mybatis注解开发视频列表增删改查
笔记 2.使用Mybatis注解开发视频列表增删改查 讲解:使用Mybatis3.x注解方式 增删改查实操, 控制台打印sql语句 1.控制台打印sql语句 ...
- 基于gin的golang web开发:mysql增删改查
Go语言访问mysql数据库需要用到标准库database/sql和mysql的驱动.标准库的Api使用比较繁琐这里再引入另一个库github.com/jmoiron/sqlx. go get git ...
- Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- MyBatis批量增删改查操作
前文我们介绍了MyBatis基本的增删该查操作,本文介绍批量的增删改查操作.前文地址:http://blog.csdn.net/mahoking/article/details/43673741 ...
随机推荐
- PowerShell收集信息及绕过PowerShell权限
PowerShell脚本的4种执行权限: Restricted:默认设置,不允许任何script运行 AllSigned:只能运行经过数字证书签名的script RemoteSigned:本地脚本不做 ...
- RPG MAKER MV 打包APK教程(一键打包,无需编写任何代码)
HTML一键打包APK工具可以快速打包RPG Maker制作出来的游戏, 打包教程如下: 打包软件下载地址: 点击进入下载页面 打包步骤 1.准备好待打包的RPG Maker项目,放在系统的某一目录下 ...
- Field 'xxxxxx' doesn't have a default value 错误的解决办法
在写web项目的时候,出现 Field 'xxxxx' doesn't have a default value 这个错误,直接找到你的数据库,然后打开设计表,看下面自增递增是否勾选上了,如果没有勾上 ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
在我们创建界面元素的时候,不管在Vue3+ElementPlus的前端上,还是Winform桌面端上,都是会利用自定义用户控件来快速重用一些自定义的界面内容,对自定义用户控件的封装处理,也是我们开发W ...
- 分布式环境下Session共享问题解决和原理讲解
1.分布式环境下Session共享问题: 2.几种解决方法 3.通过后端统一存储方法在实际项目中问题的体现: 当session的作用域只限于auth.gulimall.com时,在auth.gulim ...
- MySQL高级12-事务原理
一.事务概念 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或者撤销请求操作,即这些操作要么同时成功,要么同时失败. 二.事务特性 原子性(Atomici ...
- 使用SpringBoot开发一个POST接口
SpringBoot项目的分层 SpringBoot框架项目一般分为五层: View层:向用户展示页面 Controller层:前后端交互层,接收前端请求,调用Service层中的方法,接收Servi ...
- LSP 链路状态协议
转载请注明出处: 链路状态协议(Link State Protocol)是一种在计算机网络中用于动态计算路由的协议.它的主要作用是收集网络拓扑信息,为每个节点构建一个准确的网络图,并基于这些信息计算出 ...
- OSPF常用配置和常用的查看命令
转载请注明出处: 1.启动OSPF进程,进入OSPF视图. [Huawei] ospf [ process-id | Router ID Router ID ] 路由器支持OSPF多进程,进程号是本地 ...
- js数据结构--散列表
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...