2015-06-26 14 views
5

Poniżej znajduje się kod, na który wpadłem, aby uruchomić Zapisane wyszukiwanie w NetSuite przy użyciu SuiteScript, utworzyć plik CSV z wynikami zapisanego wyszukiwania, a następnie wysłać wiadomość e-mail do pliku CSV. Kłopot w tym, że wyniki są ograniczone do 1000 rekordów. Zbadałem ten problem i wydaje się, że rozwiązaniem jest uruchomienie pętli, która dzieli się co 1000. Próbka tego, co według mnie jest używane do wycinania wyszukiwań, znajduje się również poniżej.Jak uzyskać ponad 1000 rekordów z zapisanego wyszukiwania SuiteScript?

Jednak nie wydaje mi się, żebym mógł włączyć cięcie do mojego kodu. Czy ktoś może mi pomóc połączyć kod podziału z moim oryginalnym kodem wyszukiwania?

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

Poniższy kod jest przykładem tego, co znalazłem, który jest używany do zwrócenia więcej niż 1000 rekordów. Znowu, jako nowicjusz, nie mogę wydawać się włączać cięcia do mojego oryginalnego, działającego SuiteScript. Każda pomoc jest oczywiście bardzo doceniana.

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; 

Odpowiedz

8

Wypróbuj ten jeden:

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

Spojrzałem w kodzie, ale wydaje się, tracisz nagłówki etykiecie w generowanym pliku CSV. Jeżeli jesteś zobowiązany do korzystania z istniejącego kodu a potem po prostu zastąpić

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

z

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

i po prostu korzystać z wymienioną funkcję pomocnika aby pozbyć się limitu 1000 wyników.

Pozdrawiam!

+0

Rockstar, twoją odpowiedzią jest Rockstar! Udało się pięknie ... dziękuję bardzo za czas i wysiłek, który mi pomógł! Tak bardzo doceniane. – Accounting

+0

@ Rachunkowość Cieszę się, że pomogło. Twoje zdrowie!! – Rockstar

+0

Napotkałem problem. Jeśli Zapisane wyszukiwanie jest powolne do wykonania, skrypt wyprowadza błędy i nie generuje pliku.Poprawiłem kryteria w moim Zapisanym wyszukiwaniu, aby wykonać je bardziej efektywnie, a problem został na razie rozwiązany. Obawiam się jednak, że może się on ponownie pojawić, gdy Zapisane wyszukiwanie zwiększy się do 1000 rekordów. Czy jest jakiś fragment kodu, który można dodać, aby czas SS został wykonany, zanim błąd zostanie usunięty? Z góry dziękuję za twój wgląd! – Accounting

1

następujący wiersz:

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

można dostosować do własnych zapisanego wyszukiwania tak:

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

Nadzieja to pomaga.

+0

Dzięki za odpowiedź. Ale gdzie/jak wstawić kod do mojego głównego kodu SuiteScript? I nie jestem pewien, czy ten drugi kodowy kod działa nawet ... Właśnie podałem go jako przykład tego, co potrafię znaleźć na temat generowania zapisanych wyszukiwań o długości ponad 1000 rekordów. Dzięki! – Accounting

+0

Enkapsuluj drugi fragment kodu we własnej funkcji, powiedzmy getAllResults(). Następnie zamień pierwszy wiersz kodu na: var search = getAllResults(). – dangig

3

Doceniam to był a ponieważ ten został opublikowany i odpowiedział, ale dla innych szukających bardziej ogólne odpowiedzi na pierwotne pytanie następujący kod powinien wystarczyć:

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) 

Warto również wspomnieć, jeśli kod będzie aktualizował pola/rekordy/tworzenie rekordów, które musisz uwzględnić w zarządzaniu skryptami. Przeniesienie kodu do skryptu zaplanowanego w celu przetworzenia dużych wolumenów rekordów jest bardziej wydajne i umożliwia obsługę zarządzania.