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

如何在Suitelet中实现搜索筛选?解决SSS_INVALID_SRCH_FILTER错误

NetSuite Suitelet SSS_INVALID_SRCH_FILTER错误修复

问题说明

编写的NetSuite Suitelet代码触发SSS_INVALID_SRCH_FILTER错误,核心问题是Suitelet加载时,未输入日期参数就直接进入日期筛选分支,导致筛选器无有效值触发报错。

核心错误原因

  1. 日期筛选分支的判断条件错误:原代码用(startdate)&&(enddate)判断的是表单字段对象,而非请求中的日期参数值。页面加载时startdate和enddate是已创建的字段对象,永远不为空,所以会直接进入日期搜索逻辑。
  2. 搜索日期格式不符合NetSuite要求:NetSuite日期筛选需使用MM/DD/YYYY格式,原代码中硬编码的09/12/2022是日/月/年格式,会导致筛选无效。
  3. 缺少子列表创建代码:mysublist未定义就直接调用,会触发额外错误。
  4. POST部分字段赋值错误:两次调用setValue都用了custrecord_advs_first_name,导致 lastName 无法正确保存。
  5. 页面渲染顺序错误:原代码先执行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:05:22