计划的定期脚本-将脚本设置为连续运行,直到保存的搜索结果为空为止

问题描述 投票:0回答:3

我建立了一个脚本,该脚本在处理已保存搜索的每一行时会查看要处理的已保存搜索中的字段。该脚本必须处理很多行数据,并且由于我正在处理的信息量的性质,我遇到了一个超出SSS使用限制的消息的问题。因此,我想知道是否可以在每次脚本运行时限制所处理的订单数量,然后连续运行脚本,直到不再需要处理任何记录为止

[以前,我只限制一次脚本处理的记录数,然后手动触发脚本,直到不再需要处理任何行为止。我看到您可以触发脚本每15分钟左右运行一次,但希望它每天运行一次,然后以15分钟的节奏运行,直到保存的搜索用尽。然后,该脚本将被触发,第二天再次运行,每15分钟运行一次,直到处理完所有记录。从研究中不知道这种调度是否可行。

代码本身正在进行调度,这是我需要的指导

netsuite suitescript suitescript2.0
3个回答
0
投票

我鼓励您使用Map / Reduce脚本。那是处理大量数据时使用的正确脚本类型,并且可以更好地处理治理问题。


0
投票

前一段时间,我遇到了这个问题。如果运行2.0脚本,则可以使用map / reduce脚本。就我而言,我在1.X和2.X版本中具有“旧版”脚本。而且所有这些都不时抛出“ SSS_TIME_LIMIT_EXCEEDED”。

我的解决方案:)我创建了一个脚本,一种“侦听器”。 click to see it

  // *add the script listener 
  // [it can be used for both script versions 1.X and 2.X]

     /** you have to calculate the 'process usage' by 1 loop cycle. 
         use script.getRemainingUsage() */
    var recallValue = 200;
    var stopValue = 200;
    var recallIsRequired = true;// use false to stop the script without recall

    var script = setScriptListener(recallValue, stopValue, recallIsRequired);

    for (var data in data_contaniner){
      if(script.canContinue()){
        //run you processing 
        // !important : mark the data as 'processed'. 
        //otherwise you will have a lot of duplicates after script recall
      }else{
        //stop the loop 
        break;
      }
    }

0
投票

另一种选择(也是我成功使用的一种选择)是当使用率达到特定点时退出计划脚本,但是在退出之前,再次触发计划脚本。我已经成功地使用它来处理成千上万的记录(例如批量删除)。

/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
define(['N/record', 'N/runtime', 'N/search', 'N/task'],
/**
 * @param {record} record
 * @param {search} search
 */
function(record, runtime, search, task) {

    const governanceCap = 9950;

    function getAllResults(s) {
        var results = s.run();
        var searchResults = [];
        var searchid = 0;
        do {
            var resultslice = results.getRange({start:searchid,end:searchid+1000});
            resultslice.forEach(function(slice) {
                searchResults.push(slice);
                searchid++;
                }
            );
        } while (resultslice.length >=1000);
        return searchResults;
    }

    /**
     * Definition of the Scheduled script trigger point.
     *
     * @param {Object} scriptContext
     * @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
     * @Since 2015.2
     */
    function execute(scriptContext) {

        function rescheduleCurrentScript() {
            var scheduledScriptTask = task.create({
                taskType: task.TaskType.SCHEDULED_SCRIPT
            });
            scheduledScriptTask.scriptId = runtime.getCurrentScript().id;
            scheduledScriptTask.deploymentId = runtime.getCurrentScript().deploymentId;
            return scheduledScriptTask.submit();
        }

        try {

            var script = runtime.getCurrentScript();

            // GET YOUR SEARCH HERE

            var mySearch = getAllResults(
                search.create({
                       type: "transaction",
                       filters:
                       [
                          ["mainline","is","T"],
                       ],
                       columns:
                       [
                           "name",
                           "tranid",
                           "type",
                           search.createColumn({
                               name:"datecreated", 
                               sort: search.Sort.DESC
                            }),
                       ]
                    })
                );
            var recCount = mySearch.length;
            for (each in mySearch) {
                try {
                    record.delete({
                        type: transSearch[each].getValue({name:'type'}),
                        id: transSearch[each].id
                    });
                } catch (err) {log.error(err.name,err.message) }

                var govPointsUsed = 10000-script.getRemainingUsage();

                script.percentComplete = (govPointsUsed/governanceCap*100).toFixed(1);

                if (govPointsUsed >= governanceCap) {
                    var taskId = rescheduleCurrentScript();
                    log.audit('Rescheduling status: ','Task ID:' + taskId);
                    return;
                }
            }
        } catch (err) { log.error(err.name,err.message + '; Stack: '+err.stack ) };    
    }

    return {
        execute: execute
    };

});

像魅力一样工作!

© www.soinside.com 2019 - 2024. All rights reserved.