JasperReport-Handler in EGL erstellen

Ein EGL-Berichtshandler des Typs 'JasperReport' stellt Codeblöcke zur Verfügung, auf die die JasperReport-Engine zur Ausführungszeit zugreifen kann. Vordefinierte Funktionsnamen binden einige dieser Codeblöcke an Ereignisse, die auftreten, wenn JasperReports einen Bericht füllt. Zu solchen Ereignissen können der Beginn oder das Ende einer Seite, der Beginn oder das Ende einer Position oder der Beginn oder das Ende des Berichts selbst gehören. Sie können weitere, angepasste Funktionen direkt aus der Quelle der XML-Designdatei aufrufen.

Führen Sie Folgendes aus, um einen EGL-Berichtshandler zu erstellen:
  1. Geben Sie ein Projekt oder einen Ordner an, in dem die Datei enthalten sein soll. Wenn Sie noch nicht über ein Projekt oder einen Ordner verfügen, müssen Sie ein Projekt/einen Ordner erstellen.
  2. Klicken Sie in der Workbench auf Datei > Neu > Andere.
  3. Erweitern Sie im Fenster 'Neu' die Option EGL.
  4. Klicken Sie auf Berichtshandler.
  5. Klicken Sie auf Weiter.
  6. Wählen Sie das Projekt oder einen Ordner aus, in dem die EGL-Quellendatei enthalten sein soll, und wählen Sie anschließend ein Paket aus.
  7. Geben Sie in das Feld Name der EGL-Quellendatei den Namen der Quellendatei für den Berichtshandler ein. Da der Name des Berichtshandlers mit dem Dateinamen identisch sein wird, wählen Sie einen Dateinamen, der die Namenskonventionen für EGL-Abschnitte einhält (beispielsweise 'myReportHandler').
  8. Klicken Sie auf Fertig stellen.

Der Assistent für neuen EGL-Berichtshandler zeigt eine Liste mit Funktionsnamen an, die den Ereignissen für das Füllen von Berichten entsprechen. Beispielsweise ruft JasperReports 'beforePageInit()' auf, bevor eine Seite geöffnet wird. Sie müssen für diese Funktionen den Code erstellen.

Sie können alternativ die folgenden Vorlageninformationen zu einer vorhandenen Datei hinzufügen, indem Sie folgende Schritte ausführen:
  1. Erstellen Sie eine neue EGL-Quellendatei.
  2. Geben Sie handler ein und drücken Sie anschließend die Steuer- und die Leertaste.
Im übrigen Teil dieses Abschnitts sind Codebeispiele enthalten, in denen folgende Elemente gezeigt werden:

Mit diesen wenigen Beispielen können nicht alle komplexen Sachverhalte angesprochen werden, die in einem Berichtshandler möglich sind. Weitere Details finden Sie in der Dokumentation zu JasperReports.

Vorlage für Berichtshandler

Dies ist der Vorlagencode, äääden der Assistent für neuen EGL-Berichtshandler erstellt:
handler handlerName type jasperReport

	// Verwendungsdeklarationen
	use usePartReference;

	// Konstantendeklarationen)
	const constantName constantType = literal;

	// Datendeklarationen
	identifierName declarationType;

	// Vordefinierte Jasper-Rückruffunktionen
	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

Berichtsparameter abrufen

Berichte können drei Typen von Elementen enthalten: Parameter (die in der XML-Datei festgelegt sind und sich nicht ändern), Variablen (die durch die XML-Datei oder den Berichtshandler geändert werden können) und Felder (die über einen Schlüssel mit Namen in der Datenquelle verbunden sind). Das folgende Codefragment zeigt, wie Berichtsparameter in einem Berichtshandler abgerufen werden:
handler my_report_handler type jasperReport

	// Datendeklarationen 
	report_title	String;

	// Jasper-Rückruffunktion
	function beforeReportInit()
		report_title = getReportParameter("ReportTitle");
	end

end

Berichtsvariablen abrufen und festlegen

Das folgende Codefragment zeigt, wie Berichtsvariablen in einem Berichtshandler abgerufen und festgelegt werden:
handler my_report_handler type jasperReport

	// Datendeklarationen 
	item_count	int;

	// Jasper-Rückruffunktion
	function beforeDetailEval()
		item_count = getReportVariableValue("itemCount");
	end

	function afterDetailEval()
		setReportVariableValue("itemCount", (item_count + 1));
	end
end
Sie müssen Variablentypen im Berichtshandler mit denen in Ihrer XML-Quellendatei abgleichen.

Feldwerte aus dem Bericht abrufen

Das folgende Codefragment zeigt, wie Feldwerte aus dem Bericht in einem Berichtshandler abgerufen werden:
handler my_report_handler type jasperReport
	
	// Datendeklarationen 
	employee_first_name	String;

	// Jasper-Rückruffunktion
	function beforeColumnInit()
		employee_first_name = getFieldValue("fName");
	end
end

Berichtsdaten im Berichtshandler speichern

Der folgende Beispielcode zeigt, wie Kundenstammdaten für den späteren Zugriff unter dem Namen 'saveCustomer' gespeichert werden:
handler my_report_handler type jasperReport
	
	// Datendeklarationen 
	customer_array	customerRecordType[];
	c             	customerRecordType;

	// Jasper-Rückruffunktion
	function beforeReportInit()
		customer ReportData;

		//ReportData-Objekt für den Unterbericht 'Kunde' (customer) erstellen
		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

In der XML-Datei Berichtsdaten abrufen

Nachdem Berichtsdaten im Berichtshandler gespeichert wurden, können Sie sie in der XML-Quellendatei abrufen und sie an einen Unterbericht übergeben:
<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>

Funktion im XML-Gestaltungsdokument aufrufen

Dieser Berichtshandler hat nur eine einzige einfache Funktion: Er druckt 'Hello, World!'
handler my_report_handler type jasperReport
	
function hello () returns (String)
		return("Hello, world!");
	end
end
Rufen Sie den Handler im XML-Gestaltungsdokument mit diesem Code auf:
<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>

Die Wortfolge 'Hello, world!' wird am Ende des Berichts gedruckt.


Feedback