combine two codes in a reference qualifier
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2024 03:03 AM - edited 03-21-2024 04:26 AM
hello, i have an advanced reference qualifier with following code:
javascript: ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join()
and i would like to add following conditions to it:
sys_class_name IS ONE OF:
cmdb_ci_server
cmdb_ci_business_app
cmdb_ci_aix_server
cmdb_ci_datapower_server
cmdb_ci_esx_server
cmdb_ci_hyper_v_server
cmdb_ci_ibm_frame
cmdb_ci_ibm_zos_server
cmdb_ci_lb_bigip
cmdb_ci_linux_server
cmdb_ci_net_app_server
cmdb_ci_unix_server
cmdb_ci_vcenter_server_obj
cmdb_ci_win_server
can you advice me how?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2024 03:47 AM - edited 03-21-2024 03:48 AM
Hi,
I would suggest to create a script include and merge those two queries and then call that script include in the reference qualifier field. See example below:
a) If you have to apply AND condition between the existing and new query:
var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
initialize: function() {},
restrictClasses: function(current) {
var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
var newQuery = oldQuery + '^sys_class_name!=cmdb_ci_server^sys_class_name!=cmdb_ci_business_app^sys_class_name!=cmdb_ci_aix_server^sys_class_name!=cmdb_ci_esx_server^sys_class_name!=cmdb_ci_hyper_v_server^sys_class_name!=cmdb_ci_ibm_frame^sys_class_name!=cmdb_ci_ibm_zos_server^sys_class_name!=cmdb_ci_linux_server^sys_class_name!=cmdb_ci_netapp_svm^sys_class_name!=cmdb_ci_unix_server^sys_class_name!=cmdb_ci_vcenter_server_obj^sys_class_name!=cmdb_ci_win_server^EQ';
return newQuery();
},
type: 'RestrictCIClass'
};
b) If you have to apply OR condition between the existing and new query
var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
initialize: function() {},
restrictClasses: function(current) {
var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
var newQuery = oldQuery + '^ORsys_class_name!=cmdb_ci_server^sys_class_name!=cmdb_ci_business_app^sys_class_name!=cmdb_ci_aix_server^sys_class_name!=cmdb_ci_esx_server^sys_class_name!=cmdb_ci_hyper_v_server^sys_class_name!=cmdb_ci_ibm_frame^sys_class_name!=cmdb_ci_ibm_zos_server^sys_class_name!=cmdb_ci_linux_server^sys_class_name!=cmdb_ci_netapp_svm^sys_class_name!=cmdb_ci_unix_server^sys_class_name!=cmdb_ci_vcenter_server_obj^sys_class_name!=cmdb_ci_win_server^EQ';
return newQuery();
},
type: 'RestrictCIClass'
};
After that, invoke that script include from the reference qualifier field:
javascript:new global.RestrictCIClass().restrictClasses(current);
Please keep in mind one more suggestion. Since you are applying this on 'cmdb_ci' reference qualifier, if you have to apply this on few particular table(s) only, I would suggest to use dictionary override and override the reference qualifier.
Please mark the answer "Correct" or "Helpful", if it helps your case.
Cheers,
Uttkarsh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2024 04:07 AM
hello and thank you a lot! i am now creating the script include. but i saw a mistake in my original post. I meant
instead of "IS NOT ONE OF" i meant "IS ONE OF"
sys_class_name IS ONE OF:
cmdb_ci_server
cmdb_ci_business_app
cmdb_ci_aix_server
cmdb_ci_datapower_server
cmdb_ci_esx_server
cmdb_ci_hyper_v_server
cmdb_ci_ibm_frame
cmdb_ci_ibm_zos_server
cmdb_ci_lb_bigip
cmdb_ci_linux_server
cmdb_ci_net_app_server
cmdb_ci_unix_server
cmdb_ci_vcenter_server_obj
cmdb_ci_win_server
so when i use this script, can it work? i have tried to create the script include with that script below but it still lets me choose all CIs
var RestrictCIClass = Class.create();
RestrictCIClass.prototype = {
initialize: function() {},
restrictClasses: function(current) {
var oldQuery = ['incident', 'problem'].indexOf(current.sys_class_name + '') == -1 ? '' : 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
var newQuery = oldQuery + '^sys_class_name=cmdb_ci_server^sys_class_name=cmdb_ci_business_app^sys_class_name=cmdb_ci_aix_server^sys_class_name=cmdb_ci_esx_server^sys_class_name=cmdb_ci_hyper_v_server^sys_class_name=cmdb_ci_ibm_frame^sys_class_name=cmdb_ci_ibm_zos_server^sys_class_name=cmdb_ci_linux_server^sys_class_name=cmdb_ci_netapp_svm^sys_class_name=cmdb_ci_unix_server^sys_class_name=cmdb_ci_vcenter_server_obj^sys_class_name=cmdb_ci_win_server^EQ';
return newQuery();
},
type: 'RestrictCIClass'
};
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2024 04:11 AM - edited 03-21-2024 04:36 AM
Hi,
If you have to use 'IS ONE OF' then you have to use OR condition. If you see closely, '^' indicates AND operation whereas you have to use '^OR' to construct the query. Something like this below:
var newQuery = oldQuery + '^sys_class_name=cmdb_ci_server^ORsys_class_name=cmdb_ci_business_app^ORsys_class_name=cmdb_ci_aix_server^ORsys_class_name=cmdb_ci_datapower_server^ORsys_class_name=cmdb_ci_esx_server^ORsys_class_name=cmdb_ci_hyper_v_server^ORsys_class_name=cmdb_ci_ibm_frame^ORsys_class_name=cmdb_ci_ibm_zos_server^ORsys_class_name=cmdb_ci_lb_bigip^ORsys_class_name=cmdb_ci_linux_server^ORsys_class_name=cmdb_ci_net_app_server^ORsys_class_name=cmdb_ci_unix_server^ORsys_class_name=cmdb_ci_vcenter_server_obj^ORsys_class_name=cmdb_ci_win_server^EQ';
Please mark the answer "Correct" or "Helpful", if it helps your case.
Cheers,
Uttkarsh
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2024 04:13 AM
you can create a script include and can call it from reference qualifier
Script include:
// List of excluded sys_class_name values
var excludedClasses = [
'cmdb_ci_server',
'cmdb_ci_business_app',
'cmdb_ci_aix_server',
'cmdb_ci_datapower_server',
'cmdb_ci_esx_server',
'cmdb_ci_hyper_v_server',
'cmdb_ci_ibm_frame',
'cmdb_ci_ibm_zos_server',
'cmdb_ci_lb_bigip',
'cmdb_ci_linux_server',
'cmdb_ci_net_app_server',
'cmdb_ci_unix_server',
'cmdb_ci_vcenter_server_obj',
'cmdb_ci_win_server'
];
// Check if current.sys_class_name is not in the excludedClasses list
if (excludedClasses.indexOf(current.sys_class_name + '') == -1) {
// If not excluded, return the original reference qualifier
return 'operational_statusNOT IN' + new OpsStatusFilter('cmdb_ci').by('CreateTask').join();
} else {
// If excluded, return an empty string to filter out all options
return '';
}
Please Mark ✅Correct if this solves your query and also mark 👍Helpful if you find my response worthy based on the impact.
Thanks