You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetSuite如何向嵌入的SuiteQL Suitelet传递当前记录参数

NetSuite当前记录向嵌入SuiteQL查询传参实现方案

需求可行性

该需求完全可以实现,基于你现有的UserEvent脚本修改即可完成,不需要额外开发独立Suitelet。

现有代码问题

你当前的代码已经成功从请求参数中拿到了当前记录的内部ID,但存在3个核心问题导致参数无法生效:

  • 存在无效取值逻辑:var recordId = runtime.getCurrentScript(); 接口返回的是当前脚本运行对象,无法获取记录ID,属于无效代码
  • 调用sqlQueryRun()函数时,没有将已经拿到的记录ID作为参数传入
  • 编写的SuiteQL语句没有添加对应ID的过滤条件,也没有配置参数绑定

具体修改步骤

  1. 优化记录ID获取逻辑
    视图模式下优先通过context.newRecord.id获取当前记录的内部ID,兼容原有从请求参数取值的逻辑,避免URL参数被篡改或丢失导致的取值异常。
  2. 调整SQL查询函数
    给sqlQueryRun增加入参用于接收关联记录ID,在SuiteQL语句中添加对应业务过滤条件,使用?作为参数占位符,将传入的ID放入params数组完成安全绑定。
  3. 调整函数调用逻辑
    调用sqlQueryRun时传入已获取的当前记录ID,同时根据实际查询返回的字段,调整结果表格的表头和行渲染规则,避免单元格显示为空。

修改后核心代码

beforeLoad 方法

function beforeLoad(context) {
  if (context.type !== context.UserEventType.VIEW) {
    return;
  }

  var suiteqlTab = context.form.addTab({
    id: "custpage_sql_tab",
    label: "SuiteQL Tab",
  });

  context.form.insertTab({
    tab: suiteqlTab,
    nexttab: "items",
  });

  // 优先从记录对象取当前ID,兼容请求参数取值
  var currentRecordId = context.newRecord.id || context.request.parameters.id;
  log.debug({
    title: "currentRecordId",
    details: currentRecordId,
  });

  var recordField = context.form.addField({
    id: "custpage_suiteql_record",
    type: serverWidget.FieldType.TEXT,
    label: "SuiteQL Record",
    container: "custpage_sql_tab",
  });
  recordField.defaultValue = currentRecordId;

  var suiteqlField = context.form.addField({
    id: "custpage_suiteql_field",
    type: serverWidget.FieldType.TEXT,
    label: "SuiteQL Query Results",
    container: "custpage_sql_tab",
  });

  // 传入记录ID执行查询
  var records = sqlQueryRun(currentRecordId);

  context.newRecord.setValue({
    fieldId: "custpage_suiteql_field",
    value: sqlResultsTableGenerate(records),
  });
}

sqlQueryRun 方法

注意:以下SQL示例为查询关联当前实体记录(客户/供应商等)的销售订单,你需要根据标签挂载的记录类型调整WHERE后的关联字段:如果标签直接挂在销售订单记录上,过滤条件改为WHERE Transaction.type = 'SalesOrd' AND Transaction.id = ?即可。

function sqlQueryRun(relatedRecordId) {
  var sql = `   
        SELECT
        Transaction.type,
        Transaction.tranid
        FROM
        Transaction
        WHERE Transaction.type = 'SalesOrd'
        AND Transaction.entity = ?
    `;

  // 按?占位符顺序传入参数,完成安全绑定
  return query.runSuiteQL({ 
    query: sql, 
    params: [relatedRecordId] 
  }).asMappedResults();
}

注意事项

  • SuiteQL的参数绑定必须严格匹配?占位符的顺序,顺序错误会导致查询结果异常
  • 禁止直接将ID拼接到SQL字符串中,使用内置参数绑定能力可以避免SQL注入风险,也不需要额外处理特殊字符转义
  • 你原有代码中表格表头定义的姓氏、名字、邮箱、电话字段,和Transaction表查询返回的字段不匹配,需要根据实际查询的字段调整表头和行渲染逻辑,否则对应单元格会显示为空

内容的提问来源于stack exchange,提问作者Vernita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:45:19