#1 2017-01-04 13:04:00

freds
Member
Registered: 2017-01-03

Support for page break + footer/header?

Does reportserver script support page break events or page number?
I'd need to generate a report where the first line should be a recap of the previous page amount.
Ex:
page 1:
-------------------
A      5
B      3
C      2
-------------------
page 2:
-------------------
(reported) 10
D     6
E     13
F     9
-------------------
...

To do so, I'd need some an event or a page number to conditionaly output the 'reported' line

Rgds

Offline

#2 2017-01-04 17:48:55

karolina
Member
Registered: 2014-08-09

Re: Support for page break + footer/header?

Hi freds,

With script reports (almost) everything is possible.
What output formats do you need?

Karolina

Offline

#3 2017-01-05 08:50:28

freds
Member
Registered: 2017-01-03

Re: Support for page break + footer/header?

PDF or text format (e.g. any format that would eventually be printed).

Offline

#4 2017-01-05 12:49:14

karolina
Member
Registered: 2014-08-09

Re: Support for page break + footer/header?

Hi,

See the example script below. It generates pdf with 5 data rows per page, with summaries at the top and at the bottom of the page.

import groovy.xml.MarkupBuilder

/* generate a dummy data set */

List data = []

def i = 0

('A'..'Z').each{key ->
    i++
    List rowData = []
    rowData.add(key)
    rowData.add(i)

    data.add(rowData)
}

/* assume we want 5 rows per page */

int rowsPerPage = 5
int mod = data.size() % rowsPerPage
int numerOfPages

if(mod == 0){
    numerOfPages = data.size() / rowsPerPage
} else {
    numerOfPages = data.size() / rowsPerPage + 1
}

/* split the data set according to number of pages */

data = data.collate(numerOfPages)

/* the total number that will be displayed at the top and the bottom of each page */
def total = 0

/* render the page */

def writer = new StringWriter()

MarkupBuilder mkp = new MarkupBuilder(writer)

mkp.html{

    head {
        title ("My title")
        style("""
              @media print {
                    .summary {page-break-before: always;}  
                    }
              @page { size: A4 landscape;}                         
              """)
    }

    body {
        for(int j = 0; j < data.size(); j++) {

            List subList = data[j]

            def divClass
            if(j == 0){
                divClass = "firstPage"

            } else {
                divClass = "summary"
            }

            div("class":"${divClass}"){
                /* summary row at the top of the page */
                p("Summary from previous page(s): ${total}")

                /* summarize numbers in sublist */
                def subListSummary = 0
                subList.each{row ->
                    subListSummary += row[1]

                    /* display rows */
                    p(row[0] + ": " + row[1])
                }

                /* add sublist summary to total number */
                total += subListSummary

                p("Summary for this page: ${subListSummary}")
                p("Total: ${total}")
            }
            }
    }
}

if(outputFormat == 'pdf'){
    return renderer.get("pdf").render(writer.toString())
}

return renderer.get("html").render(writer.toString())

You may further style the document using CSS, as if you created a HTML page for printing.
The tricky part may be to guess how many rows will fit the page.
When you need reports that ideally fit the printed page, other report engines may be better (Jasper or Birt)

Hope it helps
Karolina

Last edited by karolina (2017-01-05 12:49:49)

Offline

#5 2017-01-05 12:57:41

freds
Member
Registered: 2017-01-03

Re: Support for page break + footer/header?

"The tricky part may be to guess how many rows will fit the page."
I would have expected the ReportServer engine to do that for me :[
Looks like script reports are limited to what HTML/CSS3 provides (e.g. very little)

Thanks for the detailled answer!

Last edited by freds (2017-01-05 13:33:28)

Offline

#6 2017-01-05 14:31:21

karolina
Member
Registered: 2014-08-09

Re: Support for page break + footer/header?

Well, you could probably calculate dynamically the value of rowsPerPage variable, if you know the printed page height in pixels (or the area on the page you'd like to reserve for data rows), font height in pixels (the one you want to use), margins, and data amount in characters.

Karolina

Offline

Board footer

Powered by FluxBB