Technical Articles
Subtotals on Adobe Forms
Introduction:
Hello All, In these blog I am going to explain and discuss how to get the subtotals on adobe form based on some classification of data ( Example: Currency Wise )
Disclaimer: All the things showing on screenshots contains only dummy data.
Requirement:
I got the requirement of adding subtotals on adobe forms based on the currency like below
It can be easily achieved . We can calculate subtotals currency wise on ABAP and will pass that data to adobe forms.
But Things got little changed for me. Instead of appending all subtotals at end, the requirement was like,at end of every currency subtotals has to be shown like this.
Steps to Achieve that:
1.Include one extra field in your item structure named subtotal_flag ( naming is your choice ) with character of length 1.
2. While appending item data in ABAP, insert extra one row for each currency subtotal with flag enabled like this.
Note: I am HardCoding text “Total” in Invoice Number. Make sure you have to make your data element adaptable to this.
3. Once After this our form will look like this
4. Now we will change the appearance for subtotal row by using JavaScript.
- Make Full row Bold.
- Change The Background Color.
- Merge the Cell Invoice Row & Invoice Date and center the text there.
Our Pseudo Code is Simple.
6. Enter the below script on the on initialize event on item table.
var length = xfa.resolveNode("$record.TOTAL_RECORDS").value;
for( var i =0 ; i<length; i++)
{
if( ( xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].SUBTOTAL_FLAG").rawValue == 'X' ) )
{
// Merging Cells
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_NO").colSpan = "2";
// Hiding the Column
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_DATE").presence = "hidden";
// Centering Content on Merged Cells
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_NO").para.hAlign = "center";
// Changing Background Color
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "]").fillColor = "192,192,192";
// Changing weight to Bold
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_NO").font.weight = "bold";
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_CURRENCY").font.weight = "bold";
xfa.resolveNode("data.MainSubform.ItemDetails.Item.FORM_DATA.DATA[" + i + "].INVOICE_AMOUNT").font.weight = "bold";
}
}
Note: Path and variable name will change according to your form design. Change it accordingly.
Example:
data.MainSubform.ItemDetails.Item.FORM_DATA.DATA will change according to your layout design . So modify it accordingly
7. Once after setting all things, the form will look like this.
8. Now the subtotal_flag is actually not required on form. It is used for calculation only. If we remove that from final layout the script will not work. To tackle the thing remove the header description subtotal_flag( keep as empty ) and make the width as so small ( 0.0001 in ) like below.
9. Now the final output of form
Summary
In this blog, I have explained how to add subtotal based on currency wise. By using this methodology we can use it for showing subtotals based on some classification. ( Show totals according to materials, or date etc.. )
If line items contains 10K records, on adobe form the loop has to be run for 10K times which will cause bad performance. We can improve it by storing the index of subtotals row on ABAP and pass it to adobe forms. By using that index we can straightly change the subtotals row properties. So the loop will run exactly for how many subtotals rows are there. I will share that on next blog.
Sincerely appreciate any feedback/comments/questions.
Regards
Nagaraj R
Thanks a lot. I had a requirement exactly as this one. Lovely explanation