Recherche…


Introduction

Suitescript 2.0 propose 4 méthodes pour gérer les résultats de la recherche.

Ils ont une syntaxe, des limites et une gouvernance différentes et conviennent à différentes situations. Nous allons nous concentrer ici sur la façon d'accéder à TOUS les résultats de recherche, en utilisant chacune de ces méthodes.

Utilisation de la méthode Search.ResultSet.each

C'est la méthode la plus courte, la plus facile et la plus utilisée. Malheureusement, il a une limitation majeure - ne peut pas être utilisé sur des recherches avec plus de 4000 résultats (lignes).

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

    });

Utilisation de la méthode ResultSet.getRange

Afin d'utiliser getRange pour gérer le grand nombre de résultats, nous devrons prendre en compte les éléments suivants:

  1. getRange a 2 paramètres: start et end . Toujours positif, toujours (début <fin)
  2. start est l'index inclusif du premier résultat à retourner
  3. end est l'index exclusif du dernier résultat à retourner
  4. Si le nombre de résultats disponibles est inférieur à celui demandé, le tableau contiendra moins que les entrées de début et de fin. Par exemple, s'il n'y a que 25 résultats de recherche, getRange (20, 30) renverra un tableau de 5 objets search.Result.
  5. Bien que la phrase d'aide ci-dessus ne le dise pas directement, le début et la fin peuvent être en dehors de la plage des résultats disponibles. Dans le même exemple - s'il n'y a que 25 résultats de recherche, getRange (100, 200) renverra un tableau vide []
  6. Maximum 1000 lignes à la fois. (fin - début) <= 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
            });
        }
    }

Permet de calculer la gouvernance. Nous avons 1 + compte / 1000 appels getRange prenant chacun 10 unités, donc:

G = (1 + compte / 1000) * 10

Exemple: 9500 lignes prendront 100 unités

Utilisation de la méthode Search.PagedData.fetch

PagedData est un objet renvoyé par la méthode Search.runPaged (options). Cela fonctionne exactement comme le font les recherches d'interface utilisateur. L'objet PagedData contient 2 propriétés importantes, que vous pouvez voir à droite de l'en-tête des résultats dans la page de résultats de recherche de l'interface utilisateur de Netsuite:

  • count (le nombre total des résultats)
  • pageRanges (liste de pages, disponible dans l'interface utilisateur en tant que sélecteur de zone de liste déroulante)

Le paramètre options.pageSize est limité à 1000 lignes de résultat.
La méthode PagedData.fetch est utilisée pour récupérer la partie de résultat souhaitée (indexée par le paramètre pageIndex). Avec un peu plus de code, vous recevez la même fonction de rappel pratique que Search.ResultSet.each, sans avoir la limitation de 4000 lignes.

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

        });

    }

Permet de calculer la gouvernance. Nous avons 5 unités pour les appels runPaged () et 1 + count / 1000 pagedData.fetch en prenant chacun 5 unités, donc:

G = 5 + ceil (nombre / 1000) * 5

Exemple: 9500 lignes prendront 55 unités. Environ la moitié des unités de gouvernance de getRange.

Utilisation du script Map / Reduce dédié

Pour des résultats de recherche très importants, vous pouvez utiliser un script Map / Reduce dédié. C'est beaucoup plus gênant, mais parfois inévitable. Et parfois pourrait être très pratique.
L'astuce est que, dans l'étape Obtenir les données d'entrée, vous pouvez fournir au moteur NS non pas les données réelles (c.-à-d. Le résultat du script), mais simplement la définition de la recherche. NS effectuera la recherche pour vous sans compter les unités de gouvernance. Ensuite, chaque ligne de résultat sera transmise à l’étape Map.
Bien sûr, il y a une limitation: la taille totale persistante des données pour un script map / Reduce ne doit pas dépasser 50 Mo. Dans un résultat de recherche, chaque clé et la taille sérialisée de chaque valeur sont comptabilisées dans la taille totale. "Sérialisé" signifie que la ligne de résultat de la recherche est convertie en chaîne avec JSON.stringify. Ainsi, la taille de la valeur est proportionnelle au nombre de colonnes de résultats de recherche dans un jeu de résultats. Si vous rencontrez des problèmes avec l'erreur STORAGE_SIZE_EXCEEDED, envisagez de réduire les colonnes, de combiner les formules, de regrouper les résultats ou même de diviser la recherche en plusieurs sous-recherches, qui pourraient être exécutées dans les étapes Map ou Reduce.

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

Bien entendu, l'exemple ici est simplifié, sans traitement des erreurs et est donné juste pour être comparé aux autres. D'autres exemples sont disponibles dans les exemples de type de script Map / Reduce Script dans le centre d'aide de NS



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow