
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 09:26 AM - edited 12-10-2024 09:27 AM
Hi Community!
Seeking help with the following issue. Gist: An onLoad Catalog Client script with Script Include (SI) call works fine in Portal (/sp or /esc) but in Platform UI the form loads too fast, and the response from the SI is not received, so the variable set (where the Client Script is configured) fails to load properly.
- We have a custom field in the Catalog Item [sc_cat_item] table that determines how approvals work (one group or another or manager etc.)
- We have a variable set that looks up that value to set its variables and those values are fed into the given flow / workflow to get approval
- We use a Script Include to fetch that value
- The Script Include was configured originally for only Catalog Items, i.e., not for Order Guides
- When it checks the custom approval type field it sends the current item sys ID to the Script Include and checks only the sc_cat_item table for that ID
- However we have a few Order Guides now that also need to use this variable set
- The variable set seems to work ok in portals but not in the platform UI and I discovered it was having an issue when looking up the current item approval type because the table is sc_cat_item_guide.
- I have updated the Script Include function to look up the table but no matter what method I try the response from the SI is not coming fast enough and the values come back 'null' which breaks the Client Script functionality, causing fields to not show up in the form that are necessary for proper approval functionality.
So what is a functional method to find the current table / class name in an onLoad Client Script?
I have tried g_form.getTableName() but it fails and I get 'null' values. I have also (as you'll see below) tried using a global table lookup function (which I found here) that works fine in a background script and in a portal but in platform UI this too returns nothing.
Client Script:
function onLoad() {
// load Manager
g_form.getReference("requested_for", function(user) {
if(!user.manager || user.manager == '' || user.manager == undefined) {
g_form.setValue("is_my_manager", 'No');
g_form.setReadOnly("is_my_manager", true);
// g_form.showFieldMsg("requester_manager", "Manager is empty");
return;
}
g_form.setValue("requester_manager", user.manager);
// Get from back-end the Manager Information
var ga = new GlideAjax('LippertSCUtil');
ga.addParam('sysparm_name', 'getUserInfo');
ga.addParam('sysparm_user_id', user.manager);
ga.getXML(function(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
var usr = JSON.parse(answer);
// boolean values come as 0 and 1
// 0 = false 1 = true
if (usr.active == 0) {
g_form.setValue("is_my_manager", 'No');
g_form.setReadOnly("is_my_manager", true);
g_form.showFieldMsg("requester_manager", "Manager is inactive");
}
});
});
// By default Hide the fields
g_form.setVisible("requester_manager", false);
g_form.setVisible("is_my_manager", false);
// Get the current Catalog Item
var id = g_form.getUniqueValue();
// Get from back-end the Approving Authority
var ga = new GlideAjax('LippertSCUtil');
ga.addParam('sysparm_name', 'getApprovingAuthority');
ga.addParam('sysparm_cat_item_id', id);
ga.getXML(function(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
// When Immediate supervisor, then display the manager fields
if (answer == "Immediate Supervisor") {
g_form.setVisible("requester_manager", true);
g_form.setVisible("is_my_manager", true);
g_form.setMandatory("is_my_manager", true);
}
});
}
Script Include (just the relevant functions):
getApprovingAuthority: function() {
var itemID = this.getParameter("sysparm_cat_item_id");
// Find the sc_cat_item[_x] table name to ensure Approving Authority is not null
var classTable = findAnywhere(itemID);
var catItem = new GlideRecord(classTable);
catItem.get(itemID);
return catItem.getValue("u_approving_authority") + '';
// findAnywhere function
function findAnywhere(sysIDToFind, getHTML) {
if (getHTML !== true && getHTML !== 'true') {
getHTML = false;
}
var grCheck;
var tableName;
var grTable = new GlideRecord('sys_db_object');
//Only check tables with names starting with "sc_cat_item".
grTable.addEncodedQuery('sys_update_nameISNOTEMPTY^nameISNOTEMPTY^nameSTARTSWITHsc_cat_item');
grTable.query();
while (grTable.next()) {
tableName = grTable.getValue('name');
grCheck = new GlideRecord(tableName);
if (grCheck.get(sysIDToFind)) {
return tableName;
}
}
}
},
getUserInfo: function() {
var userID = this.getParameter("sysparm_user_id");
var user = new GlideRecord("sys_user");
user.get(userID);
var o = {
'active': user.getValue('active'),
'email': user.getValue('email'),
'user_name': user.getValue('user_name')
};
return JSON.stringify(o);
},
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 10:35 AM - edited 12-10-2024 10:36 AM
I'm confused.
- Order Guides do not directly create RITMs and do not have Flows or Workflows. They order Catalog Item(s).
- Order Guide extends Catalog Item, so searching for the Order Guide on the Catalog Item table should work
- Global table lookup is highly inefficient
- Defaults are being set via script rather than on the variables themselves, which is inefficient
- You have visibility and mandatory conflicts between your two sections: Inactive Manager and Approving Authority
If you cannot set the Defaults at the field level, move them to the top of the script.
If you cannot nest or merge your functions, start a scratchpad.
var usr = JSON.parse(answer);
g_scratchpad.manager_active = usr.active;
g_scratchpad.approving_auth = answer
Then in each function, you will want to check BOTH
if (usr.active == 0 && g_scratchpad.approving_auth == "Immediate Supervisor")
if (answer == "Immediate Supervisor" && g_scratchpad.manager_active == 1)
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 09:33 AM
Hi @apjohn2 ,
Before checking all code details, please confirm if UI Type = All in onLoad catalog client script.
-Thanks,
AshishKM
Please mark this response as correct and helpful if it helps you can mark more that one reply as accepted solution

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 10:39 AM
Yes, UI Type is set to All. Also AJ M provided some scintillating food for thought below that I need to consider carefully. 🙂
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 10:35 AM - edited 12-10-2024 10:36 AM
I'm confused.
- Order Guides do not directly create RITMs and do not have Flows or Workflows. They order Catalog Item(s).
- Order Guide extends Catalog Item, so searching for the Order Guide on the Catalog Item table should work
- Global table lookup is highly inefficient
- Defaults are being set via script rather than on the variables themselves, which is inefficient
- You have visibility and mandatory conflicts between your two sections: Inactive Manager and Approving Authority
If you cannot set the Defaults at the field level, move them to the top of the script.
If you cannot nest or merge your functions, start a scratchpad.
var usr = JSON.parse(answer);
g_scratchpad.manager_active = usr.active;
g_scratchpad.approving_auth = answer
Then in each function, you will want to check BOTH
if (usr.active == 0 && g_scratchpad.approving_auth == "Immediate Supervisor")
if (answer == "Immediate Supervisor" && g_scratchpad.manager_active == 1)

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
12-10-2024 10:44 AM
"Order Guide extends Catalog Item, so searching for the Order Guide on the Catalog Item table should work"
Fantastic point and something I was sorely needing reminded of. Thank you so much. You're right, of course--if I load the sc_cat_item table I can in fact see all records regardless of Class--Order Guides, .Record Producers, etc.
I will mark your response as the solution now and will go back to the drawing board on the script, why it was configured to do what it's trying to do, and making sure it follows best practices as you noted. The scratchpad concepts are interesting too and I will try to learn more about that and see if it can help.
Thank you again!!