Writing the Genero BDL report program / Sub reports |
A sub report is a report that is started from within another report via a START REPORT statement.
The START REPORT statement for the sub report takes no arguments. Do not add TO XML HANDLER for the sub report call.
Sub reports can be called from any control block wherever printing in loops is allowed: ON EVERY ROW, BEFORE GROUP, AFTER GROUP, or ON LAST ROW.
The START REPORT must be in the calling report block. The START REPORT statement cannot be placed inside a function called from the report.
The START REPORT, OUTPUT TO REPORT, and FINISH REPORT statements must be in the same control block. The OUTPUT TO REPORT and FINISH REPORT statements can be placed inside a function or functions called from the report, however those functions must be in the same control block as the START REPORT statement.
You can have multiple calls to sub reports from the same control block, however the calls cannot be nested.
Valid:
REPORT master_report(...) ... FORMAT BEFORE GROUP ... ... START REPORT detail_report_1 FOREACH ... OUTPUT TO REPORT detail_report_1(...) END FOREACH FINISH REPORT detail_report_1 START REPORT detail_report_2 FOREACH ... OUTPUT TO REPORT detail_report_2(...) END FOREACH FINISH REPORT detail_report_2 ... END REPORT
REPORT master_report(...) ... FORMAT BEFORE GROUP ... ... START REPORT detail_report_1 START REPORT detail_report_2 -- Not allowed until after -- FINISH REPORT detail_report_1 ... END REPORTSub reports can be nested to arbitrary depth, but recursion is not allowed.
REPORT master_report(... ... FORMAT ON EVERY ROW ... START REPORT detail_report FOREACH ... OUTPUT TO REPORT detail_report(... END FOREACH FINISH REPORT detail_report END REPORT REPORT detail_report(... ... FORMAT ON EVERY ROW ... START REPORT other_detail_report -- Since recursion is not allowed, we are -- not allowed to call "master-report" or -- "detail_report" from here. FOREACH ... OUTPUT TO REPORT other_detail_report(... END FOREACH FINISH REPORT other_detail_report END REPORT
Detected sub report calls are shown in the report designer. They appear as nodes in the data view, triggers the structure view, and images in the document view.
This code example shows a master report master_report that calls two sub reports (report_orders and report_items) from the ON EVERY ROW section. The invocation of a sub report requires the START REPORT, OUTPUT TO REPORT and FINISH REPORT from within the master report.
The START REPORT instructions for sub reports cannot include the TO clause (START REPORT repname TO XML HANDLER); doing so will yield unexpected results.
FUNCTION run_master_report ... START REPORT master_report TO XML HANDLER handler FOREACH ... OUTPUT TO REPORT master_report END FOREACH FINISH REPORT master_report END FUNCTION REPORT master_report() DEFINE orderline OrderType, ch base.channel FORMAT ON EVERY ROW # Data source for first sub report LET ch = base.Channel.create() CALL ch.openFile(dataFile,"r") # First sub report START REPORT report_orders -- Notice there is no TO XML HANDLER -- for the sub report WHILE ch.read([orderline.*]) OUTPUT TO REPORT report_orders(orderline.*) IF fgl_report_getErrorStatus() THEN DISPLAY "FGL: STOPPING REPORT, msg=\"",fgl_report_getErrorString(),"\"" EXIT WHILE END IF END WHILE FINISH REPORT report_orders CALL ch.close() # Data source for second sub report LET ch = base.Channel.create() CALL ch.openFile(dataFile,"r") # Second sub report START REPORT report_items -- Notice there is no TO XML HANDLER -- for the sub report WHILE ch.read([orderline.*]) OUTPUT TO REPORT report_items(orderline.*) IF fgl_report_getErrorStatus() THEN DISPLAY "FGL: STOPPING REPORT, msg=\"",fgl_report_getErrorString(),"\"" EXIT WHILE END IF END WHILE FINISH REPORT report_items CALL ch.close() END REPORT REPORT report_orders ... END REPORT REPORT report_items ... END REPORT