The CreatorCon Call for Content is officially open! Get started here.

Auto populate reference field based on other reference field

rickw1
Giga Contributor

Hi there,

I'm figuring out the best way to do this..

In my form, I have 2 fields: caller and hospital.

Caller refers to the users table, Hospital refers to the company table.

My goal is: whenever I populate the caller field, the system needs to lookup the hospital of that caller and needs to auto-populate that.

Example: Customer X is part of Hospital X. Customer X is the caller so will be populated in the caller field. The system recognizes that Customer X is part of Hospital X so hospital will be Hospital X.

customer_hospital.png

Hope you guys can help me out!

1 ACCEPTED SOLUTION

rickw1
Giga Contributor

We got it working!



Client script:


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


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


          return;


    }


   


    var ga = new GlideAjax('GetCustomerData');


  ga.addParam('sysparm_name','getFieldValue');


  ga.addParam('sysparm_field','u_reference_1');


  ga.addParam('sysparm_user_id', g_form.getValue('caller'));


      ga.getXML(DoSomething);


       


      function DoSomething(response) {


            var company = response.responseXML.documentElement.getAttribute("answer");


            g_form.setValue('company',company);


      }


}



Script include:


var GetCustomerData = Class.create();


GetCustomerData.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {


    getFieldValue: function() {


              var user = new GlideRecord('x_medt2_ihs_customers');


              user.get(this.getParameter('sysparm_user_id'));


              if(! user.sys_id){


                                return false;


              }


        return user[this.getParameter('sysparm_field')];


    }


});



Thanks everybody for the great help on this!


View solution in original post

58 REPLIES 58

You need to add 'global' to AbstractAjaxProcesser in scoped applications.



GetCustomerData.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {



ServiceNow Nerd
ServiceNow Developer MVP 2020-2022
ServiceNow Community MVP 2019-2022

Hi,



Then, try this:



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


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


}


function getHospital(caller) {


  alert(caller.name);


  alert(caller.u_reference_1);


  g_form.setValue('company',caller.u_reference_1);


}



on getReference you have to specify the name of the column.


You could also do it like this:



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


        var hospital = g_form.getReference('caller').u_reference_1;


        g_form.setValue('company', hospital);


}  


Mike, the problem with that is that Caller points to [sys_user] table, and u_reference_1 is a field of a child table, so g_form.getReference('caller').u_reference_1; would return 'undefined'.


Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

Hi Rick,



You can achieve the above req with the help of dot-walking. Please go through the below link for more info.


http://wiki.servicenow.com/index.php?title=Dot-Walking#gsc.tab=0