将javascript字符串变量传递给nlapiSearchRecord过滤器

时间:2017-03-24 15:43:10

标签: suitescript

我正在使用Suitelet将落地成本(通过.csv文件)应用于项目收据。下面的代码是遍历一组PO编号,以构建一个公式(数字),以传递给nlapiSearchRecord()

在从变量传递部分搜索过滤器时,我无法触发搜索。我试过传递各种大小的字符串,有或没有双引号或单引号(请参阅注释部分的想法),现在我只是将一个变量testNumber传递给搜索字符串。它还没有给我这个错误:

  

SSS_INVALID_SRCH_FILTER_EXPR_OBJ_TYPE
格式错误的搜索过滤器表达式:无法识别的对象类型。

完整的一行应该是

["formulanumeric: case when {number} = 'PO476' or {number} = '294' then 1 else 2 end","equalto","1"], 

        for(var i = 0; i<poNumbers.length; i++) {

            if(i < (poNumbers.length - 1)) {

                poFormula += "{number} = '"+poNumbers[i]+"' or ";

            }

            else {
                poFormula += "{number} = '"+poNumbers[i]+"'";
            }

        }

        //poFormula(string) --> {number} = 'PO481' or {number} = 'PO476' or {number} = '294' or {number} = 'PO440' or {number} = 'PO441'

        //var searchFormulaStart = "formulanumeric: case when "+poFormula+" then 1 else 2 end";
        //var sfMiddle = "equalto";
        //var sfEnd = "1";

        var testNumber = "'PO476'";

        var purchaseorderSearch = nlapiSearchRecord("purchaseorder",null,
        [
           ["mainline","is","T"],
           "AND",
           ["type","anyof","PurchOrd"],
           "AND",
           ["formulanumeric: case when {number} = "+testNumber+" then 1 else 2 end","equalto","1"], 
           //[searchFormulaStart,sfMiddle,sfEnd],
           "AND",
           ["type","anyof","PurchOrd"]
        ], 
        [
           new nlobjSearchColumn("internalid",null,null)
        ]
        );

我的想法是,我需要返回.csv中包含的所有PO,以便我可以获取其内部ID。稍后在代码中,我将这些ID传递到针对项目收据的另一个搜索,查找从这些PO创建的所有收据。有了这些,我可以将运费用于这些收据。

       var itemreceiptSearch = nlapiSearchRecord("itemreceipt",null,
            [
               ["type","anyof","ItemRcpt"], 
               "AND", 
               ["mainline","is","T"], 
               "AND", 
               ["createdfrom","anyof", poInternalIds]
            ], 
            [
               new nlobjSearchColumn("tranid",null,null)
            ]
            );

任何人都可以确认是否存在某些未记录的错误或者某个从这样的变量中传入部分搜索字符串的内容?或者,给定采购订单编号和运费,是否有更好的方法将到岸成本应用于项目收货?

谢谢!

2 个答案:

答案 0 :(得分:1)

我在Slack的一些人的帮助下找到了解决方案。我现在不是尝试将变量连接到过滤器字符串中,而是在forEach()循环中创建整个过滤器数组,如下所示。

我仍然不确定为什么Netsuite API不喜欢我的搜索格式化连接,但无论如何这是一个更清晰的解决方案。

        for(var i = 0; i<freightCosts.length; i++) {

            poNumbers.push(freightCosts[i].PO);

        }

        poNumbers.forEach(function(tranid){

            filters.push(["tranid", "is", tranid]);
            filters.push("or");

        });
        // remove the last "or"
        filters.pop();

        var purchaseorderSearch = nlapiSearchRecord("purchaseorder",null,
        [
           ["mainline","is","T"],
           "AND",
           ["type","anyof","PurchOrd"],
           "AND",
           [filters]
        ], 
        [
           new nlobjSearchColumn("internalid",null,null)
        ]
        );

答案 1 :(得分:0)

奇怪的是,上周我遇到了这个问题。它似乎是Netsuite使用的Rhino Javascript引擎中的一个错误。让它工作的解决方法是将您的串联包装在String()

[String("formulanumeric: case when {number} = "+ testNumber + " then 1 else 2 end"), "equalto", "1"]
相关问题