Friday, 13 September 2013

How to Calculate Total in XML Publisher Report

declare a variable on top of the group.

<?xdoxslt:set_variable($_XDOCTX, 'TROW_NUM', 0)?>

add another variable inside the loop.

<?xdoxslt:set_variable($_XDOCTX, 'TROW_NUM',
xdoxslt:get_variable($_XDOCTX, 'TROW_NUM') +  COLUMN_NAME)?>

And put the below inside the total field

<?xdoxslt:get_variable($_XDOCTX, 'TROW_NUM')?>
 

Averaging your Totals

Another totaling question on the forum a few days ago from user645621- not your average (excuse the pun, you'll understand once you read the question) totaling question I must say. Check out the other 'total' posts here.
I am trying to do something a bit obscure with BIP. My XML is something like:
<DETAIL>
 <PERSON>Bloggs, Joe</PERSON>
 <LOCATION>XYZ</LOCATION>
 <BILLABLE_HOURS>1</BILLABLE_HOURS>
 <AVAILABLE_HOURS>1</AVAILABLE_HOURS>
</DETAIL>
<DETAIL>
 <PERSON>Bloggs, Joe</PERSON>
 <LOCATION>XYZ</LOCATION>
 <BILLABLE_HOURS>5</BILLABLE_HOURS>
 <AVAILABLE_HOURS>5</AVAILABLE_HOURS>
</DETAIL>
Note the data has been flattened because we need to regroup in different ways. I am regouping as such Location (Master) then by Person (Detail) What I need to do is find the Billable % at Person Group which is Billable Hours / Available Hours (<?sum(current-group()/BILLABLE_HOURS) div sum(current-group()/AVAILABLE_HOURS)?> - which is OK, but at Location level I need the average of the billable % at the location level. I have tried assigning the calculation for the billable %age to a variable and then dividing by the number of records but this has not proven to work. My thoughts where to create a variable to hold the total pct for a location and then divide by the number of records (another variable). The problem is assigning the calculation to a variable ie <?xdoxslt:set_variable($_XDOCTX, ‘PCT_TOT', (sum(current-group()/BILLABLE_HOURS) div sum(current-group()/AVAILABLE_HOURS)) + xdoxslt:get_variable($_XDOCTX, ‘PCT_TOT’))?> Results in an error - An internal error condition occurred in the Template Builder
Some others have contributed to the thread, namely Srini but our mysterious user was not happy with the proposed solutions. I jumped in with two others - might not be right either and they raise another question I would be glad to hear from you on ... read on.
Assuming you have :
   <?for-each-group:DETAIL;./LOCATION?>
   
   LOCATION
   
   Table of details - <?for-each:current-group()?> PERSON BILLABLE_HOURS AVAILABLE_HOURS % <?end?>
   
   <?end for-each-group?>
   
Is this enough? Total Billable
<?sum(current-group()/BILLABLE_HOURS)?>
Total Available
<?sum(current-group()/AVAILABLE_HOURS)?>
%
<?sum(current-group()/BILLABLE_HOURS) div sum(current-
                                            group()/AVAILABLE_HOURS)?>
If you really want the average of the percentages per group then: Create a variable just after the for-each-group LOCATION
<?xdoxslt:set_variable($_XDOCTX, 'AvgHrs', 0)?>
putting it here resets it to zero at the beginning of every LOCATION group.Then in the percentage field you need:
<?BILLABLE_HOURS div AVAILABLE_HOURS?> --- show the line value
<?xdoxslt:set_variable($_XDOCTX, 'AvgHrs', 
   xdoxslt:get_variable($_XDOCTX, 'AvgHrs')+ (BILLABLE_HOURS 
     div AVAILABLE_HOURS) )?> 
For the second part we set the variable value to itself + the current rows % value In the totals section
<?number(xdoxslt:get_variable($_XDOCTX, 'AvgHrs')) div count(current-group()/PERSON)?>
Get the variable value (force it to be numeric) and div by the total number of folks in the location group Now in the data I created based on the data given, the first calculated total came out to the same value as the variable method

No comments:

Post a Comment