Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.
SOLVED

Is it possible to get multiple values from a script object to calculate a total in a field?

Avatar

Level 4

I have a script object that populates fields.  There are two arrays, one for dates and one for values.

Snippet of script object:

//Array of closing dates.

var closingDate = new Array("",

"1/3/2011",

"1/4/2011",

"1/5/2011",

etc……

"12/31/2016");

//Array of closing values.

var closingValue = new Array(null,

"1271.89",

"1270.2",

"1276.56",

etc……

"1848.36");

//Populate the Closing Value fields

function getValue(ClosingDate, ClosingValue)

{

    var i;

    for (i = 0; i < closingDate.length; i++)

    {

        if (closingDate[i] == ClosingDate)

        {

            ClosingValue.rawValue = closingValue[i];

            break;

        }

    }

}

Only certain dates and values are displayed in the form.  The other dates and values are needed to calculate values during the year.  For instance, there is a field with the date of 1/3/2011 and another populated with the value of 1271.89; a field with 1/3/2012 and another populated with a value of 1227.06 (from the script object).  I would like a field to calculate the values between 1/3/2011 and 1/3/2012. I don’t want to have a field for each date between 1/3/2011 and 1/3/2012 and fields for each value because I would have hundreds of fields for dates and hundreds of fields for values.  Is there a way to pull multiple values from the script object and then add them together to display the total in a field?

1 Accepted Solution

Avatar

Correct answer by
Level 10

Hi,

I suspect I'm still misunderstanding something here.  But, what I was suggesting was having a function defined in your script object like;

function getTotal(startDate, endDate)
{
var start = util.scand("m/d/yyyy", startDate).setHours(0,0,0,0);
var end = util.scand("m/d/yyyy", endDate).setHours(0,0,0,0);
var result = 0;
    var i;
    for (i = 1; i < closingDate.length; i++)
    {
     var d = new Date(util.scand("m/d/yyyy", closingDate[i]).setHours(0,0,0,0));
     if (d.getTime() >= start && d.getTime() <= end)
     {
      result += parseFloat(closingValue[i]);
     }
    }
    return result;
}

Then you would call it passing in the start and end dates, like;

{scriptobjectname}.getTotal("1/4/2011", "1/5/2011")

Change the "{scriptobjectname}" to whatever the name of the script object is.

Is that close?

Bruce

View solution in original post

4 Replies

Avatar

Level 10

Hi,

If I understand the problem, it sounds like you need another function in your script object, like getTotal(startDate, endDate).

I think this would be easier if the closingDate values were date objects and the closingValue values were numeric values.  Is there a reason they aren't?

Regards

Bruce

Avatar

Level 4

Thanks for your response. 

Parts of the form to hopefully show what I’m trying to do:

form.JPG

The user enters a date in the “Issued on” field.  I have a script in each “Ending Date” field that adds one year and also calls the script object to find the Ending Date and then populate the “Closing Value” field.  I need to total all closing values from 10/21/2011 to 10/21/2012; total all closing values from 10/21/2012 to 10/21/2013 and so on.   There would be hundreds of closing values to add together because there is a closing value for each date in the year - which are stored in the script object. If I were to use another function in the script object like getTotal(startDate, endDate), how do I get all of the closing values from a start date to an end date?

Avatar

Correct answer by
Level 10

Hi,

I suspect I'm still misunderstanding something here.  But, what I was suggesting was having a function defined in your script object like;

function getTotal(startDate, endDate)
{
var start = util.scand("m/d/yyyy", startDate).setHours(0,0,0,0);
var end = util.scand("m/d/yyyy", endDate).setHours(0,0,0,0);
var result = 0;
    var i;
    for (i = 1; i < closingDate.length; i++)
    {
     var d = new Date(util.scand("m/d/yyyy", closingDate[i]).setHours(0,0,0,0));
     if (d.getTime() >= start && d.getTime() <= end)
     {
      result += parseFloat(closingValue[i]);
     }
    }
    return result;
}

Then you would call it passing in the start and end dates, like;

{scriptobjectname}.getTotal("1/4/2011", "1/5/2011")

Change the "{scriptobjectname}" to whatever the name of the script object is.

Is that close?

Bruce

Avatar

Level 4

This is exactly what I want.  Sorry I didn't respond until now, I had to rework my form and then I was pulled into another project.  Thanks so much!