Creating an EGL JasperReport handler
An EGL report handler of type JasperReport provides blocks of code that the JasperReports engine can access at run time. Predefined function names tie some of these code blocks to events that occur when JasperReports fills a report. Such events might include the beginning or end of a page, the beginning or end of a line item, or the beginning or end of the report itself. You can call other, custom functions directly from the XML design file source.
- Identify a project or folder to contain the file. If you do not already have a project or folder, you must create one.
- In the workbench, click .
- In the New window, expand EGL.
- Click Report Handler.
- Click Next.
- Select the project or folder that will contain the EGL source file and then select a package.
- In the EGL Source File Name field, type the name of the report handler source file. Because the report handler name will be identical to the file name, choose a file name that adheres to EGL part name conventions (for example, myReportHandler).
- Click Finish.
The New EGL Report Handler wizard will give you a list of function names that correspond to report fill events. For example, JasperReports will invoke "beforePageInit()" before entering a page. You must create the code for these functions.
- Create a new EGL source file.
- Type
handlerand then press Ctrl+space.
- The outline of a generic report handler
- How to get report parameters in a report-handler
- How to get and set report variables
- How to get field values
- How to add a report data record
- How to pass report data to an XML design document
- How to invoke a custom report handler function from the XML design document
These few examples cannot address all the complexities possible in a report handler. For more detail, see the JasperReports documentation.
Report handler template
handler handlerName type jasperReport
// Use Declarations
use usePartReference;
// Constant Declarations)
const constantName constantType = literal;
// Data Declarations
identifierName declarationType;
// Pre-defined Jasper callback functions
function beforeReportInit()
end
function afterReportInit()
end
function beforePageInit()
end
function afterPageInit()
end
function beforeColumnInit()
end
function afterColumnInit()
end
function beforeGroupInit(stringVariable string)
end
function afterGroupInit(stringVariable string)
end
function beforeDetailEval()
end
function afterDetailEval()
end
end
Getting report parameters
handler my_report_handler type jasperReport
// Data Declarations
report_title String;
// Jasper callback function
function beforeReportInit()
report_title = getReportParameter("ReportTitle");
end
end
Getting and setting report variables
handler my_report_handler type jasperReport
// Data Declarations
item_count int;
// Jasper callback function
function beforeDetailEval()
item_count = getReportVariableValue("itemCount");
end
function afterDetailEval()
setReportVariableValue("itemCount", (item_count + 1));
end
end
You must match variable types in the report handler with
those in your XML source file.Getting report field values
handler my_report_handler type jasperReport
// Data Declarations
employee_first_name String;
// Jasper callback function
function beforeColumnInit()
employee_first_name = getFieldValue("fName");
end
end
Saving report data in the report handler
handler my_report_handler type jasperReport
// Data Declarations
customer_array customerRecordType[];
c customerRecordType;
// Jasper callback function
function beforeReportInit()
customer ReportData;
//create the ReportData object for the Customer subreport
c.customer_num = getFieldValue("c_customer_num");
c.fname = getFieldValue("c_fname");
c.lname = getFieldValue("c_lname");
c.company = getFieldValue("c_company");
c.address1 = getFieldValue("c_address1");
c.address2 = getFieldValue("c_address2");
c.city = getFieldValue("c_city");
c.state = getFieldValue("c_state");
c.zipcode = getFieldValue("c_zipcode");
c.phone = getFieldValue("c_phone");
customer_array.appendElement(c);
customer.data = customer_array;
addReportData(customer, "saveCustomer");
end
end
Retrieving report data in the XML file
<jasperReport name="MasterReport" ... scriptletClass="subreports.my_report_handler">
...
<subreport>
<dataSourceExpression>
<![CDATA[(JRDataSource)(((subreports.SubReportHandler)
$P{REPORT_SCRIPTLET}).getReportData( new String("saveCustomer")))]]>;
</dataSourceExpression>
<subreportExpression class="java.lang.String">
<![CDATA["C:/RAD/workspaces/customer_subreport.jasper"]]>;
</subreportExpression>
</subreport>
...
</jasperReport>
Invoking a function from the XML design document
handler my_report_handler type jasperReport
function hello () returns (String)
return("Hello, world!");
end
end<jasperReport name="MasterReport" ... scriptletClass="my_package.my_report_handler">
...
<summary>
<band height="40">
<textField>
<reportElement positionType="Float" x="0" y="20" width="500" height="15"/>
<textElement textAlignment="Center">
<font reportFont="Arial_Bold" size="10"/>
</textElement>
<textFieldExpression class="java.lang.String">
<![CDATA[((my_package.my_report_handler)$P{REPORT_SCRIPTLET}).hello()]]>
</textFieldExpression>
</textField>
</band>
</summary>
...
</jasperReport>
The phrase "Hello, world!" will print at the end of the report.