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();

四、其它说明

  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)……
posted @ 2023-03-16 14:59  橙噫i  阅读(197)  评论(0编辑  收藏  举报