Search code examples
workflownetsuitesuitescript2.0

Trying to store SuiteScript search result as a lookup parameter


I have the following code which returns the internal ID of a sales order by looking it up from a support case record.

So the order of events is:

  • A support case is received via email
  • The free text message body field contains a reference to a sales order transaction number. This is identified by the use of the number convention of 'SO1547878'
  • A workflow is triggered on case creation from the email case creation feature. The sales order number is extracted and stored in a custom field.

SO Number

  • The internal ID of the record is looked up and written to the console (log debug) using the workflow action script below:

*@NApiVersion 2.x *@NScriptType WorkflowActionScript * @param {Object} context

define(["N/search", "N/record"], function (search, record) {
  function onAction(context) {
    var recordObj = context.newRecord;
    var oc_number = recordObj.getValue({ fieldId: "custevent_case_creation" });
    var s = search
      .create({
        type: "salesorder",
        filters: [
          search.createFilter({
            name: "tranid",
            operator: search.Operator.IS,
            values: [oc_number],
          }),
        ],
        columns: ["internalid"],
      })
      .run()
      .getRange({
        start: 0,
        end: 1,
      });
    log.debug("result set", s);
    return s[0];
  }

  return {
    onAction: onAction,
  };
});

log.debug

I am trying to return the resulting internal ID as a parameter so I can create a link to the record on the case record. I'm getting stuck trying to work out how I would do this? Is there a way to store the value on the case record, of the internal ID, that is looked up? (i.e.the one currently on the debug logs)?

I am very new to JS and Suitescript so am not sure at what point in this process, this value would need to be stored in the support case record. At the moment. the workflow action script (which is the part of the workflow the above script relates to) is set to trigger after submit transaction from lookup Thanks

Edit: Thanks to Bknights, I have a solution that works. The workflow: workflow workflow states

The new revised script is as follows:

     *@NApiVersion 2.x
     *@NScriptType WorkflowActionScript
     * @param {Object} context
     */
    define(["N/search", "N/record"], function (search, record) {
      function onAction(context) {
        var recordObj = context.newRecord;
        var oc_number = recordObj.getValue({ fieldId: "custevent_case_creation" });
        var s = search
          .create({
            type: "salesorder",
            filters: [
              search.createFilter({
                name: "tranid",
                operator: search.Operator.IS,
                values: [oc_number],
              }),
            ],
            columns: ["internalid"],
          })
          .run()
          .getRange({
            start: 0,
            end: 1,
          });
        log.debug("result set", s[0].id);
    
        return s[0].id;
      }
    
      return {
        onAction: onAction,
      };
    });

On the script record for the workflow action script, set the type of return you expect. In this case, it would be a sales order record:

parameters

This would allow you to use a list/record field to store the value from the 'search message' workflow action created by the script store value custom field

the result enter image description here

Edit 2: A variation of this

    /**
     *@NApiVersion 2.x
     *@NScriptType WorkflowActionScript
     * @param {Object} context
     */
    
    define(["N/search", "N/record"], function (search, record) {
      function onAction(context) {
        try {
          var recordObj = context.newRecord;
          var oc_number = recordObj.getValue({
            fieldId: "custevent_case_creation",
          });
          var s = search
            .create({
              type: "salesorder",
              filters: [
                search.createFilter({
                  name: "tranid",
                  operator: search.Operator.IS,
                  values: [oc_number],
                }),
              ],
              columns: ["internalid","department"],
          
            })
            .run()
            .getRange({
              start: 0,
              end: 1,
            });
          log.debug("result set", s[0]);
          recordObj.setValue({fieldId:'custevent_case_sales_order', value:s[0].id});
    
      //    return s[0]
        } catch (error) {
          log.debug(
            error.name,
            "recordObjId: " +
              recordObj.id +
              ", oc_number:" +
              oc_number +
              ", message: " +
              error.message
          );
        }
      }
    
      return {
        onAction: onAction,
      };
    });

Solution

  • Depending on what you want to do with the order link you can do a couple of things.

    If you want to reference the Sales Order record from the Support Case record you'd want to add a custom List/Record field to support cases that references transactions. (ex custevent_case_order)

    Then move this script to a beforeSubmit UserEvent script and instead of returning extend it like:

    recordObj.setValue({fieldId:'custevent_case_order', value:s[0].id});
    

    For performance you'll probably want to test whether you are in a create/update event and that the custom order field is not yet filled in.

    If this is part of a larger workflow you may still want to look up the Sales Order in the user event script and then start you workflow when that field has been populated.

    If you want to keep the workflow intact your current code could return s[0].id to a workflow or workflow action custom field and then apply it to the case with a Set Field Value action.