如何在 SuiteScript 2.0 搜索中传递过滤器对

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

编辑:代码的工作版本(归功于 Netsuite slack 上的用户 Raghav 以获得解决方案)


/**
 * @NApiVersion 2.x
 * @NScriptType MapReduceScript
 */
define(["N/runtime", "N/search", "N/util"], function (runtime, search, util) {
  function getInputData() {
    var scriptObj = runtime.getCurrentScript();

    var filtersParam = runtime
      .getCurrentScript()
      .getParameter({ name: "custscript_selected_lines_json" });
    var lineIdToTransactionIdMap = JSON.parse(filtersParam);
    log.debug("lineIdToTransactionIdMap", lineIdToTransactionIdMap);
    var searchResults = [];

    function convertToSuiteScriptFilter(lineIdToTransactionIdMap) {
      var filter = [];
      filter.push(["type", "anyof", "CustInvc"]);
      filter.push("AND");

      var subFilter = [];
      var flag = false;

      for (var internalId in lineIdToTransactionIdMap) {
        if (lineIdToTransactionIdMap.hasOwnProperty(internalId)) {
          if (flag) {
            subFilter.push("OR");
          }
          flag = true;

          var temp = [];
          temp.push(["internalid", "anyof", internalId]);
          temp.push("AND");

          var lineIds = lineIdToTransactionIdMap[internalId];
          var lineFilters = [];

          for (var i = 0; i < lineIds.length; i++) {
            lineFilters.push(["line", "equalto", lineIds[i]]);
            if (i !== lineIds.length - 1) {
              lineFilters.push("OR");
            }
          }

          temp.push(lineFilters);
          subFilter.push(temp);
        }
      }

      filter.push(subFilter);
      return filter;
    }

    var dynamicFilter = convertToSuiteScriptFilter(lineIdToTransactionIdMap);
    log.debug("filter", filter);
    // var keyValuePairs = lineIdToTransactionIdMap;

    // Creating the filter
    // var filters = createDynamicFilter(keyValuePairs);
    log.debug("createdynamicfilters", dynamicFilter);
    var isarray = util.isArray(dynamicFilter);
    log.debug("isarray?", isarray);
    try {
      // Create the search using the filters
      var invoiceSearchObj = search.create({
        type: "invoice",
        filters: dynamicFilter,
        columns: [
          search.createColumn({ name: "internalid", label: "Internal ID" }),
          search.createColumn({ name: "trandate", label: "Date" }),
          search.createColumn({ name: "entity", label: "Name" }),
          search.createColumn({ name: "tranid", label: "Document Number" }),
          search.createColumn({ name: "line", label: "Line" }),
          search.createColumn({ name: "amount", label: "Amount" }),
        ],
      });

      var resultSet = invoiceSearchObj.run();
      log.debug("invoiceSearchObj", resultSet);
      return invoiceSearchObj;
    } catch (e) {
      var errorMessage = e.message + " (Line: " + e.lineNumber + ")";
      log.error({
        title: "Error",
        details: errorMessage,
      });
    }
  }

我有以下套房:

选定的行将作为 [内部 id,行 id] 对传递到地图缩减脚本。

例如,从屏幕截图中选定的行中,传递给 MapReduce 脚本的结果值为: {"44760":["9"],"44762":["3","4"]}

对于 MapReduce 的获取输入阶段,我如何构建一个过滤器以便它获取这些数据对?

从 UI 到脚本(使用 chrome 导出脚本扩展),我可以看到搜索是:

    var invoiceSearchObj = search.create({
       type: "invoice",
       filters:
       [
          ["type","anyof","CustInvc"], 
          "AND", 
          ["internalid","anyof","44762"], 
          "AND", 
          [["line","equalto","3"],"OR",["line","equalto","4"]], 
          "OR", 
          ["internalid","anyof","44760"], 
          "AND", 
          [["line","equalto","3"],"OR",["line","equalto","4"]]
       ],
       columns:
       [
          search.createColumn({name: "internalid", label: "Internal ID"}),
          search.createColumn({name: "trandate", label: "Date"}),
          search.createColumn({name: "entity", label: "Name"}),
          search.createColumn({name: "tranid", label: "Document Number"}),
          
          }),

如何传递动态键值对以适应此语法?

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