Frage Wie bekomme ich mehr als 1000 Datensätze aus einer SuiteScript Saved Search?


Nachstehend ist der Code aufgeführt, den ich für die Ausführung einer Gespeicherten Suche in NetSuite mit SuiteScript erstellt habe, eine CSV-Datei mit den Ergebnissen der gespeicherten Suche erstellen und dann die CSV-Datei per E-Mail versenden. Das Problem ist, die Ergebnisse sind auf 1000 Datensätze begrenzt. Ich habe dieses Problem untersucht, und es scheint, dass die Lösung darin besteht, eine Schleife auszuführen, die in Schritten von 1000 schneidet. Ein Beispiel von dem, von dem ich glaube, dass es zum Unterteilen von Suchen verwendet wird, ist auch unten.

Allerdings kann ich das Slicing nicht in meinen Code integrieren. Kann mir jemand helfen, den Schneidecode mit meinem ursprünglichen Suchcode zu kombinieren?

var search = nlapiSearchRecord('item', 'customsearch219729'); 

// Creating some array's that will be populated from the saved search results 
var content = new Array(); 
var cells = new Array(); 
var temp = new Array(); 
var x = 0; 

// Looping through the search Results 
for (var i = 0; i < search.length; i++) { 
var resultSet = search[i]; 
// Returns an array of column internal Ids
var columns = resultSet.getAllColumns(); 

// Looping through each column and assign it to the temp array 
for (var y = 0; y <= columns.length; y++) { 
temp[y] = resultSet.getValue(columns[y]); 
} 
// Taking the content of the temp array and assigning it to the Content Array. 
content[x] += temp; 
// Incrementing the index of the content array 
x++; 
} 

//Inserting headers
content.splice(0, 0, "sku,qty,");

// Creating a string variable that will be used as the CSV Content 
var contents; 

// Looping through the content array and assigning it to the contents string variable. 
for (var z = 0; z < content.length; z++) { 
contents += content[z].replace('undefined', '') + '\n';
}
// Creating a csv file and passing the contents string variable. 
var file = nlapiCreateFile('InventoryUpdate.csv', 'CSV', contents.replace('undefined', ''));

// Emailing the script.
function SendSSEmail()
{
   nlapiSendEmail(768, 5, 'Inventory Update', 'Sending saved search via scheduled script', 'cc@email.com', null, null, file, true, null, 'cc@email.com');
}

Der folgende Code ist ein Beispiel für das, was ich gefunden habe, um mehr als 1000 Datensätze zurückzugeben. Als Anfänger kann ich das Slicing nicht in mein ursprüngliches, funktionierendes SuiteScript integrieren. Jede Hilfe wird natürlich sehr geschätzt.

var filters = [...];
var columns = [...];
var results = [];
var savedsearch = nlapiCreateSearch( 'customrecord_mybigfatlist', filters, columns );
var resultset = savedsearch.runSearch();
var searchid = 0;
do {
    var resultslice = resultset.getResults( searchid, searchid+1000 );
    for (var rs in resultslice) {
        results.push( resultslice[rs] );
        searchid++;
    }
} while (resultslice.length >= 1000);
return results;

5
2018-06-26 11:35


Ursprung


Antworten:


Probieren Sie dieses aus:

function returnCSVFile(){

    function escapeCSV(val){
        if(!val) return '';
        if(!(/[",\s]/).test(val)) return val;
        val = val.replace(/"/g, '""');
        return '"'+ val + '"';
    }


    function makeHeader(firstLine){
        var cols = firstLine.getAllColumns();
        var hdr = [];
        cols.forEach(function(c){
            var lbl = c.getLabel(); // column must have a custom label to be included.
            if(lbl){
                hdr.push(escapeCSV(lbl));
            }
        });
        return hdr.join(",");
    }

    function makeLine(srchRow){
        var cols = srchRow.getAllColumns();
        var line = [];
        cols.forEach(function(c){
            if(c.getLabel()){
                line.push(escapeCSV(srchRow.getText(c) || srchRow.getValue(c)));
            }
        });
        return line.join(",");
    }

    function getDLFileName(prefix){
        function pad(v){ if(v >= 10) return v; return "0"+v;}
        var now = new Date();
        return prefix + '-'+    now.getFullYear() + pad(now.getMonth()+1)+ pad(now.getDate()) + pad( now.getHours())    +pad(now.getMinutes()) + ".csv";
    }


    var srchRows = getItems('item', 'customsearch219729'); //function that returns your saved search results

    if(!srchRows)   throw nlapiCreateError("SRCH_RESULT", "No results from search");


    var fileLines = [makeHeader(srchRows[0])];

    srchRows.forEach(function(soLine){
        fileLines.push(makeLine(soLine));
    });



var file = nlapiCreateFile('InventoryUpdate.csv', 'CSV', fileLines.join('\r\n'));
nlapiSendEmail(768, 5, 'Test csv Mail','csv', null, null, null, file);
}

function getItems(recordType, searchId) {
    var savedSearch = nlapiLoadSearch(recordType, searchId);
    var resultset = savedSearch.runSearch();
    var returnSearchResults = [];
    var searchid = 0;
    do {
        var resultslice = resultset.getResults(searchid, searchid + 1000);
        for ( var rs in resultslice) {
            returnSearchResults.push(resultslice[rs]);
            searchid++;
        }
    } while (resultslice.length >= 1000);

    return returnSearchResults;
}

Ich habe Ihren Code untersucht, aber es scheint, dass Ihnen die Label-Header in der generierten CSV-Datei fehlen. Wenn Sie Ihren vorhandenen Code verwenden müssen, ersetzen Sie ihn einfach

var search = nlapiSearchRecord('item', 'customsearch219729'); 

mit

var search = getItems('item', 'customsearch219729');

und verwenden Sie einfach die erwähnte Hilfsfunktion, um das Ergebnislimit von 1000 zu erreichen.

Prost!


8
2018-06-30 13:46



Ich weiß, dass es eine Weile her ist, dass dies gepostet und beantwortet wurde, aber für andere, die nach einer allgemeineren Antwort auf die ursprüngliche Frage suchen, sollte der folgende Code ausreichen:

var search = nlapiLoadSearch('record_type', 'savedsearch_id');
var searchresults = search.runSearch();
var resultIndex = 0;
var resultStep = 1000;
var resultSet;
do {
    resultSet = searchresults.getResults(resultIndex, resultIndex + resultStep);    // retrieves all possible results up to the 1000 max  returned
    resultIndex = resultIndex + resultStep;                     // increment the starting point for the next batch of records
    for(var i = 0; !!resultSet && i < resultSet.length; i++){   // loop through the search results
       // Your code goes here to work on a the current resultSet (upto 1000 records per pass)
    }
} while (resultSet.length > 0)

Erwähnenswert ist auch, dass bei der Aktualisierung von Feldern / Datensätzen / Erstellen von Datensätzen die Skript-Governance beachtet werden muss. Wenn Sie Ihren Code in ein geplantes Skript verschieben, um große Mengen von Datensätzen zu verarbeiten, ist dies effizienter und Sie können mit der Verwaltung umgehen.


5
2017-09-04 10:11



Die folgende Zeile:

var savedsearch = nlapiCreateSearch( 'customrecord_mybigfatlist', filters, columns );

kann so an Ihre eigene gespeicherte Suche angepasst werden:

var savedsearch = nlapiLoadSearch('item', 'customsearch219729');

Hoffe das hilft.


1
2018-06-26 13:48