Record producer to insert record and then add to incident

M_iA
Kilo Sage

I have a simple incident record producer.

On it, I have a reference field looking at the sys_user table. if the user is not available, I have manual fields for the user to enter the employee details.

The fields have onchange scripts to detect whether the user is a duplicate.

The record producer then has a script that inserts the manual record in the user table:

 

if (producer.is_employee_available == true || producer.is_employee_available == "true") {
    var gr = new GlideRecord("sys_user");
    gr.initialize();
    gr.user_name = producer.email;
    gr.first_name = producer.first_name;
    gr.last_name = producer.last_name;
    gr.email = producer.email;
    gr.phone = producer.phone;
    gr.company = producer.account;
    gr.employee_number = producer.employee_number;
    gr.insert();
    gs.flushMessages();
}

I now want to reference this new record in a new reference field on the incident and im not sure how I would do this.

im also struggling to get gs.flushMessages(); to work as it still shows the messages to say that the default roles have been added.

Could anyone point me in the right direction?

1 ACCEPTED SOLUTION

@M_iA Ah! you are right your GlideAjax is an asynchronous call and your form is already getting submitted before you get the response from the server.

 

Please update your client script based on the following code.

 

function onSubmit() {
if (g_scratchpad.isFormValid){
	return true;
}
    var checkboxResponse = g_form.getValue('is_employee_available');
    if (checkboxResponse == true || checkboxResponse == "true") {
       var actionName = g_form.getActionName();
        var ga = new GlideAjax('global.CustomerHelpCenterUtils');
        ga.addParam('sysparm_name', 'insertUserRecord');
        ga.addParam('sysparm_user_first', g_form.getValue('first_name'));
        ga.addParam('sysparm_user_last', g_form.getValue('last_name'));
        ga.addParam('sysparm_user_email', g_form.getValue('email_address'));
        ga.addParam('sysparm_user_telephone', g_form.getValue('telephone'));
		ga.addParam('sysparm_user_company', g_form.getValue('account'));
		ga.addParam('sysparm_user_id', g_form.getValue('employee_id_number'));
        ga.getXMLAnswer(myCallbackFunction);
    }

    function myCallbackFunction(response) {
                g_scratchpad.isFormValid = true;
	g_form.submit(actionName);
		var answer = response;
		alert(answer);
		g_form.setValue('new_contact_record', answer);
    }
return false;
}

 

Source: https://support.servicenow.com/kb?id=kb_article_view&sysparm_article=KB0783579

 

Hope this helps.

View solution in original post

19 REPLIES 19

@M_iA If you are inserting the records via an onSubmit script then you need to have a reference field (referring to sys_user table) on your form. This field will be hidden via a UI Policy. Once the record is created via your onSubmit script, you can set the value of generated sys_id on this reference field.

 

Use the value from the reference field to set current.caller_id = producer.<your reference field name> in the record producer script.

 

Hope this helps.

@Sandeep Rajputapologies, this seems like it should be a good answer. ive tried updating my onSubmit script to populate but it just returns a NULL value so doesnt populate my new hidden field? Heres my script:

 

function onSubmit() {
    var checkboxResponse = g_form.getValue('is_employee_available');
    if (checkboxResponse == true || checkboxResponse == "true") {
        var ga = new GlideAjax('global.CustomerHelpCenterUtils');
        ga.addParam('sysparm_name', 'insertUserRecord');
        ga.addParam('sysparm_user_first', g_form.getValue('first_name'));
        ga.addParam('sysparm_user_last', g_form.getValue('last_name'));
        ga.addParam('sysparm_user_email', g_form.getValue('email_address'));
        ga.addParam('sysparm_user_telephone', g_form.getValue('telephone'));
		ga.addParam('sysparm_user_company', g_form.getValue('account'));
		ga.addParam('sysparm_user_id', g_form.getValue('employee_id_number'));
        ga.getXMLAnswer(myCallbackFunction);
    }

    function myCallbackFunction(response) {
		var answer = response;
		alert(answer);
		g_form.setValue('new_contact_record', answer.email);
    }

}

@M_iA Are you returning a sys_id from 

insertUserRecord

method in 

CustomerHelpCenterUtils

Script include. you didn't share the source code of script include, hence asking this question.

 

Also, if 

new_contact_record

is a reference(sys_user) field then it would expect a sys_id and not an email

 

Your callback should be updated as follows.

 

function myCallbackFunction(response) {
		var answer = JSON.parse(response);
		alert(answer);
		g_form.setValue('new_contact_record', answer.sys_id);
    }

 

Assuming your script include returns a stringified object which has sys_id and email as properties.

 

Hope this helps.

@Sandeep RajputHere is the function in my script include:

    insertUserRecord: function() {

        var first_name = this.getParameter('sysparm_user_first');
        var last_name = this.getParameter('sysparm_user_last');
        var email = this.getParameter('sysparm_user_email');
        var phone = this.getParameter('sysparm_user_telephone');
		var company = this.getParameter('sysparm_user_company');
		var employee_number = this.getParameter('sysparm_user_id');
        var gr = new GlideRecord('customer_contact');
        gr.initialize();
		gr.user_name = email;
        gr.first_name = first_name;
        gr.last_name = last_name;
        gr.email = email;
        gr.phone = phone;
		gr.company = company;
		gr.employee_number = employee_number;
        gr.insert();
		gs.flushMessages();
		return gr.sys_id;
    }

@M_iA Make sure this is a client callable script include. Also, make following changes in your script include and the client script.

 

insertUserRecord: function() {

        var first_name = this.getParameter('sysparm_user_first');
        var last_name = this.getParameter('sysparm_user_last');
        var email = this.getParameter('sysparm_user_email');
        var phone = this.getParameter('sysparm_user_telephone');
	var company = this.getParameter('sysparm_user_company');
	var employee_number = this.getParameter('sysparm_user_id');
        var gr = new GlideRecord('customer_contact');
        gr.initialize();
	gr.user_name = email;
        gr.first_name = first_name;
        gr.last_name = last_name;
        gr.email = email;
        gr.phone = phone;
	gr.company = company;
	gr.employee_number = employee_number;
        var incidentSysID = gr.insert();
	gs.flushMessages();
	return incidentSysID + '';
    }

 

Client script

function onSubmit() {
    var checkboxResponse = g_form.getValue('is_employee_available');
    if (checkboxResponse == true || checkboxResponse == "true") {
        var ga = new GlideAjax('global.CustomerHelpCenterUtils');
        ga.addParam('sysparm_name', 'insertUserRecord');
        ga.addParam('sysparm_user_first', g_form.getValue('first_name'));
        ga.addParam('sysparm_user_last', g_form.getValue('last_name'));
        ga.addParam('sysparm_user_email', g_form.getValue('email_address'));
        ga.addParam('sysparm_user_telephone', g_form.getValue('telephone'));
		ga.addParam('sysparm_user_company', g_form.getValue('account'));
		ga.addParam('sysparm_user_id', g_form.getValue('employee_id_number'));
        ga.getXMLAnswer(myCallbackFunction);
    }

    function myCallbackFunction(response) {
		var answer = response;
		alert(answer);
		g_form.setValue('new_contact_record', answer);
    }

}

Hope this helps.