backgroud: use java + birt generate report. generate report in viewer , allow user choose export different format (pdf, xls, word...).
all program in "layout", no program in "master page". have 1 "data set". fields in "layout" refer ds. there group in "layout", gropu 1 field. in "group header", create 1 cell use page number. "page : mypagenumber". "mypagenumber" field define +1 in group header.
problem: when use 1st method generate report, "mypagenumber" not show correctly. because group header load 1 time each group. show 1.
question: know there "restart page number in group" in crystal report. how restart page in birt? want show data of different group in 1 report file, , page number start 1 each group.
you can birt reports using page variables. example:
- add 2 page variables... group_page, group_name.
- add 1 report variable... group_total_page.
in report beforefactory add script:
prevgroupkey = ""; grouppagenumber = 1; reportcontext.setglobalvariable("ggroup_name", ""); reportcontext.setglobalvariable("ggroup_page", 1);
in report onpageend add script:
var groupkey = currgroup; var prevgroupkey = reportcontext.getglobalvariable("ggroup_name"); var grouppagenumber = reportcontext.getglobalvariable("ggroup_page"); if( prevgroupkey == null ){ prevgroupkey = ""; } if (prevgroupkey == groupkey) { if (grouppagenumber != null) { grouppagenumber = parseint(grouppagenumber) + 1; } else { grouppagenumber = 1; } } else { grouppagenumber = 1; prevgroupkey = groupkey; } reportcontext.setpagevariable("group_name", groupkey); reportcontext.setpagevariable("group_page", grouppagenumber); reportcontext.setglobalvariable("ggroup_name", groupkey); reportcontext.setglobalvariable("ggroup_page", grouppagenumber); var grouptotalpage = reportcontext.getpagevariable("group_total_page"); if (grouptotalpage == null) { grouptotalpage = new java.util.hashmap(); reportcontext.setpagevariable("group_total_page", grouptotalpage); } grouptotalpage.put(groupkey, grouppagenumber);
in master page onrender script add following script:
var totalpage = reportcontext.getpagevariable("group_total_page"); var groupname = reportcontext.getpagevariable("group_name"); if (totalpage != null) { this.text = java.lang.integer.tostring(totalpage.get(groupname)); }
in table group header oncreate event, add following script, replacing 'country' name of column grouping on:
currgroup = this.getrowdata().getcolumnvalue("country");
- in master page add grid header or footer , add autotext variable group_page , group_total_page. optionally add page variable group_name well.
check out these links more information birt page variables:
- https://books.google.ch/books?id=aijz4fyjoqkc&pg=pa85&lpg=pa85&dq=birt+change+autotext&source=bl&ots=k0ncmf2hrd&sig=cbor_otrw0b72szofs7lc_1mrz4&hl=en&sa=x&ei=zknavcnulylhsaxrmihocw&ved=0ceoq6aewbq#v=onepage&q=birt%20change%20autotext&f=false
- https://www.youtube.com/watch?v=lw_k1qhy_gu
- http://www.eclipse.org/birt/phoenix/project/notable2.5.php#jump_4
- https://bugs.eclipse.org/bugs/show_bug.cgi?id=316173
- http://www.eclipse.org/forums/index.php/t/575172/