- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎09-25-2015 04:55 AM
Im sorry to ask again but need help and also need to learn how to script this demand.
I can find way how to populate service on incident form if SD user select last appllication on the image below - 3
I havent luck to buil onchange client script - Im able to build script which returns me only direct relation ( from 3 to 2 ) but not what we need ( from 3 to X)
would somebody give me a lesson here please ? Please note that I need onchange solution, so service is prefilled always when suer change CI
My system fields are
cmdb_ci -- for apps
u_service_ci -- for service
thank you
/Petr
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎10-01-2015 07:22 AM
Hi Petr,
Nice work on the GlideAjax script. I do have a few recommendations that can improve your script and hopefully help you learn a little more about GlideAjax in the process (you can also check out my infographic on GlideAjax for additional info: Demystifying GlideAjax).
So first, the scripts (please bear in mind I haven't fully tested these yet so they may need some tweaks):
Client Script
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue == '') {
return;
}
var ooo = g_form.getValue('cmdb_ci'); // this is the sys id of CI entered by user
var ga = new GlideAjax('BusinessServiceFinder');
ga.addParam('sysparm_name', 'getServiceForCI');
ga.addParam('sysparm_ci_sys_id', ooo); // passing CI sys_id to script include
ga.getXML(setBusinessService);
function setBusinessService(response) {
var answer = response.responseXML.documentElement.getAttribute('answer');
g_form.setValue('u_service_ci', answer); // get answer from Script Include and set Service CI field
alert(answer);
}
}
Script Include
var BusinessServiceFinder = Class.create();
BusinessServiceFinder.prototype = Object.extendsObject(AbstractAjaxProcessor, {
getServiceForCI: function() {
var this_is_variable_from_form = this.getParameter('sysparm_ci_sys_id') + '';
return this._getParentRelationship(this_is_variable_from_form);
},
_getParentRelationship: function(ciSysId) {
var o = new GlideRecord('cmdb_rel_ci');
o.addQuery('child', ciSysId);
o.query();
if (o.next()) {
if (o.parent.sys_class_name == 'cmdb_ci_service') {
return o.getValue('parent'); // return the CI's sys_id
}
else {
return this._getParentRelationship(o.getValue('parent')); // recursively execute the function for the parent's sys_id
}
}
else {
return 'There is no direct relation to service';
}
},
type: 'BusinessServiceFinder'
})
Changes
1. You will notice that I changed the names of the Script Include and its function. You can change these names as you desire, but with GlideAjax there is a convention that you must follow:
- The name of the Script Include (BusinessServiceFinder) must be included inside the parenthesis of the GlideAjax call as shown on line 7 of the Client Script. This tells GlideAjax which Script Include to use.
- The name of the Script Include's function (getServiceForCI) must be included in the Client Script by setting it as the sysparm_name parameter as shown on line 8 of the Client Script.
2. You will also notice that I added a private function _getParentRelationship and changed the getServiceForCI function to use it. The _getParentRelationship is a recursive function that calls itself. This eliminates the need for the nested if statements and reduces the duplicated code. Basically, the _getParentRelationship function will keep calling itself by passing the parent CI in the relationship until it finds a Business Service or is unable to find a relationship. The advantage in this script is that it will work for any sized relationship tree depth. If you were to at some point in the future link relationships 6 nodes from the Business Service, this script will still work.
I hope this helps. And thank you deepak.ingale for looping me in!
Kind regards,
Travis
EDIT: A few typos, missing punctuation, wrong punctuation, and other miscellaneous errors later, this script has now been tested. Thanks guys!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-24-2017 06:45 AM
Hi Travis,
I think we might actually go with the second approach using the reference qualifier. Should that be pretty easy to set up? I can look at the documentation on how to create one etc but if you can point me in the right direction as to which fields/tables it should be set on that would be great
Thanks!
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-24-2017 08:46 AM
Hi Steve,
Absolutely, the reference qualifier is very easy to setup. Here's the approach:
1. Get the desired filter (possibly an Encoded Query) from the Business Service table
2. Open the System Dictionary entry for the Business Service field on the Incident table
3. Set the Reference Qualifier as desired on the Dictionary Entry
You may be able to get away with the Simple Reference Qualifier but you may need the Dynamic / Encoded Query to base the query off of the cmdb_ci field.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-24-2017 09:06 AM
Thanks for the guidance Travis, I will look into this method and see if I can get it to work!
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-27-2017 11:19 AM
Hi Travis,
I'm struggling a little bit with getting the filter from the Business Service table. I get to the place where I create the filter, however I don't see where I would pick the relationship to the CIs. Even with Show Related Fields selected, I'm unable to figure it out. Any ideas here?
Thanks,
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎01-27-2017 12:31 PM
Hi Steve,
Now that I think about it, the Business Service table probably doesn't have a relationship to the CI, the cmdb_rel_ci table has a relationship between the Business Service and CI. You still need the filter to come from the Business Service table but you will need to use a Scripted Filter or a Dynamic filter. A little more complicated, you need a script that will query the cmdb_rel_ci table where the cmdb_ci is your selected CI record on the form and then returns the associated list of Business Service sys_id's from the GlideRecord. Somewhat complicated, does that make sense?
Kind regards,
Travis Toulson