Szukaj…


Wprowadzenie

Suitescript 2.0 zapewnia 4 metody obsługi wyników wyszukiwania.

Mają różną składnię, ograniczenia i zarządzanie oraz są odpowiednie dla różnych sytuacji. Skoncentrujemy się tutaj na tym, jak uzyskać dostęp do WSZYSTKICH wyników wyszukiwania przy użyciu każdej z tych metod.

Korzystanie z metody Search.ResultSet.each

Jest to najkrótsza, najłatwiejsza i najczęściej stosowana metoda. Niestety ma jedno poważne ograniczenie - nie można go stosować w przypadku wyszukiwania z więcej niż 4000 wyników (wierszy).

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

    });

Korzystanie z metody ResultSet.getRange

Aby użyć getRange do obsługi dużej liczby wyników, będziemy musieli wziąć pod uwagę następujące kwestie:

  1. getRange ma 2 parametry: początkowy i końcowy . Zawsze pozytywnie, zawsze (początek <koniec)
  2. start jest indeksem włączającym pierwszego wyniku do zwrócenia
  3. end jest wyłącznym indeksem ostatniego wyniku do zwrócenia
  4. Jeśli dostępnych jest mniej wyników niż zażądano, tablica będzie zawierać mniej pozycji niż początkowe. Na przykład, jeśli istnieje tylko 25 wyników wyszukiwania, getRange (20, 30) zwróci tablicę 5 obiektów wyszukiwania. Wyniki.
  5. Chociaż powyższe zdanie pomocy nie mówi wprost, zarówno początek , jak i koniec mogą być poza zakresem dostępnych wyników. W tym samym przykładzie - jeśli jest tylko 25 wyników wyszukiwania, getRange (100, 200) zwróci pustą tablicę []
  6. Jednocześnie maksymalnie 1000 wierszy. (koniec - początek) <= 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
            });
        }
    }

Obliczmy ład. Mamy 1 + count / 1000 wywołań getRange, które przyjmują po 10 jednostek, więc:

G = (1 + liczba / 1000) * 10

Przykład: 9500 rzędów zajmie 100 jednostek

Korzystanie z metody Search.PagedData.fetch

PagedData to obiekt zwracany przez metodę Search.runPaged (opcje). Działa dokładnie tak samo, jak wyszukiwania w interfejsie użytkownika. Obiekt PagedData zawiera 2 ważne właściwości, które można zobaczyć po prawej stronie nagłówka wyników na stronie wyników wyszukiwania w interfejsie Netsuite:

  • liczba (łączna liczba wyników)
  • pageRanges (lista stron, dostępna w interfejsie użytkownika jako selektor pola kombi)

parametr options.pageSize jest ponownie ograniczony do 1000 wierszy wyników.
Metoda PagedData.fetch służy do pobrania żądanej części wynikowej (indeksowanej według parametru pageIndex). Przy odrobinie więcej kodu otrzymujesz tę samą wygodną funkcję zwrotną, co Search.ResultSet.each, bez ograniczenia 4000 wierszy.

    // 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');

        });

    }

Obliczmy ład. Mamy 5 jednostek dla runPaged () i 1 + count / 1000 wywołań pagedData.fetch, które pobierają po 5 jednostek, więc:

G = 5 + sufit (liczba / 1000) * 5

Przykład: 9500 rzędów zajmie 55 jednostek. Około połowa jednostek zarządzających getRange.

Używanie dedykowanego skryptu Map / Reduce

Aby uzyskać naprawdę ogromne wyniki wyszukiwania, możesz użyć dedykowanego skryptu Map / Reduce. Jest to o wiele bardziej niewygodne, ale czasami nieuniknione. A czasem może być bardzo przydatny.
Sztuczka polega na tym, że na etapie pobierania danych wejściowych możesz dostarczyć silnikowi NS nie rzeczywiste dane (tj. Wynik skryptu), ale tylko definicję wyszukiwania. NS przeprowadzi wyszukiwanie za Ciebie, nie licząc jednostek zarządzających. Następnie każdy pojedynczy wiersz wyników zostanie przekazany do etapu mapy.
Oczywiście istnieje ograniczenie: całkowity utrwalony rozmiar danych dla skryptu mapowania / zmniejszania nie może przekraczać 50 MB. W wyniku wyszukiwania każdy klucz i zserializowany rozmiar każdej wartości jest liczony do całkowitego rozmiaru. „Serializowany” oznacza, że wiersz wyniku wyszukiwania jest konwertowany na ciąg za pomocą JSON.stringify. Dlatego rozmiar wartości jest proporcjonalny do liczby kolumn wyników wyszukiwania w zestawie wyników. Jeśli wystąpią problemy z błędem STORAGE_SIZE_EXCEEDED, rozważ zmniejszenie kolumn, połączenie do formuł, pogrupowanie wyniku lub nawet podzielenie wyszukiwania na wiele podwyszukiwań, które można wykonać w etapach Mapa lub Zmniejsz.

    /**
     * @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
    };
});

Oczywiście przykład tutaj jest uproszczony, bez obsługi błędów i podano go tylko w celu porównania z innymi. Więcej przykładów dostępnych jest na stronie Map / Reduce Script Type w NS Centrum pomocy



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow