2015-06-26 8 views
5

नीचे कोड है जो मैं सुइटस्क्रिप्ट का उपयोग करके नेटसुइट में एक सहेजी गई खोज चलाने के लिए आया था, सहेजे गए खोज परिणामों के साथ एक CSV बनाएं और फिर CSV ईमेल करें। समस्या यह है कि परिणाम 1000 रिकॉर्ड तक सीमित हैं। मैंने इस मुद्दे पर शोध किया है और ऐसा लगता है कि समाधान एक लूप चलाने के लिए है जो 1000 की वृद्धि में स्लाइस करता है। मुझे लगता है कि एक नमूना का उपयोग स्लाइस खोजों के लिए भी किया जाता है।सूटस्क्रिप्ट सहेजे गए खोज से 1000 से अधिक रिकॉर्ड कैसे प्राप्त करें?

हालांकि, मैं अपने कोड में स्लाइसिंग को शामिल करने में सक्षम नहीं प्रतीत होता। क्या कोई मुझे मेरे मूल खोज कोड के साथ स्लाइसिंग कोड को गठबंधन करने में मदद कर सकता है?

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

निम्नलिखित कोड एक उदाहरण है जो मैंने पाया है जिसका उपयोग 1000 से अधिक रिकॉर्ड लौटने के लिए किया जाता है। दोबारा, एक नौसिखिया के रूप में, मैं अपने मूल, कामकाजी सुइटस्क्रिप्ट में स्लाइसिंग को शामिल नहीं कर सकता। किसी भी मदद की निश्चित रूप से सराहना की है।

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; 

उत्तर

8

इस एक बाहर का प्रयास करें:

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

मैं अपने कोड में देखा है, लेकिन यह आप उत्पन्न CSV फ़ाइल में लेबल हेडर वंचित हो रहे हैं लगता है। आप अपने मौजूदा कोड का उपयोग करने के लिए बाध्य कर रहे हैं तो बस

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

साथ

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

की जगह और सिर्फ 1000 परिणाम सीमा बंद छुटकारा पाने के लिए उल्लेख किया है सहायक समारोह का उपयोग करें।

चीयर्स!

+0

रॉकस्टार, आपका जवाब रॉकस्टार है! यह खूबसूरती से काम किया .... मुझे मदद करने के लिए समय और प्रयास के लिए बहुत बहुत धन्यवाद! बहुत सराहना की। – Accounting

+0

@ ग्लेडिंग ग्लेड ने इसे जानने में मदद की। चीयर्स !! – Rockstar

+0

मुझे एक समस्या का सामना करना पड़ा है। यदि सहेजी गई खोज निष्पादित करने में धीमी है, तो स्क्रिप्ट त्रुटियां समाप्त होती हैं और कोई फ़ाइल उत्पन्न नहीं होती है।मैंने अपनी सहेजी गई खोज में मानदंड को अधिक कुशलता से निष्पादित करने के लिए ट्यून किया और अब समस्या हल हो गई है। लेकिन मुझे डर है कि सहेजे गए खोज रिकॉर्ड के 1000s में बढ़ने पर यह फिर से उभर सकता है। क्या कोई भी कोड है जिसे पूरी चीज को गलती से पहले एसएस समय निष्पादित करने के लिए जोड़ा जा सकता है? आपकी अंतर्दृष्टि के लिए अग्रिम धन्यवाद! – Accounting

1

निम्न पंक्ति:

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

इस तरह अपनी खुद की सहेजी गई खोज के लिए अनुकूलित किया जा सकता:

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

आशा इस मदद करता है।

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मैं अपने मुख्य सुइटस्क्रिप्ट कोड में कोड कहां/कैसे डालूं? और मुझे यकीन नहीं है कि वह दूसरा कोड स्निपेट भी काम करता है ... मैंने इसे एक उदाहरण के रूप में शामिल किया है कि मैं 1000 रिकॉर्डों पर सहेजी गई खोजों को कैसे उत्पन्न कर सकता हूं, इस बारे में एक उदाहरण के रूप में शामिल हूं। धन्यवाद! – Accounting

+0

अपने कोड में दूसरे कोड स्निपेट को एन्सेप्लेट करें, मान लें कि GetAllResults()। फिर, अपने कोड की पहली पंक्ति को प्रतिस्थापित करें: var search = getAllResults()। – dangig

3

मुझे खुशी है कि यह एक समय हो गया है के बाद से इस पोस्ट किया गया था और करने के लिए, लेकिन मूल प्रश्न के लिए एक अधिक सामान्य प्रतिक्रिया की तलाश में दूसरों के लिए कहा निम्नलिखित कोड पर्याप्त होना चाहिए:

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) 

इसके अलावा उल्लेख के लायक है, अगर आपके कोड फ़ील्ड/रिकॉर्ड्स अपडेट कर रहा है/रिकॉर्ड स्क्रिप्ट गवर्नेंस में आपको रिकॉर्ड करने के लिए आवश्यक रिकॉर्ड बनाना होगा। रिकॉर्ड के बड़े संस्करणों को संसाधित करने के लिए अपने कोड को अनुसूचित स्क्रिप्ट पर ले जाना अधिक कुशल है और आपको शासन को संभालने की अनुमति देता है।

संबंधित मुद्दे