- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 12:01 PM
I have an onchange Script that does a percent complet calculation based on when a particular field is update and then it updates the clients Percent complete.
A strange issue occurs, when the form loads, without any manipulation of any field let alone the field that has the OnChange script - the percent complete changes to NaN after a fraction of a second. My script will work to change the NaN to the right numbr but I am not sure why the Onchange script is causing my percentage complete to change on the client On Load . Has anyone seen this before? when i comment out g_form.setValue ('percent_complete',strt ); its fine but of course the script wont work. I am taking 2 duration parsing them into strings, getting out substrings to get the hours and minutes, doing percent calculations- My Goal is using remaining time and actual time to run a calculation on the fly that shows percent complete on the client. Any words of help and advise would be appreciated,
Solved! Go to Solution.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 06:59 PM
Here you go. This solution is very similar to your other requirement. You need two onChange client scripts on the duration fields and a script include. You can reuse the same script include I gave you for your previous thread, just add one more function to the script include. Here u_dur_1,u_dur_2, u_percent are my field names
onChange client script on u_dur_1:
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}
if(g_form.getValue('u_dur_2')!=''){
var ga = new GlideAjax('CalculateDuration');
ga.addParam('sysparm_name','percentCalculation');
ga.addParam('sysparm_dur1',newValue);
ga.addParam('sysparm_dur2',g_form.getValue('u_dur_2'));
ga.getXML(CallBack);
}
else{
g_form.setValue('u_percent',100);
}
function CallBack(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
g_form.setValue('u_percent',parseFloat(answer)*100);
}
}
onChange client script on u_dur_2:
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}
if(g_form.getValue('u_dur_1')!=''){
var ga = new GlideAjax('CalculateDuration');
ga.addParam('sysparm_name','percentCalculation');
ga.addParam('sysparm_dur2',newValue);
ga.addParam('sysparm_dur1',g_form.getValue('u_dur_1'));
ga.getXML(CallBack);
}
else{
g_form.setValue('u_percent',0);
}
function CallBack(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
g_form.setValue('u_percent',parseFloat(answer)*100);
}
}
Script include:
var CalculateDuration = Class.create();
CalculateDuration.prototype = Object.extendsObject(AbstractAjaxProcessor, {
durationCalulator: function(){
var duration = new GlideDuration(this.getParameter('sysparm_dur1') );
var duration2 = new GlideDuration(this.getParameter('sysparm_dur2') );
var answer = duration.subtract(duration2);
return answer.getDurationValue();
},
percentCalculation: function(){
var duration = new GlideDuration(this.getParameter('sysparm_dur1') );
var duration2 = new GlideDuration(this.getParameter('sysparm_dur2') );
var total=gs.dateDiff('1970-01-01 00:00:00',duration.getValue(),true);
var answer = gs.dateDiff(duration2.getValue(),duration.getValue(),true);
return (answer/total).toFixed(2);
},
type: 'CalculateDuration'
});
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 12:04 PM
could you please post your script here.....
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 12:14 PM
Sorry for the crazy formatting - By the way, I can see the correct number for percentage for a fraction of second- I can even do an alert and it will show my the right time, but the on change script changes the percentage complete field on load with no affect, if anything I want to change it to what it really is instead of blank. I am not sure why the system is changing that field when the field that is in the onchange hasnt been changed yet ....
function onChange(control, oldValue, newValue, isLoading) {
var strt = g_form.getValue('effort').toString();
var hour1 = strt.substring(2,4);
var min1 = strt.substring(5,7);
var sec1 = strt.substring(8,10);
var hour1num = parseInt(hour1, 10);
var min1num = parseInt(min1,10);
var end = g_form.getValue('work_effort').toString();
var hour2 = end.substring(2,4);
var min2= end.substring(5,7);
var sec2 = end.substring(8,10);
var hour2num = parseInt(hour2,10);
var min2num = parseInt(min2,10);
var reshour = parseInt(hour1num) - parseInt(hour2num);
var resmin = parseInt(min1num) - parseInt(min2num);
//percent
var percenthour1 = parseInt(hour2num) * 60;
var totalper1 = parseInt(percenthour1) + parseInt(min2num);
var percentrem1 = parseInt(reshour)* 60;
var totalrem1 = parseInt(percentrem1) + parseInt(resmin);
var percentgood =( parseInt(totalper1) / ( parseInt(totalper1) + parseInt(totalrem1)) * 100);
// var percentgood1 = parseInt(percentgood),10;
// if (isNAN ('percent_complete')){
g_form.setValue('percent_complete', percentgood);
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 12:45 PM
Hi Ammar,
change these two lines in that code and try, why means you are convert them into string format.
var strt = g_form.getValue('effort').toString(); to var strt = g_form.getValue('effort')
var end = g_form.getValue('work_effort').toString(); to var end = g_form.getValue('work_effort')
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
09-30-2016 12:12 PM
HI Ammar,
NAN means not a number.
Simple on change client script, will have a block of
if (isLoading ) {
g_form.setValue ('percent_complete',''); // Intially if you want to set empty value means try like that
return;
}
//Type appropriate comment here, and begin script below
}
if still anything not working, post your code?