Dot walking through multiple tables in client script

Kyle Wiley
Kilo Expert

I am trying to dot walk through multiple tables in an onChange client script on the Incident table.  When the Caller field on the INC form changes, I want to reference the sys_user table to see what department the Caller is in.  The field that I am trying to use on the Department table is u_department_group.

 

function onChange(control, oldValue, newValue, isLoading, isTemplate) {

   if (isLoading || newValue === '') {

      return;

   }

var caller = g_form.getReference('caller_id');

var dept = g_form.getReference('caller_id').department;

   if (newValue) {

  confirm(caller.name);

  confirm(dept);

   }

}

 

caller.name prints out the user's full name as it displays in the sys_user table but when I try to print out dept, the only value I get is the sys_id.  I cannot get the department name to display or any other field on the Department table to display anything.

Is this possible in a client script?  

1 ACCEPTED SOLUTION

Here's the same script but using your custom field cmn_department.u_department_group:



function onChange(control, oldValue, newValue, isLoading, isTemplate) {
  if (isLoading || newValue === '') {
      return;
  }


  var caller = g_form.getReference('caller_id');
  var dept = caller.department;
  if (dept) {
      var grDept = new GlideRecord('cmn_department');
      if (grDept.get(dept)) {
          confirm(caller.name + ' works at ' + grDept.u_department_group);
      }
  }
}


View solution in original post

12 REPLIES 12

One way to improve .getReference() is to make it asynchronous by providing a callback function as the second parameter as below, modified from the "answer":



function onChange(control, oldValue, newValue, isLoading, isTemplate) {
  if (isLoading || newValue === '') {
      return;
  }



  var caller = g_form.getReference('caller_id', getDept);



  function getDept(caller) {
      var dept = caller.department;
      if (dept) {
          var grDept = new GlideRecord('cmn_department');
          if (grDept.get(dept)) {
              confirm(caller.name + ' works at ' + grDept.u_department_group);
          }
      }
  }
}



Here, the getDept() function gets executed only when the server returns the caller reference; in the meantime, the browser continues doing other things. However, this will make yet another subsequent call to the server inside the getDept() function to get cmn_department.u_department_group via GlideRecord. All these can be done by making a single GlideAjax call to the server with some added scripts both on the client and server side.



Please see Client Script Best Practices - ServiceNow Wiki: Minimize Server Lookups for more details.


Hi,

I totally agree with @Göran Lundqvist . Avoid GlideRecord on client side. Go for GlideAjax call, and return a JSON with all the values you want.

  • Best Practice
  • Better Performance
  • Better User Experience

Regards,

Higa

Mani23
Tera Expert

Please use GlideAjax option as suggested by one of the experts.
Please check the below docs link

GlideAjax – Client