Ressaisissez le code comme suit, avec des suggestions combinées de @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;
}

La fonction d'appel comme ci-dessous:

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

J'ai un champ de commentaire sur mon enregistrement / formulaire personnalisé qui montre l'objet retourné. Sur le code ci-dessus, ce qui est vraiment étrange, c'est que je ne reçois aucune information ajoutée au journal d'exécution, même la première entrée où il devrait publier l'ID du fournisseur recherché.

J'ai vérifié le script et les enregistrements de déploiement, et il n'y a rien de fâcheux ou de mal ici ... Je dois manquer quelque chose d'extrêmement simple.

Incidemment, le code est appelé par un bouton «Test» sur mon formulaire personnalisé.

0
Steve Reeder 28 déc. 2015 à 12:51

3 réponses

Meilleure réponse

Il semble que vous n'écrivez pas correctement dans l'objet de réponse dans 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;
}

Assurez-vous également que l'ID du fournisseur est spécifié dans le paramètre de demande

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();
0
prasun 28 déc. 2015 à 12:42

Si vous essayez d'effectuer une requête sur item vendor, essayez simplement

filters[1] = new nlobjSearchFilter('vendor', null,'anyof', vendorid );
0
Rockstar 28 déc. 2015 à 10:25

Cela fonctionne dans une fenêtre de console. Je soupçonne que vous ne fournissez pas l'identifiant interne numérique dans votre paramètre:

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'));
});

Bien que je travaille avec Netsuite depuis 2002, je n'ai jamais renvoyé un ensemble de résultats de recherche directement à partir d'un Suitelet. J'ai vu cela à quelques reprises récemment dans les réponses des gens sur ce forum, mais je trouve toujours cela un peu amusant.

Si j'écrivais ceci, j'aurais eu tendance à faire ce qui suit:

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

response.setContentType('JAVASCRIPT');
response.write(JSON.stringify(results));

En fait, il y en a généralement un peu plus. J'ai un extrait de texte sublime que j'utilise pour les réponses de suitelet qui gère quelques modèles JSONP courants (par exemple, si vous appelez cela à partir d'un site Web):

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) );
}
0
bknights 29 déc. 2015 à 20:01