Suche…


Einführung

Suitescript 2.0 bietet 4 Methoden zur Handhabung der Suchergebnisse.

Sie haben unterschiedliche Syntax, Einschränkungen und Governance und sind für verschiedene Situationen geeignet. Wir werden uns hier darauf konzentrieren, auf ALLE Suchergebnisse mit jeder dieser Methoden zuzugreifen.

Verwenden der Search.ResultSet.each-Methode

Dies ist die kürzeste, einfachste und am häufigsten verwendete Methode. Leider gibt es eine wesentliche Einschränkung - kann nicht bei Suchen mit mehr als 4000 Ergebnissen (Zeilen) verwendet werden.

    // Assume that 'N/search' module is included as 'search'
    
    var s = search.create({
        type : search.Type.TRANSACTION,
        columns : ['entity','amount'],
        filters : [  ['mainline', 'is', 'T'],
              'and', ['type', 'is', 'CustInvc'],
              'and', ['status', 'is', 'open']
            ]
    });

    var resultSet = s.run();
    
    // you can use "each" method on searches with up to 4000 results    
    resultSet.each( function(result) {
        
        // you have the result row. use it like this....
        var transId = result.id;
        var entityId = result.getValue('entity'); 
        var entityName = result.getText('entity');
        var amount = result.getValue('amount');
        
        // don't forget to return true, in order to continue the loop
        return true;  

    });

Verwenden der ResultSet.getRange-Methode

Um getRange für die Behandlung der großen Anzahl von Ergebnissen verwenden zu können, müssen wir Folgendes berücksichtigen:

  1. getRange hat 2 Parameter: Start und Ende . Immer positiv, immer (Anfang <Ende)
  2. start ist der inklusive Index des ersten Ergebnisses
  3. end ist der exklusive Index des letzten Ergebnisses
  4. Wenn weniger Ergebnisse verfügbar sind als angefordert, enthält das Array weniger als End-Start-Einträge. Wenn beispielsweise nur 25 Suchergebnisse vorhanden sind, gibt getRange (20, 30) ein Array mit 5 search.Result-Objekten zurück.
  5. Obwohl der obige Hilfesatz dies nicht direkt sagt, könnten sowohl Anfang als auch Ende außerhalb des Bereichs der verfügbaren Ergebnisse liegen. In demselben Beispiel - wenn es nur 25 Suchergebnisse gibt, gibt getRange (100, 200) ein leeres Array [] zurück.
  6. Maximal 1000 Zeilen gleichzeitig. (Ende - Start) <= 1000
    // Assume that 'N/search' module is included as 'search'
    
    // this search will return a lot of results (not having any filters) 
    var s = search.create({
        type: search.Type.TRANSACTION,
        columns : ['entity','amount'],
        filters: [] 
    });
    
    var resultSet = s.run();

    // now take the first portion of data.
    var currentRange = resultSet.getRange({
            start : 0,
            end : 1000
    });
    
    var i = 0;  // iterator for all search results
    var j = 0;  // iterator for current result range 0..999

    while ( j < currentRange.length ) {
        
        // take the result row
        var result = currentRange[j];
        // and use it like this....
        var transId = result.id;
        var entityId = result.getValue('entity'); 
        var entityName = result.getText('entity');
        var amount = result.getValue('amount');
        
        // finally:
        i++; j++;
        if( j==1000 ) {   // check if it reaches 1000
            j=0;          // reset j an reload the next portion
            currentRange = resultSet.getRange({
                start : i,
                end : i+1000
            });
        }
    }

Lassen Sie uns die Governance berechnen. Wir haben 1 + count / 1000 getRange-Anrufe mit jeweils 10 Einheiten, also:

G = (1 + count / 1000) * 10

Beispiel: 9500 Zeilen brauchen 100 Einheiten

Verwenden der Search.PagedData.fetch-Methode

PagedData ist ein Objekt, das von der Search.runPaged (options) -Methode zurückgegeben wird. Es funktioniert genauso wie die Benutzeroberflächen-Suchvorgänge. Das PagedData-Objekt enthält zwei wichtige Eigenschaften, die Sie auf der rechten Seite des Ergebnisheaders auf der Suchergebnisseite der Netsuite-Benutzeroberfläche sehen können:

  • Anzahl (die Gesamtzahl der Ergebnisse)
  • pageRanges (Liste der Seiten, verfügbar in der Benutzeroberfläche als Kombinationsfeldauswahl)

Der Parameter options.pageSize ist wieder auf 1000 Ergebniszeilen begrenzt.
Die PagedData.fetch- Methode wird verwendet, um den gewünschten Ergebnisanteil abzurufen (indiziert mit dem Parameter pageIndex). Mit etwas mehr Code erhalten Sie die gleiche praktische Rückruffunktion wie Search.ResultSet.each, ohne die Beschränkung auf 4000 Zeilen.

    // Assume that 'N/search' module is included as 'search'

    // this search will return a lot of results (not having any filters)  
    var s = search.create({
        type: search.Type.TRANSACTION,
        columns : ['entity','amount'],
        filters : [] 
    });
    
    var pagedData = s.runPaged({pa​g​e​S​i​z​e : 1000});
    
    // iterate the pages
    for( var i=0; i < pagedData.pageRanges.length; i++ ) {

        // fetch the current page data
        var currentPage = pagedData.fetch(i);

        // and forEach() thru all results
        currentPage.data.forEach( function(result) {

            // you have the result row. use it like this....
            var transId = result.id;
            var entityId = result.getValue('entity'); 
            var entityName = result.getText('entity');
            var amount = result.getValue('amount');

        });

    }

Lassen Sie uns die Governance berechnen. Wir haben 5 Einheiten für runPaged () und 1 + count / 1000 pagedData.fetch-Aufrufe mit jeweils 5 Einheiten.

G = 5 + ceiling (Anzahl / 1000) * 5

Beispiel: 9500 Zeilen brauchen 55 Einheiten. Etwa die Hälfte der getRange-Governance-Einheiten.

Verwenden eines dedizierten Map / Reduce-Skripts

Für wirklich große Suchergebnisse können Sie ein dediziertes Map / Reduce-Skript verwenden. Es ist viel unbequemer, aber manchmal unvermeidlich. Und manchmal könnte es sehr praktisch sein.
Der Trick hier ist, dass Sie in der Stufe "Eingabedaten abrufen" nicht die tatsächlichen Daten (dh das Skriptergebnis), sondern nur die Definition der Suche für die NS-Engine bereitstellen können. NS führt die Suche für Sie aus, ohne die Governance-Einheiten zu zählen. Dann wird jede einzelne Ergebniszeile an die Map-Stufe übergeben.
Natürlich gibt es eine Einschränkung: Die Gesamtgröße der Daten für ein Map / Reduction-Skript darf 50 MB nicht überschreiten. In einem Suchergebnis werden jeder Schlüssel und die serialisierte Größe jedes Werts zur Gesamtgröße gezählt. "Serialisiert" bedeutet, dass die Ergebniszeile mit JSON.stringify in eine Zeichenfolge konvertiert wird. Daher ist die Wertgröße proportional zur Anzahl der Suchergebnisspalten in einer Ergebnismenge. Wenn Sie Probleme mit dem STORAGE_SIZE_EXCEEDED-Fehler bekommen, sollten Sie die Spalten reduzieren, zu Formeln kombinieren, das Ergebnis gruppieren oder sogar die Suche in mehrere Untersuchen aufteilen, die in den Stufen Map oder Reduce ausgeführt werden könnten.

    /**
     * @NApiVersion 2.0
     * @NScriptType MapReduceScript
     */
    define(['N/search'], function(search) {

    function getInputData()
    {
        return search.create({
            type: search.Type.TRANSACTION,
            columns : ['entity','amount'],
            filters : [] 
        });
    }

    function map(context)
    {
        var searchResult = JSON.parse(context.value);
        // you have the result row. use it like this....
        var transId = searchResult.id;
        var entityId = searchResult.values.entity.value;
        var entityName = searchResult.values.entity.text;
        var amount = searchResult.values.amount.value;
        
        // if you want to pass some part of the search result to the next stage
        // write it to context:
        context.write(entityId, transId);
    }

    function reduce(context)
    {
       // your code here ...
    }

    function summarize(summary)
    {
        // your code here ...
    }

    return {
        getInputData: getInputData,
        map: map,
        reduce: reduce,
        summarize: summarize
    };
});

Natürlich ist das Beispiel hier vereinfacht, ohne Fehlerbehandlung und nur um mit anderen verglichen zu werden. Weitere Beispiele finden Sie unter Map / Reduce Script Type-Beispiele in der NS-Hilfe



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow