The Zurich release has arrived! Interested in new features and functionalities? Click here for more

I want to get the ritm varaibles and then from the varaibles i need to get the referenced varaibles

Negha1
Tera Contributor
I want to get the ritm variables and then from the variables i need to get the referenced variables and then i need all the fields from the referenced record , but this script i giving only the variables from the RITM. It has to be for mu;ltiple RITMS. there is also a script include given below
 
 
(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var ritmNumbers = request.getHeader('ritm');
    var responseObj = {};

    if (!ritmNumbers) {
        response.setStatus(417);
        return {
            error: "Missing 'ritm' header. Please supply comma-separated RITM numbers."
        };
    }

    ritmNumbers = ritmNumbers.split(',').map(function(item) {
        return item.trim();
    });

    var ritmGR = new GlideRecord('sc_req_item');

    for (var i = 0; i < ritmNumbers.length; i++) {
        var ritmNumber = ritmNumbers[i];

        if (!ritmGR.get('number', ritmNumber)) {
            response.setStatus(417);
            response.setHeader(ritmNumber, 'Unable to find RITM: ' + ritmNumber);
            continue;
        }

        var resultObj = {
            number: ritmNumber
        };

        var variables = ritmGR.variables;
        var catItemSysId = ritmGR.getValue('cat_item');

        for (var varName in variables) {
            try {
                var varValue = variables[varName];
                if (!varValue || !varValue.getValue()) continue; // skip empty

                var displayValue = varValue.getDisplayValue();
                var internalValue = varValue.getValue();

                // Skip variables with empty values
                if (!internalValue) continue;

                var isReference = false;
                var refTable = "";

                // Try to detect reference type and ref table from variable definition
                var itemVar = new GlideRecord('item_option_new');
                itemVar.addQuery('name', varName);
                itemVar.addQuery('ORcat_item', catItemSysId);

                // Include variable sets
                var vsJoin = itemVar.addJoinQuery('item_option_new_set', 'sys_id', 'variable');
                vsJoin.addJoinQuery('io_set_item', 'variable_set', 'sys_id')
                    .addCondition('catalog_item', catItemSysId);

                itemVar.query();

                if (itemVar.next()) {
                    var type = itemVar.getValue('type');
                    refTable = itemVar.getValue('reference');
                    isReference = type === 'reference';
                }

                // If reference field, expand the referenced record
                if (isReference && refTable && internalValue) {
                    var refGR = new GlideRecord(refTable);
                    if (refGR.get(internalValue)) {
                        var refFields = {};
                        var fields = refGR.getFields();
                        var iterator = fields.iterator();
                        while (iterator.hasNext()) {
                            var field = iterator.next().getName();
                            if (field !== 'sys_id') {
                                refFields[field] = refGR.getDisplayValue(field);
                            }
                        }
                        resultObj[varName] = refFields;
                    } else {
                        resultObj[varName] = displayValue; // fallback
                    }
                } else {
                    resultObj[varName] = displayValue;
                }

            } catch (err) {
                gs.error('⚠️ Error processing variable [' + varName + '] in ' + ritmNumber + ': ' + err.message);
            }
        }

        responseObj[ritmNumber] = resultObj;
    }

    return {
        result: responseObj
    };

})(request, response);
 
Negha1_0-1754467677836.png

Script include:

stringOperation = Class.create();
stringOperation.prototype = {
    initialize: function() {},

    trimAndSplit(inputString, token) {
        var i, inputArr;
        var resultArray = [];

        //Give token a default value if not specified
        token = (!token) ? ',' : token;

        if (!inputString || typeof inputString !== 'string') {
            gs.logError(
                'trimAndSplit function received an invalid argument in the first argument. The argument received was: ' +
                inputString +
                '. The only acceptable first argument for trimAndSplit, is a string.');
            return [];
        }
        if (inputString.indexOf(token) < 0) {
            //Return the original string in an array, because no instances of the token were found.
            return [inputString];
        }

        //convert the input string to an array, splitting on the provided token (usually ',')
        inputArr = inputString.split(token);
        for (i = 0; i < inputArr.length; i++) {
            //Trim each element in the split string array, then push it to the return array.
            resultArray.push(inputArr[i].trim());
        }

        //return the trimmed and split array.
        return resultArray;
    },

    type: 'stringOperation'
};
 
3 REPLIES 3

Ankur Bawiskar
Tera Patron
Tera Patron

@Negha1 

update as this, ensure to pass RITM numbers in header as comma separated values like below

ritm: RITM0001234,RITM0001256,RITM0001278

Scripted REST API

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var ritmNumbers = request.getHeader('ritm');
    var responseObj = {};

    if (!ritmNumbers) {
        response.setStatus(417);
        return {
            error: "Missing 'ritm' header. Please supply comma-separated RITM numbers."
        };
    }

    // Using your Script Include for splitting, or just simple split+trim here
    var ritmNumArray = ritmNumbers.split(',').map(function(item) {
        return item.trim();
    });

    // Create GlideRecord outside loop
    var ritmGR = new GlideRecord('sc_req_item');

    // Loop through each RITM number
    ritmNumArray.forEach(function(ritmNumber) {

        // Always initialize/reset before get() to avoid data carry-over
        ritmGR.initialize();

        if (!ritmGR.get('number', ritmNumber)) {
            response.setStatus(417);
            response.setHeader(ritmNumber, 'Unable to find RITM: ' + ritmNumber);
            return; // skip to next RITM
        }

        var resultObj = {
            number: ritmNumber
        };

        var variables = ritmGR.variables;
        var catItemSysId = ritmGR.getValue('cat_item');

        // Iterate over all variables on the RITM
        for (var varName in variables) {
            try {
                var varValue = variables[varName];

                if (!varValue || !varValue.getValue()) continue; // skip empty/null

                var displayValue = varValue.getDisplayValue();
                var internalValue = varValue.getValue();

                if (!internalValue) continue;

                // Determine if variable is a reference type and get referenced table
                var itemVarGR = new GlideRecord('item_option_new');
                itemVarGR.addQuery('name', varName);
                itemVarGR.addQuery('cat_item', catItemSysId);
                itemVarGR.query();

                var isReference = false;
                var refTable = "";

                if (itemVarGR.next()) {
                    var type = itemVarGR.getValue('type');
                    refTable = itemVarGR.getValue('reference');
                    isReference = (type === 'reference');
                }

                if (isReference && refTable && internalValue) {
                    // Fetch referenced record fields
                    var refGR = new GlideRecord(refTable);
                    if (refGR.get(internalValue)) {
                        var refFields = {};
                        var fields = refGR.getFields();
                        var iterator = fields.iterator();
                        while (iterator.hasNext()) {
                            var field = iterator.next().getName();
                            if (field !== 'sys_id') {
                                refFields[field] = refGR.getDisplayValue(field);
                            }
                        }
                        resultObj[varName] = refFields;
                    } else {
                        // Reference record not found, fallback to display value
                        resultObj[varName] = displayValue;
                    }
                } else {
                    // Not a reference type, just assign the display value
                    resultObj[varName] = displayValue;
                }

            } catch (e) {
                gs.error('Error processing variable [' + varName + '] in ' + ritmNumber + ': ' + e.message);
            }
        }

        responseObj[ritmNumber] = resultObj;
    });

    return {
        result: responseObj
    };

})(request, response);

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Negha1
Tera Contributor

Negha1_0-1754562833241.png

Iam getting the variables but not the referenced record fields.

Negha1
Tera Contributor

Negha1_1-1754563006955.png

For multiple RTM case.