サーチ…


前書き

Suitescript 2.0は、検索結果を処理する4つのメソッドを提供します。

彼らは異なる構文、制限、ガバナンスを持ち、異なる状況に適しています。ここでは、これらの方法のそれぞれを使用して、 すべての検索結果にアクセスする方法に焦点を当てます。

Search.ResultSet.eachメソッドの使用

これは最短で、最も簡単で最も一般的に使用される方法です。残念ながら、1つの大きな制限があります.4000を超える結果(行)を持つ検索では使用できません。

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

    });

ResultSet.getRangeメソッドの使用

多数の結果を処理するためにgetRangeを使用するには、次の点を考慮する必要があります。

  1. getRangeにはstartendという 2つのパラメータがあります。常に正、常に(開始<終了)
  2. startは返す最初の結果のインクルーシブインデックスです
  3. endは返す最後の結果の排他的なインデックスです
  4. 要求された結果よりも利用可能な結果が少ない場合、配列にはend-startエントリよりも少ないエントリが含まれます。たとえば、検索結果が25件しかない場合、getRange(20,30)は5つのsearch.Resultオブジェクトの配列を返します。
  5. 上記のヘルプ文では直接言及していませんが、 開始終了の両方が利用可能な結果の範囲外になる可能性があります。同じ例では、検索結果が25件しかない場合、getRange(100、200)は空の配列[]を返します
  6. 一度に最大1000の行。 (終了 - 開始)<= 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
            });
        }
    }

ガバナンスを計算します。 1 + count / 1000 getRangeコールにはそれぞれ10単位が必要です:

G =(1 +カウント/ 1000)×10

例:9500行に100単位

Search.PagedData.fetchメソッドの使用

PagedDataは、Search.runPaged(options)メソッドによって返されるオブジェクトです。これは、UI検索とまったく同じです。 PagedDataオブジェクトには2つの重要なプロパティがあり、Netsuite UIの検索結果ページの結果ヘッダーの右側に表示されます。

  • カウント (結果の総数)
  • pageRanges (UIのコンボボックスセレクタとして利用可能なページのリスト)

options.pageSizeパラメータは、結果の行が1000行に制限されています。
PagedData.fetchメソッドは、必要な結果部分をフェッチするために使用されます(pageIndexパラメータによってインデックス付けされます)。もう少しコードを追加すると、4000行制限なしで、Search.ResultSet.eachと同じ便利なコールバック関数を受け取ります。

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

        });

    }

ガバナンスを計算します。 runPaged()は5ユニット、pagedData.fetchの呼び出しは1ユニット+カウント/ 1000(それぞれ5ユニット)です:

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

例:9500行には55単位が必要です。 getRangeガバナンス・ユニットのおよそ半分。

専用マップ/縮小スクリプトの使用

本当に巨大な検索結果を得るには、専用のMap / Reduceスクリプトを使用できます。はるかに不便ですが、時には避けられないこともあります。時には非常に便利なこともあります。
ここでのトリックは、入力データの取得ステージで、実際のデータ(つまりスクリプト結果)ではなく、検索の定義だけをNSエンジンに提供できることです。 NSはガバナンスユニットを数えずに検索を実行します。次に、各単一の結果行がマップステージに渡されます。
もちろん、制限があります:マップ/縮小スクリプトのデータの永続的なサイズの合計が50MBを超えることは許されません。検索結果では、各値の各キーとシリアル化されたサイズが合計サイズにカウントされます。 「シリアライズ」とは、検索結果の行がJSON.stringifyで文字列に変換されることを意味します。したがって、値のサイズは、結果セット内の検索結果列の数に比例します。 STORAGE_SIZE_EXCEEDEDのエラーが発生した場合は、列を減らしたり、数式に結合したり、結果をグループ化したり、複数のサブ検索に分割することも検討してください。

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

もちろん、ここでの例は、エラー処理なしで単純化されており、他のものと比較するために与えられています。より多くの例は、NS Help Centerの「Map / Reduce Script Type」の例で入手できます



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow