2015-06-26 3 views
5

Im Folgenden ist Code, den ich entwickelt habe, um eine gespeicherte Suche in NetSuite mit SuiteScript auszuführen, eine CSV-Datei mit den Ergebnissen der gespeicherten Suche zu erstellen und dann eine E-Mail an die CSV-Datei zu senden. 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.Wie bekomme ich über 1000 Datensätze aus einer SuiteScript Saved Search?

Allerdings kann ich nicht in der Lage sein, das Slicing in meinen Code zu 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', '[email protected]', null, null, file, true, null, '[email protected]'); 
} 

Der folgende Code ist ein Beispiel für das, was ich gefunden habe, die verwendet wird, 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; 

Antwort

8

Versuchen Sie diesen heraus:

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 in den Code aussehen, aber es scheint, dass Sie den Label-Header in der generierten CSV-Datei sind vermisst. Wenn Sie verpflichtet sind, Ihre vorhandenen Code zu verwenden, dann ersetzen Sie einfach

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

mit

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

und verwenden nur die erwähnte Hilfsfunktion zu erhalten, die 1000 Ergebnis Grenze gereinigt weg.

Prost!

+0

Rockstar, deine Antwort ist ein Rockstar! Es hat wunderbar funktioniert .... Vielen Dank für die Zeit und Mühe, die mir geholfen haben! So sehr geschätzt. – Accounting

+0

@Accounting Gut zu wissen, dass es geholfen hat. Prost!! – Rockstar

+0

Ich habe ein kleines Problem festgestellt. Wenn die gespeicherte Suche langsam ausgeführt wird, ist das Skript fehlerhaft und es wird keine Datei generiert.Ich habe die Kriterien in meiner gespeicherten Suche optimiert, um sie effizienter ausführen zu können, und das Problem wurde vorerst behoben. Aber ich befürchte, dass es wieder auftauchen wird, wenn die gespeicherte Suche auf 1000 Datensätze anwächst. Gibt es ein bisschen Code, der hinzugefügt werden kann, um der SS Zeit zu geben, die ausgeführt werden muss, bevor das Ganze aus dem Ruder läuft? Vielen Dank im Voraus für Ihre Einsicht! – Accounting

1

Die folgende Zeile:

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

this helps:

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

kann zu Ihrer eigenen gespeicherten Suche wie folgt angepasst werden.

+0

Danke für Ihre Antwort. Aber wo/wie füge ich den Code in meinen Haupt-SuiteScript-Code ein? Und ich bin mir nicht sicher, ob das zweite Code-Snipet überhaupt funktioniert ... Ich habe es nur als Beispiel für das, was ich finde, gefunden, wie man gespeicherte Suchen über 1000 Datensätze lang erzeugt. Vielen Dank! – Accounting

+0

Verkapseln Sie das zweite Code-Snippet in seiner eigenen Funktion, sagen wir getAllResults(). Ersetzen Sie dann die erste Zeile Ihres Codes durch: var search = getAllResults(). – dangig

3

Ich schätze es ist schon eine Weile, da dies geschrieben wurde und antwortete, aber für andere, eine generische Antwort auf die ursprüngliche Frage sucht der folgende Code sollte 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) 

Ebenfalls erwähnenswert, wenn Ihre Code wird Felder/Datensätze aktualisieren/Datensätze erstellen, die Sie beachten müssen Skript-Governance. Das Verschieben Ihres Codes in ein geplantes Skript zur Verarbeitung großer Mengen von Datensätzen ist effizienter und ermöglicht die Verwaltung.

Verwandte Themen