This topic contains 5 replies, has 0 voices, and was last updated by jmkplessers 6 years, 5 months ago.

  • Author
    Posts
  • #17848 Score: 0

    starlingMark
    • Contributions: 0
    • Level 1

    I am iterating over a bunch of fields that are similarly named – one per month. If I do this:

    Code:
    currentRecord.getValue({ fieldId: ‘custrecord_myrecord_’ + month + ‘_quantity’ })
    I get SSS_MISSING_REQD_ARGUMENT. If I build the field id name in a variable first, and then try this, I still get SSS_MISSING_REQD_ARGUMENT. However, if I do this craziness:

    Code:
    currentRecord.getValue({ fieldId: eval(‘”‘ + ‘custrecord_myrecord_’ + month + ‘_quantity’ + ‘”‘) })
    It works as expected. Am I missing something here?
    This is a cached copy. Click here to see the original post.

  • #17849 Score: 0

    JohnCCole
    • Contributions: 0
    • Level 1

    Not that I have a solution but I have had a similar issue in SuiteScript 1.0. building dynamic search filters. The same code would actually work on the client side but on the server side I had to use concat method as + operator was introducing an error maybe try

    Code:
    ‘custrecord_myrecord_’.concat(month, ‘_quantity’)

  • #17850 Score: 0

    darrenhillconsulting
    • Contributions: 0
    • Level 1

    I do this, no issues. I did notice, your first example ends with _quantity were as your second example ends in _qty

    Perhaps that’s the real problem


    starlingMark replied on 10/31/2017, 07:06 AM: Thanks Darren – fat fingering my examples is a bad way to start. No doubt the real issue lies between my keyboard and the user!

  • #17851 Score: 0

    pcutler
    • Contributions: 0
    • Level 1

    I haven’t run into that issue myself, but if I was struggling with it my next step would be to edit the script to put the field name into a variable and log the value in that variable prior to invoking currentRecord.getValue.

  • #17852 Score: 0

    starlingMark
    • Contributions: 0
    • Level 1

    I’ve actually hit my head on this again, but found another solution. For those that come after me, here’s an example.

    If I call currentRecord.getValue({ fieldId: myField }) under the following circumstances, here is what happens:

    myField = ‘custrecord_myfield’
    works

    myField = ‘custrecord_’ + ‘myfield’
    works

    fieldName = ‘myfield’, myField = ‘custrecord_’ + fieldName
    fails

    fieldName = ‘myfield’, myField = String(‘custrecord_’ + fieldName)
    works

    I cannot explain why this works, I just know that it does.

  • #17855 Score: 0

    jmkplessers
    • Contributions: 0
    • Level 1

    I have seen this when dynamically building search filter expressions. This bug only appears in server scripts. You can run the following code in the script debugger to demonstrate the error:

    (I left some context in to show an actual use case for building the expression this way):

    Code:
    require([“N/search”], function(search) {
    var dynamicValue = “foo”;
    var filterExpr = [
    “formulanumeric: case when regexp_like({memo}, ‘(^|\W)” + dynamicValue + “(\W|$)’) then 1 else 0 end”,
    “equalto”,
    “1”
    ];

    log.debug({ title: typeof filterExpr[0] }); // string
    log.debug({ title: typeof filterExpr[1] }); // string

    // throws SSS_INVALID_SRCH_FILTER_EXPR_TYPE: Malformed search filter expression, first two elements must be strings.
    search.create({
    type: search.Type.SALES_ORDER,
    filters: filterExpr,
    });
    });
    Interestingly, NetSuite complains that the values are not strings when they clearly are.

    My best guess is that the Rhino interpreter parses string concatenation expressions into different Java classes than string literals/variables. The NetSuite API then fails to consider those classes when validating that an argument is a javascript “string”.

    As you have found, you can get around this by evaluating the string concatenation differently or before storing the variable:

    Code:
    // works
    var filterExpr = [
    [
    “formulanumeric: case when regexp_like({memo}, ‘(^|\W)”,
    dynamicValue,
    “(\W|$)’) then 1 else 0 end”
    ].join(“”),
    “equalto”,
    “1”
    ];

    Code:
    // works
    var filterExpr = [
    String(“formulanumeric: case when regexp_like({memo}, ‘(^|\W)” + dynamicValue + “(\W|$)’) then 1 else 0 end”),
    “equalto”,
    “1”
    ];

You must be logged in to reply to this topic.