Sök…


Introduktion

Suitescript 2.0 erbjuder fyra metoder för att hantera sökresultaten.

De har olika syntax, begränsningar och styrning och är lämpliga för olika situationer. Vi kommer här att fokusera på hur du får åtkomst till ALLA sökresultat med hjälp av var och en av dessa metoder.

Med hjälp av metoden Search.ResultSet.each

Detta är den kortaste, enklaste och mest använda metoden. Tyvärr har den en huvudbegränsning - kan inte användas på sökningar med mer än 4000 resultat (rader).

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

    });

Använd metoden ResultSet.getRange

För att använda getRange för att hantera det stora antalet resultat måste vi beakta följande:

  1. getRange har två parametrar: start och slut . Alltid positiv, alltid (start <slut)
  2. start är det inkluderande indexet för det första resultatet som kommer tillbaka
  3. slut är det exklusiva indexet för det sista resultatet som kommer tillbaka
  4. Om det finns färre resultat än begärt, kommer matrisen att innehålla färre än slutstartposter. Till exempel, om det bara finns 25 sökresultat, kommer getRange (20, 30) att returnera en matris med 5 search.Result-objekt.
  5. Även om ovanstående hjälpmening inte säger det direkt, kan både start och slut ligga utanför tillgängliga resultat. I samma exempel - om det bara finns 25 sökresultat kommer getRange (100, 200) att returnera en tom matris []
  6. Max 1000 rader i taget. (slutstart) <= 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
            });
        }
    }

Låt oss beräkna styrningen. Vi har 1 + antal / 1000 getRange samtal som tar 10 enheter vardera, så:

G = (1 + räkning / 1000) * 10

Exempel: 9500 rader tar 100 enheter

Med hjälp av metoden Search.PagedData.fetch

PagedData är ett objekt som returneras med metoden Search.runPaged (alternativ). Det fungerar exakt som UI-sökningar gör. PagedData-objektet innehåller två viktiga egenskaper som du kan se till höger om resultathuvudet i sökresultatsidan i Netsuite UI:

  • räkna (det totala antalet resultat)
  • pageRanges (lista med sidor, tillgängligt i UI som kombinationsruta-väljare)

parametrarna option.pageSize begränsas igen till 1000 resultatrader.
Metoden PagedData.fetch används för att hämta den önskade resultadelen (indexerad av parametern pageIndex). Med lite mer kod får du samma bekväma återuppringningsfunktion som Search.ResultSet.each utan att begränsa 4000 rader.

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

        });

    }

Låt oss beräkna styrningen. Vi har 5 enheter för runPaged () och 1 + count / 1000 pagedData.fetch samtal som tar 5 enheter vardera, så:

G = 5 + tak (antal / 1000) * 5

Exempel: 9500 rader tar 55 enheter. Cirka hälften av styrenheterna getRange.

Använda dedicerat Map / Reduce-skript

För riktigt enorma sökresultat kan du använda dedikerade Map / Reduce-skript. Det är mycket mer obekvämt, men ibland oundvikligt. Och ibland kan vara mycket praktiskt.
Tricket här är att i Get Input Data-scenen kan du tillhandahålla NS-motorn inte de faktiska data (dvs. skriptresultat), utan bara definitionen av sökningen. NS kommer att utföra sökningen efter dig utan att räkna styrenheterna. Sedan kommer varje enskild resultatrad att överföras till kartsteget.
Naturligtvis finns det en begränsning: Den totala beständiga storleken på data för ett kart / reducera skript får inte överstiga 50 MB. I ett sökresultat räknas varje nyckel och den serialiserade storleken för varje värde till den totala storleken. "Serialized" betyder att sökresultatraden konverteras till sträng med JSON.stringify. Således är värdestorleken proportionell mot antalet sökresultatkolumner i en resultatuppsättning. Om du får problem med STORAGE_SIZE_EXCEEDED-fel kan du överväga att minska kolumnerna, kombinera till formler, gruppera resultatet eller till och med dela upp sökningen till flera undersökningar, som kan utföras i kartor eller minska steg.

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

Naturligtvis är exemplet här förenklat, utan felhantering och ges bara för att jämföras med andra. Fler exempel finns på Map / Reduce Script Type-exempel i NS Help Center



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow