Netsuite Suitescript可将供应商提供的所有项目作为搜索对象返回

Netsuite Suitescript可将供应商提供的所有项目作为搜索对象返回,netsuite,suitescript,Netsuite,Suitescript,根据@bknights和@prasun的综合建议,按如下方式重新输入代码 function main_GetVendorItems(request, response) { response.write(JSON.stringify(getVendorItems(request))); } function getVendorItems(request) { var vendorid = request.getParameter('vendor'); nlapiLo

根据@bknights和@prasun的综合建议,按如下方式重新输入代码

function main_GetVendorItems(request, response) {
    response.write(JSON.stringify(getVendorItems(request)));
}

function getVendorItems(request) {

    var vendorid = request.getParameter('vendor');

    nlapiLogExecution('DEBUG', 'searchRes', 'Searching For Vendor ID: '+vendorid );

    var filters = new Array();
    var columns = new Array();
    filters[0] = new nlobjSearchFilter('vendorcost', null, 'greaterthan', 0);
    filters[1] = new nlobjSearchFilter('othervendor', null, 'is', [vendorid] );
    columns[0] = new nlobjSearchColumn('itemid');
    columns[1] = new nlobjSearchColumn('entityid', 'vendor');
    columns[2] = new nlobjSearchColumn('vendorcost');
    columns[3] = new nlobjSearchColumn('vendorcode');
    columns[4] = new nlobjSearchColumn('vendorpricecurrency');

    var searchresults = nlapiSearchRecord('item', null, filters, columns );

    //for test test each element of the array
    (searchresults || []).forEach(function(res){
        nlapiLogExecution('DEBUG', 'searchRes', res instanceof nlobjSearchResult);
    })

    return searchresults;
}
调用函数如下所示:

function test () {
    var vendorID = nlapiGetFieldValue('custrecordvpr_supplier'); alert('searching for vendor ID: '+vendorID );
    var url = nlapiResolveURL('SUITELET', 'customscriptls_getvendoritems', 'customdeployls_getvendoritems', true);
    var params = {}
    params['vendor'] = vendorID;
    var response = nlapiRequestURL(url, params);
    var VendorItemsSublist = response.getBody();

    nlapiSetFieldValue('custrecordvpr_comment',VendorItemsSublist );        
}
我的自定义记录/表单上有一个注释字段,显示返回的对象。在上面的代码中,真正奇怪的是,我没有得到任何信息被添加到执行日志中,甚至是它应该发布正在搜索的供应商id的第一个条目

我已经检查了脚本和部署记录,没有任何异常或错误。。。我必须错过一些非常简单的东西


顺便说一句,我的自定义表单上的“测试”按钮正在调用代码。

您似乎没有正确写入Suitelet中的响应对象

function main_GetVendorItems(request, response) {
    response.write(JSON.stringify(getVendorItems(request)));
}

function getVendorItems(request) {
var vendorid = request.getParameter('vendorid');

var filters = new Array();
var columns = new Array();
filters[0] = new nlobjSearchFilter('vendorcost', null, 'greaterthan', 0);
//filter should be on vendor
filters[1] = new nlobjSearchFilter('vendor', null, 'anyof', vendorid );
columns[0] = new nlobjSearchColumn('itemid');
columns[1] = new nlobjSearchColumn('entityid', 'vendor');
columns[2] = new nlobjSearchColumn('vendorcost');
columns[3] = new nlobjSearchColumn('vendorcode');
columns[4] = new nlobjSearchColumn('vendorpricecurrency');

var searchresults = nlapiSearchRecord('item', null, filters, columns );

//for test test each element of the array
(searchresults || []).forEach(function(res){
  nlapiLogExecution('DEBUG', 'searchRes', res instanceof nlobjSearchResult);
})

return searchresults;
}
另外,确保在请求参数中指定了供应商id

var url = nlapiResolveURL('SUITELET', 'customscriptls_getitemvendors', 'customdeploy_getitemvendors', true);
var params = {}
params['itemid'] = itemID ;    // itemID is passed to this function.
params['vendorid'] = vendorID ;    // vendorID is passed to this function.
var response = nlapiRequestURL(url, params);
var itemVendorSublist = response.getBody();

如果您试图查询
项目供应商
,只需尝试

filters[1] = new nlobjSearchFilter('vendor', null,'anyof', vendorid );

这在控制台窗口中工作。我怀疑您没有在参数中提供数字内部id:

var vendorid = 43; // or 32 values from my test account. Want to confirm that the code works whether vendor is item's preferred vendor or not.
nlapiSearchRecord('item', null, [
    new nlobjSearchFilter('vendorcost', null, 'greaterthan', 0),
    new nlobjSearchFilter('internalid', 'vendor', 'anyof', [vendorid]), //numeric value
    new nlobjSearchFilter('internalid', null, 'is', '42') // limit results for testing
], [
    new nlobjSearchColumn('itemid'),
    new nlobjSearchColumn('entityid', 'vendor'),
    new nlobjSearchColumn('vendorcost'),
    new nlobjSearchColumn('vendorcode'),
    new nlobjSearchColumn('vendorpricecurrency')
]).forEach(function(it) {
    console.log("%s from %s", it.getValue('itemid'), it.getValue('entityid', 'vendor'));
});
尽管我从2002年开始使用Netsuite,但我从未直接从Suitelet返回过一组搜索结果。最近,我在这个论坛上的“人们的回答”中看到过几次,但我仍然觉得这有点有趣

如果我写这篇文章,我会倾向于做以下事情:

var results = (nlapiSearchRecord(...) || []).map(function(res){
  return { id:res.getId(), vendorName: res.getValue('entityid', 'vendor')...};
});

response.setContentType('JAVASCRIPT');
response.write(JSON.stringify(results));
实际上,通常还有一点。我有一个极好的文本片段,用于suitelet响应,它处理两种常见的JSONP模式(例如,如果您从网站调用此模式):


您是否得到
null
作为回报?在返回搜索后,我进行了一个测试,以检查返回的变量是否为NLOBJSEACH的instanceof,该变量返回时为false。您将得到
null
Array
迭代数组,以检查使用:if(searchresult instanceof NLOBJSEACH)时的情况{….}查看我的答案代码,了解我是如何做到这一点的
function _sendJSResponse(request, response, respObject){
    response.setContentType('JAVASCRIPT');
    var callbackFcn = request.getParameter("jsoncallback")  || request.getParameter('callback');
    if(callbackFcn){
        response.writeLine( callbackFcn + "(" + JSON.stringify(respObject) + ");");
    }else response.writeLine( JSON.stringify(respObject) );
}