Dynamically Populate Dropdown in Record Producer Based on Selected Table

TEJAS
Tera Contributor

Hi All,
Hope you are doing well,

 

Description:

I have created a Record Producer and need help dynamically populating a dropdown field based on the selected table.

Variables in the Record Producer:

  1. Table Name (Variable Name: table_name)

    • Type: Reference
    • Reference: sys_db_object (Tables)
    • Only specific tables should be visible its working.
      TEJAS_0-1742446423964.png

       



  2. Condition Fields (Variable Name: condition_fields)

    • Type: Select Box
    • Requirement:
      • When a user selects a table from the Table Name dropdown, the Condition Fields dropdown should dynamically populate the fields of the selected table.
      • This should happen using an onChange Client Script.
        TEJAS_1-1742446448223.png

        IMP: one more thing this is done in other scope not in global scope
        Thanks in advance 



1 ACCEPTED SOLUTION

GopikaP
Mega Sage

Hi @TEJAS  , 

  1. Create an onChange Client Script on master table -
function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }

    //Type appropriate comment here, and begin script below
	var table = g_form.getReference('master_table');
    var ga = new GlideAjax('ClientSideCall');
    ga.addParam('sysparm_name', 'getFieldName');
    ga.addParam('sysparm_tableName',table.name);
    ga.getXML(getFields);
    function getFields(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        alert(answer);
        var fields = answer.split(',');
        for (var i = 0; i < fields.length; i++) {
            g_form.addOption('select_fields', i, fields[i]);
        }
    }
}​
  • Create a Glide AJAX enabled script include - 
var ClientSideCall = Class.create();
ClientSideCall.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getFieldName: function() {
        var fields = [];
        var tableName = this.getParameter('sysparm_tableName');
		gs.log("Hi "+JSON.stringify(tableName));
        var getFieldNames = new GlideRecord('sys_dictionary');
        getFieldNames.addQuery('name', tableName);
        getFieldNames.query();
        while (getFieldNames.next()) {
            fields.push(getFieldNames.getValue('column_label'));
        }
		gs.log("Hi "+fields);
        fields = fields.join(',');
        return fields;
    },
    type: 'ClientSideCall'
});​

View solution in original post

21 REPLIES 21

g_form.addOption('select_fields', i, fields[i]);

Here, is your field name - select_fields ? 

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

    //Type appropriate comment here, and begin script below
    var table = g_form.getReference('Table_Name');
    var ga = new GlideAjax('ClientSideCall');
    ga.addParam('sysparm_name', 'getFieldName');
    ga.addParam('sysparm_tableName', table.name);
    ga.getXML(getFields);

    function getFields(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        alert(answer);
        var fields = answer.split(',');
        for (var i = 0; i < fields.length; i++) {
            g_form.addOption('condition_fields', i, fields[i]);
        }
    }
}
​i added the field name but also it the same 
can you please share the screen shot of what you are getting in your instance 

 

TEJAS
Tera Contributor

Can you share or screen shot your code and show me so i can see what is the problem

This can be achieved by referring the 'condition_fields' to 'sys_dictionary table as suggested by @Ankur Bawiskar and @SanjivMeher and giving a reference qualifier, but I see that I already gave that solution in another post. I guess you have your reasons. 

 

 var table = g_form.getReference('Table_Name'); - is 'Table_Name' the backend value of that field?  I see initially in your question it is written as -

            Table Name (Variable Name: table_name)