如何在Suitelet中实现搜索筛选?解决SSS_INVALID_SRCH_FILTER错误
NetSuite Suitelet SSS_INVALID_SRCH_FILTER错误修复
问题说明
编写的NetSuite Suitelet代码触发SSS_INVALID_SRCH_FILTER错误,核心问题是Suitelet加载时,未输入日期参数就直接进入日期筛选分支,导致筛选器无有效值触发报错。
核心错误原因
- 日期筛选分支的判断条件错误:原代码用
(startdate)&&(enddate)判断的是表单字段对象,而非请求中的日期参数值。页面加载时startdate和enddate是已创建的字段对象,永远不为空,所以会直接进入日期搜索逻辑。 - 搜索日期格式不符合NetSuite要求:NetSuite日期筛选需使用
MM/DD/YYYY格式,原代码中硬编码的09/12/2022是日/月/年格式,会导致筛选无效。 - 缺少子列表创建代码:
mysublist未定义就直接调用,会触发额外错误。 - POST部分字段赋值错误:两次调用
setValue都用了custrecord_advs_first_name,导致 lastName 无法正确保存。 - 页面渲染顺序错误:原代码先执行
Response.writePage(form)再设置clientScriptFileId,导致客户端脚本无法生效。
修复后的完整代码
/** *@NApiVersion 2.x *@NScriptType Suitelet */ define(['N/record','N/ui/serverWidget','N/redirect','N/runtime','N/search','N/url'],function(record,serverWidget,redirect,runtime,search,url){ function onRequest(context){ var request = context.request; var response = context.response; if(request.method == 'GET') { // 创建表单 var form = serverWidget.createForm({title:"Customer entry Suitelet"}); form.clientScriptFileId = 91375; // 先设置客户端脚本再渲染页面 // 添加字段组 var primaryinfo = form.addFieldGroup({ label:'Primary Information', id:'custpage_advs_primary_info' }); // 添加字段 var firstname = form.addField({ label:'First Name', id:'custpage_advs_first_name', type:serverWidget.FieldType.TEXT, container:'custpage_advs_primary_info' }); firstname.isMandatory = true; var lastname = form.addField({ label:'Last Name', id:'custpage_advs_last_name', type:serverWidget.FieldType.TEXT, container:'custpage_advs_primary_info' }); lastname.isMandatory = true; var startdate = form.addField({ label:'Start Date', id:'custpage_advs_start_date', type:serverWidget.FieldType.DATE, container:'custpage_advs_primary_info' }); var enddate = form.addField({ label:'End Date', id:'custpage_advs_end_date', type:serverWidget.FieldType.DATE, container:'custpage_advs_primary_info' }); // 添加提交按钮 form.addSubmitButton({ id : 'custpage_advs_submit_record', label : 'Submit' }); // 创建子列表(修复mysublist未定义问题) var mysublist = form.addSublist({ id: 'custpage_advs_sublist', type: serverWidget.SublistType.LIST, label: 'Customer Records' }); // 子列表字段 mysublist.addField({ id: 'custpage_advs_sublist_internalid', type: serverWidget.FieldType.TEXT, label: 'Internal ID' }); mysublist.addField({ id: 'custpage_advs_sublist_fname', type: serverWidget.FieldType.TEXT, label: 'First Name' }); mysublist.addField({ id: 'custpage_advs_sublist_lname', type: serverWidget.FieldType.TEXT, label: 'Last Name' }); mysublist.addField({ id: 'custpage_advs_sublist_view', type: serverWidget.FieldType.INLINEHTML, label: 'View' }); // 获取请求参数 var fnameValue = request.parameters.custpage_advs_first_name; // 修正参数ID,原代码用了custparam_前缀,和表单字段ID不符 var startDateValue = request.parameters.custpage_advs_start_date; var endDateValue = request.parameters.custpage_advs_end_date; // 按姓名筛选逻辑 if(fnameValue) { var fnamecustomerSearch = search.create({ type:'customrecord_advs_customer_entry_form', filters:['custrecord_advs_first_name','startswith',fnameValue], columns:[ search.createColumn({name: "name"}), search.createColumn({name: "custrecord_advs_first_name"}), search.createColumn({name: "custrecord_advs_last_name"}), search.createColumn({name: "id"}), search.createColumn({name:"created"}) ] }); var counter = 0; fnamecustomerSearch.run().each(function(result) { var internalidVal = result.getValue('internalid'); var firstnameVal = result.getValue('custrecord_advs_first_name'); var lastnameVal = result.getValue('custrecord_advs_last_name'); var recordid = result.id; const view_url = url.resolveRecord({ recordType:'customrecord_advs_customer_entry_form', recordId: recordid, isEditMode: false }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_internalid', line: counter, value: internalidVal }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_fname', line: counter, value: firstnameVal }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_lname', line: counter, value: lastnameVal }); mysublist.setSublistValue({ line: counter, id: 'custpage_advs_sublist_view', value:"<a href='"+view_url+"' target='_blank'>View</a>" }); counter++; return true; }); } // 按日期筛选逻辑:仅当两个日期参数都存在时执行 else if(startDateValue && endDateValue) { var datecustomerSearch = search.create({ type:'customrecord_advs_customer_entry_form', filters:[ ["created","onorafter", startDateValue], // 使用请求参数中的日期,而非硬编码 'and', ["created",'onorbefore', endDateValue], // 改用onorbefore更符合需求 'and', ['mainline','is',true] ], columns:[ search.createColumn({name: "custrecord_advs_first_name"}), search.createColumn({name: "custrecord_advs_last_name"}), search.createColumn({name: "id"}), search.createColumn({name:"created"}) ] }); var counter = 0; datecustomerSearch.run().each(function(result) { var internalidVal = result.getValue('internalid'); var firstnameVal = result.getValue('custrecord_advs_first_name'); var lastnameVal = result.getValue('custrecord_advs_last_name'); var recordid = result.id; const view_url = url.resolveRecord({ recordType:'customrecord_advs_customer_entry_form', recordId: recordid, isEditMode: false }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_internalid', line: counter, value: internalidVal }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_fname', line: counter, value: firstnameVal }); mysublist.setSublistValue({ id: 'custpage_advs_sublist_lname', line: counter, value: lastnameVal }); mysublist.setSublistValue({ line: counter, id: 'custpage_advs_sublist_view', value: "<a href='"+view_url+"' target='_blank'>View</a>" }); counter++; return true; }); } // 最后渲染页面 response.writePage(form); } else { // POST 请求处理 var fname = request.parameters.custpage_advs_first_name; var lname = request.parameters.custpage_advs_last_name; var customRecord = record.create({ type:'customrecord_advs_customer_entry_form', isDynamic:true }); customRecord.setValue({ fieldId:'custrecord_advs_first_name', value:fname }); // 修复字段ID错误,改为lastname的字段ID customRecord.setValue({ fieldId:'custrecord_advs_last_name', value:lname }); var recordId = customRecord.save({ enableSourcing: false, ignoreMandatoryFields: false }); redirect.toSuitelet({ scriptId: 'customscript_advs_ss_editviewcolumn', deploymentId: 'customdeploy_advs_ss_editviewcolumn' }); } } return { onRequest:onRequest }; });
关键修复点说明
- 日期参数判断修正:改为判断请求中的
startDateValue和endDateValue,只有当用户提交了有效日期时才执行日期筛选。 - 搜索日期逻辑优化:去掉硬编码日期,直接使用用户提交的参数,同时将
before改为onorbefore,确保结束日期当天的记录也能被筛选到。 - 子列表定义补充:添加了子列表及其字段的创建代码,避免
mysublist未定义的错误。 - 表单渲染顺序调整:先设置客户端脚本再渲染页面,确保脚本生效。
- POST字段赋值修复:将第二次
setValue的字段ID改为custrecord_advs_last_name,正确保存 lastName。 - 参数ID修正:原代码中姓名参数用了
custparam_前缀,和表单字段ID不符,改为匹配表单的custpage_advs_first_name。
内容的提问来源于stack exchange,提问作者Abdul bazith
相关产品推荐
相关产品推荐

