Dynamische Formulare

Konzept

 Formulare dienen dazu, GECAMed zu individualisieren und an die speziellen Bedürfnisse von verschiedenen Praxen bzw. Arzttypen (vom Allergologen über Cardiologen bis hin zum Zahnarzt) anzupassen. In den Formularen werden Datensätze von Patientendaten gespeichert, für die es ansonsten keine geeignete Eingabemöglichkeit gibt. Außerdem können individuell definierte Berechnungen auf bereits eingegebenen Daten durchgeführt werden.

 Formular-EditorAbb. 1: Patientenmodulmenü

Um den Formular-Editor und die entsprechenden Features nutzen zu können, muss auf Ihrem Computer Java Version 1.6.0 oder höher installiert sein. Ist das nicht der Fall, werden der Formular-Editor, die Formularansicht und die weiteren Features zwar gegebenen Falls angezeigt, sind aber grau hinterlegt und können nicht gestartet werden. Die aktuelle Java Version erhalten Sie auf der Java Homepage zum Downloaden.

Jeder Benutzer mit den entsprechenden Zugriffsrechten kann selber neue Formularvorlagen erstellen, von denen ausgehend beliebig viele Formulare erstellt und zum Patientendossier hinzugefügt werden können. Für einem Patienten können mehrere Formulare, von allen verfügbaren Vorlagen erstellt werden. Zur Verbreitung der Formularvorlagen auf verschiedenen GECAMed Installationen, lassen sie sich auch als XML-Dateien ex- und importieren.

Den Formular-Editor erreichen Sie mit der -Schaltfläche in der Modulleiste. Hier können Formularvorlagen neu erstellt, editiert, ex- und importiert werden. Die für einen Patienten bereits erstellten Formulare finden Sie im Patienten Modul in der Historie. Im Patienten Modul gelangen Sie über die -Schaltfläche (siehe Abbildung 1 ) in die Formularansicht. Über die Schaltfläche „Neues Formular“ (siehe Abbildung 1 ) können Sie für den aktuell ausgewählten Patienten ein neues Formular nach einer bestehenden Formularvorlage erstellen.

Formular-Editor

Um den Formular-Editor sehen zu können, muss das Modul aktiviert sein (siehe Module) und der Benutzer muss die Rechte haben, es zu sehen. Ausreichende Rechte hat jeder Benutzer, der die Rolle „Formular-Editor Administrator“ besitzt (siehe Benutzerverwaltung). Sind beide Vorraussetzungen erfüllt, erscheint der Menüpunkt „Formular-Editor“ in der Modulleiste.

Grundlegender Aufbau des Formular-Editors

Vorlagenverwaltung

 Formular-Editor Vorlagen VerwaltungAbb. 2: Formular-Editor Vorlagenverwaltung

Wird der Menüpunkt „Formular-Editor“ geklickt, wird der Formular-Editor geöffnet (siehe Abbildung 2). Zunächst wird der Vorlagen-Karteireiter angezeigt, in dem die Formularvorlagen verwaltet werden. Die Vorlagenliste (siehe Abbildung 2 ) ist die Liste aller im System vorhandenen Formularvorlagen. In der Formular-Editor-Titelleiste (siehe Abbildung 2 ) kann mit der -Schaltfläche eine neue, leere Vorlage hinzugefügt, mit der -Schaltfläche die ausgewählte Vorlage entfernt und mit der -Schaltfläche eine Vorlage als neue Vorlage aus einer XML-Datei importiert werden. Ist eine Vorlage ausgewählt, können rechts im Eigenschaften-Menü (siehe Abbildung 2 ) der Name, die Versionsdefinition und die Beschreibung bestimmt werden. Zudem kann bestimmt werden, ob diese Formularvorlage nur als Unterformular (in einer anderen Formularvorlage) verwendet werden soll. Falls dem so ist, taucht diese Vorlage nicht in der Liste der Formularvorlagen auf, aus denen ein neues Formular erstellt werden kann. Und es können die Druckvorlagen für diese Formularvorlage definiert werden.

Mit einem Rechtsklick auf eine Vorlage in der Vorlagenliste öffnet sich ein Kontextmenü (siehe Abbildung 2 ). Hierüber kann die Vorlage geöffnet, gelöscht, exportiert und importiert werden. Geöffnet werden kann die Vorlage ebenfalls mit einem Doppelklick. Wird eine Vorlage geöffnet wird die Editor-Ansicht aufgerufen, in die die Vorlage hinein geladen wird. Gelöscht werden kann eine Vorlage nur, wenn noch keine Formulare basierend auf der Vorlage erstellt wurden oder alle auf dieser Vorlage basierenden Formulare gelöscht wurden. Ist dies nicht der Fall, wird der Benutzer in einem Dialog darauf hingewiesen. Dieser Dialog enthält ebenfalls die Liste der Patienten, die eine oder mehrere auf dieser Vorlage basierende Formulare besitzen. Wird versucht eine Vorlage über die Löschen-Schaltfläche in der Titelleiste zu entfernen hat dies den selben Effekt.

Beim Exportieren wird eine XML-Datei erstellt, die die Daten dieses Formulars enthält. Es wird ein Speichern Dialog geöffnet, indem der Benutzer bestimmen kann an welchen Ort die XML-Datei abgelegt werden soll oder ob der Vorgang abgebrochen werden soll. Das Importieren erstellt, im Gegensatz zu der Importieren-Funktion in der Titelleiste keine neue Vorlage, sondern verändert die ausgewählte. So ist die Import-Funktion in der Titelleiste dazu gedacht neue Vorlagen hinzuzufügen, während die Import-Funktion im Kontextmenü dazu gedacht ist ein Update zu einer Vorlage einzuspielen.

Die Titelleiste verändert sich je nachdem, ob die Vorlagenverwaltung oder der Vorlagen-Editor angezeigt wird.

Vorlagen-Editor

 Formular-Vorlagen-EditorAbb. 3: Formular-Vorlagen-Editor

Beim Aufrufen des Vorlagen-Editors werden die rechten Schaltflächen der Titelleiste aktiviert, mit denen der Skript-Editor aufgerufen (), eine Vorschau angezeigt () und die Vorlage gespeichert werden kann ().

In der Mitte des Vorlagen-Editors befindet sich eine Gitternetzstruktur (siehe Abbildung 3 ). Hier werden die Komponenten dargestellt, wie sie später erscheinen. Die Zellen des Editors können durch Anklicken ausgewählt werden. Die Zelle, die zur Zeit angeklickt ist, ist orange markiert (siehe Abbildung 3 ). Je nachdem welcher Zellentyp angeklickt ist, ein Leeres Feld, ein Randfeld oder eine Komponente, sehen die Einstellungen (siehe Abbildung 3 und Abbildung 4) anders aus. Die verschiedenen Arten von Zellen haben jeweils einen anderen Nutzen …

Abb. 4: Einstellungsmenüs

Randfelder (siehe Abbildung 4 ) dienen zur Positionierung der Leerfelder und Komponenten nach Zeile und Spalte. Sie bestimmen deren Lage im Gitternetz, sowie deren allgemeines Positionierungsverhalten. Sie befinden sich am oberen und linken Rand des Gitternetzes und sind mit 1 startend durchnummeriert. In ein Randfeld kann keine Komponente eingefügt werden. Randfelder sind im fertigen Formular nicht sichtbar.

Leerfelder (siehe Abbildung 4 & ) werden zwar, ähnlich wie die Randfelder, im fertigen Formular nicht sichtbar sein, nehmen aber dennoch eine bestimmte Fläche ein. Anstelle eines Leerfeldes kann auch eine Komponente eingeführt werden. Sie dienen somit gewissermaßen als Platzhalter für Komponenten. Um neue Komponenten in das aktuelle leere Feld einzufügen kann entweder die Drop-Down-Box-Ansicht oder die Listen-Ansicht genutzt werden.

Komponentenfelder (siehe Abbildung 4 ) sind Elemente wie Beschriftungen (Label), Schaltflächen, Textfelder, usw., die später im Formular dargestellt werden.

Formularvorlage einstellen

Die Grundstruktur eines Formulars ist ein Gitternetz. Von dieser Gitternetzstruktur kann zunächst die Größe bestimmt werden. Dazu befinden sich am rechten Rand im oberen Teil des Menüs zwei Zähler-Schalter, die die Spalten- und Zeilenanzahl bestimmen. Bei deren Veränderung werden Spalten / Zeilen jeweils am rechten / unteren Rand des Gitters hinzugefügt bzw. entfernt. Wenn eine Komponente sich über eine zu entfernende Spalte, bzw. Zeile erstreckt, bleibt die Spalte, bzw. Zeile bestehen und es passiert nichts. Um eine Spalte, bzw. Zeile zu entfernen, darf sich in ihr keine Komponente befinden.

Ist ein Randfeld ausgewählt können im Einstellungsmenü (siehe Abbildung 3 ) Einstellungen zu der Spalte bzw. Zeile vorgenommen werden. Dazu gehören die Breite bzw. Höhe, die Ausrichtung (links, rechts, oben, unten, zentriert, ausfüllen) und das Änderungsverhalten (nichts, wachsen) der Komponenten. Diese Einstellungen sind in Abbildung 4 zu sehen.

In den Eigenschaften der Vorlage (angezeigt in der Vorlagenverwaltung - siehe Abbildung 3 ) können weitere Einstellungen vorgenommen werden.
Der Name der Vorlage gibt an, worunter diese Vorlage zu finden ist. Sie wird in der Vorlagenverwaltung, beim Erstellen eines neuen Formulars und in der Historie unter diesem Namen angezeigt.
Die Version ist rein Informativ, es existiert keine Versionsverwaltung. Als Version kann ein beliebiger Text eingegeben werden. Dieser dient lediglich zur Orientierung für Programmierer und Nutzer der Vorlage.
Die Beschreibung soll angeben, worum es sich bei dieser Vorlage handelt. Es gibt dem Nutzer eine grobe Übersicht, was er mit dieser Vorlage tun kann.

Druckvorlagen Verwaltung

Abb. 5: Druckvorlagen Verwaltung

Durch Klicken auf die Schaltfläche „Vorlagen verwalten“ öffnet sich die Formular-Druckvorlagen-Verwaltung (siehe Abbildung 5).

Unter dem Punkt „iReport-Druckvorlage“ kann eine neue iReport Druckvorlage geladen , die aktuelle heruntergeladen oder entfernt werden. Es kann pro Formular nur eine iReport-Vorlage verwendet werden.
Um die Werte von Komponenten in der Vorlage zu drucken, können die Schlüsselwörter der Komponenten als Referenz genutzt werden. Eine Einleitung zu iReport-Vorlagen erhalten Sie im iReport Tutorial. Ist keine iReport-Vorlage geladen, kann iReport nicht zum Drucken des Formulars verwendet werden.

Unter dem Punkt „XSL-Druckvorlagen“ können mehrere Druckvorlagen im XSL-Format (EXtensable Stylesheet Language) angegeben werden. Mittels XSL-Dateien können Daten aus XML-Dateien in Verschiedene andere Formate konvertiert werden. In XSL wird im Prinzip ein Textdokument geschrieben, wobei Daten aus einer XML-Datei ausgelesen werden. Abhängig von der XML-Datei sieht das Textdokument immer anders aus. Dabei können Bedingte Anweisungen, Schleife und andere Programmiertechniken verwendet werden.
Man unterscheidet zwischen XSLT (EXtensable Stylesheet Language Transformation) und XSL-FO (EXtensable Stylesheet Language - Formating Objects).
XSLT beschreibt die Transformation von Daten. Mehr über XSLT und ein gutes Tutorial finden Sie unter www.w3schools.com/xsl.
XSL-FO ist ein Ausgabeformat und kann einfach in PDF, RTF (für MS Word und OO Writer) oder andere Ausgabeformate umgewandelt werden. Mehr über XSL-FO und ein gutes Tutorial finden Sie unter www.w3schools.com/xslfo.

Zunächst wird der Name der XSL-Druckvorlage bestimmt . Unter Name der Vorlage geben Sie den Namen der Druckvorlage an, so wie er später bei der Druckvorlagenauswahl angezeigt wird.
„Endung“ bestimmt die Dateiendung der aus XML mittels XSL erstellten Datei. Anhand der Dateiendung entscheidet ihr Betriebssystem, mit welchem Programm die Datei geöffnet wird. Ist es eine XSL-FO Druckvorlage entscheidet GECAMed außerdem anhand der Endung, in welches Format die Datei konvertiert wird.
Mittels den Schaltflächen unter kann die aktuelle Druckvorlage editiert , gelöscht oder eine neue geladen werden.
Im Bereich kann angegeben werden, für was die Druckvorlage verwendet wird. Maximal eine der Druckvorlagen kann zum anzeigen in der Historie verwendet werden. Diese muss im HTML Format sein. Ist keine ausgewählt, wird aus dem Formular automatisch eine HTML-Datei erzeugt. Die XSL Vorlage kann zum direkten Drucken verwendet werden oder, falls die Datei vor dem Drucken noch bearbeitet werden soll, weil z.B. der Arzt noch etwas hinzufügen möchte, kann die Datei bearbeitet werden. Ein RTF-Dokument kann z.B. sehr gut mit MS Word oder OO Writer geöffnet werden.

Damit man eine Vorstellung hat, wie die XML-Datei eines Formulars aussehen kann, die von der XSL-Datei verwendet wird, um die Ausgabedatei zu erstellen, kann man sich eine Beispiel XML-Datei erstellen lassen. Dazu steht die Schaltfläche „Daten-XML Beispiel“ zur Verfügung. Dabei wird ein neues, leeres Formular von der ausgewählten Formularvorlage erstellt und davon eine XML-Datei erzeugt.

Komponenten erstellen

Um eine neue Komponente zu erstellen, wählen Sie zunächst die Stelle aus, an der die Komponente eingefügt werden soll. Klicken Sie dazu im Vorlagen-Editor auf ein Leerfeld. Das ausgewählte Feld erscheint in orangener Farbe (siehe Abbildung 3 ). Am rechten Rand befinden sich nun Optionen, um eine neue Komponente zu erstellen (siehe Abbildung 4 ).

Spalte und Zeile geben an, in welcher Spalte und in welcher Zeile sich die ausgewählte Komponente befindet. Diese Felder sind rein informativ, hier kann nichts eingestellt werden. Die Spalten- und Zeilengröße gibt an, über wie viele Spalten, bzw. Zeilen sich die Komponente erstrecken wird. Eine Komponente ist also nicht auf ein Leerfeld beschränkt, sondern kann mehrere Leerfelder einnehmen. Die Größe der Komponente kann aber auch noch im Nachhinein bestimmt werden.

Neben der -Schaltfläche, die eine neue Komponente erstellt und dem Editor hinzufügt, kann ausgewählt werden, welche Komponente erstellt werden soll. Genaueres zu den verfügbaren Komponenten finden Sie unter Abbildung 8.

Nachdem die Komponente hinzugefügt wurde, ist sie direkt ausgewählt. Dabei passen sich die Optionen am rechten Rand an, da jetzt ein Komponentenfeld ausgewählt ist (siehe Abbildung 4 ).

Komponenten einstellen

Um eine Komponente einzustellen muss sie ausgewählt sein. Das passiert, genau wie bei einem Leerfeld, mit einem Klick auf die Komponente. Eine Komponente ist (normalerweise) orange hinterlegt, wenn sie ausgewählt ist. Einstellungen können dann im Menü am rechten Rand (Abbildung 4 ) vorgenommen werden.

Im oberen Teil der Einstellungszone sind wieder die Spalten- und Zeilennummer zu sehen. Daneben steht die Spalten- und Zeilengröße, die angeben, über wie viele Spalten und Zeilen sich die Komponente ausdehnt. Diese können vergrößert oder verkleinert werden. Allerdings kann eine Komponente nicht kleiner sein als eine Zelle und nicht so groß werden, dass sie eine andere Komponente überlappt oder über den Rand des Formulars hinaus ragt.

Wo bei einem Leerfeld eine Auswahlbox mit den verfügbaren Komponenten ist, wird nun angezeigt, welche Art von Komponente ausgewählt wurde (Beschriftung, Schaltfläche, Textfeld, …). Daneben befindet sich die -Schaltfläche, mit der die Komponente entfernt werden kann.

Das Schlüsselwort definiert die Komponente eindeutig. Ein Name kann deshalb in einer Vorlage nur einmal vergeben werden. Er ist der Objektname dieser Komponente im Skript-Editor. Das Schlüsselwort muss deshalb ein gültiger Java-Object Name sein und darf somit nur aus Buchstaben, Zahlen und einem Unterstrich (‚_‘) bestehen, wobei der Name nicht mit einer Zahl beginnen darf. Ein ungültig eingegebenes Zeichen wird sofort wieder entfernt. Ein leerer oder doppelter und damit ungültiger Eintrag wird durch ein rot hinterlegtes Textfeld signalisiert. Ist der Name gültig, ist das Textfeld grün hinterlegt.

Das Kontrollkästchen „Diese Komponente speichern“ gibt an, ob der Wert dieser Komponente in der Datenbank gespeichert werden soll. Bei Eingabefeldern wie Textfelder, Textareas oder Kontrollkästchen ist dieses Häkchen standardmäßig gesetzt, bei anderen Komponenten, wie Datentabellen oder Diagrammen kann dieses Kästchen nicht gesetzt werden, da diese ihre Informationen von einer Datenbankabfrage erhalten und diese immer aktualisiert werden müssen. Außerdem gibt es in dem für das Formular generierten XML-Dokument, das von der XSL-Vorlag benötigt wird, für jede Komponente ein Attribut mit einem Wahrheitswert, der angibt, ob dieser Haken gesetzt ist.

Das Kontrollkästchen „In der Historie anzeigen“ gibt an, ob der Wert dieser Komponente in der Historienansicht von GECAMed angezeigt werden soll, wenn keine XSL Druckvorlage für die Historie definiert ist. Außerdem gibt es in dem für das Formular generierten XML-Dokument, das von der XSL-Vorlag benötigt wird, für jede Komponente ein Attribut mit einem Wahrheitswert, der angibt, ob dieser Haken gesetzt ist. Der Historien Index definiert die Reihenfolge, in der die Werte der Komponenten dann in der Historie angezeigt werden. Die Werte werden in der folgenden Form angegeben:

FORMULARNAME
BESCHREIBUNG 1: WERT 1
BESCHREIBUNG 2: WERT 2

BESCHREIBUNG n: WERT n

Der Text der Beschreibung kann im Textfeld unter „Beschreibung“ eingegeben werden. Die Position der Beschreibung kann unter „Beschreibungsposition“ eingestellt werden. Die Position definiert, ob die Beschreibung oberhalb, unterhalb, links oder rechts der Komponente angezeigt wird. Wird „nichts“ gewählt, wird die Beschreibung zwar in der Historie angezeigt, aber nicht im Formular.

Der Startwert einer Komponente wird auf unterschiedliche Weise definiert. Der Startwert gibt an, wie die Komponente beim Erzeugen eines neuen Formulars aussieht. Bei einem Label entspricht dies der Beschriftung, bei einem Kontrollkästchen, zum einen der Beschriftung, zum anderen, ob das Kästchen angewählt ist oder nicht und bei einer Auswahlbox, werden dort die Werte bestimmt, die ausgewählt werden können und der Wert, der zu Beginn ausgewählt ist. Manchen Komponenten kann auch ein Bild übergeben werden, dessen Skalierung angegeben werden kann.

Das Diagramm

Die Einstellung eines Diagramms ist komplexer als die anderer Komponenten. Deshalb wird das Konfigurieren des Diagramms im Folgenden genauer erklärt.

Zunächst kann unter „Diagrammtyp“ ausgewählt werden, um welche Art von Diagramm es sich handelt. Unter „Datensatzeintrag“ können Graphen (Kurven) ausgewählt, hinzugefügt, entfernt und bearbeitet werden. Zum Auswählen, welcher Datensatz bearbeitet oder entfernt werden soll, wird die Auswahlbox benutzt. Zum hinzufügen und entfernen können die - und -Schaltfläche unterhalb der Auswahlbox genutzt werden.

Der Name des Datensatzes, der zum einen in der Auswahlbox erscheint und zum anderen in der Legende, kann im Textfeld „Datensatzname“ bearbeitet werden. Die Farbe des Graphen wird unter Linienfarbe geändert.

Ein Graph eines Diagramms zeigt den Verlauf eingegebener Werte eines Formulartyps. D.h. es können zwei Komponenten eines Formulartyps gewählt werden, die in der Datenbank gespeichert wurden. Von diesen Komponenten wird versucht ihre Werte in Zahlen (oder ein Datum) zu konvertieren, um diese der X- bzw. Y-Achse zuzuordnen. So erhält man einen Überblick über alle wichtigen Werte aller erstellten Formulare dieses Typs.

„Linienfarbe“ gibt die Farbe für diesen Graphen an. „Markierungen anzeigen“ definiert, ob für jeden eingetragenen Wert ein kleines Viereck an den Graphen gezeichnet werden soll oder ob die Linie des Graphen ausreicht zur Darstellung.
Die Auswahlbox „X-Achse“ definiert die Komponente, deren Werte an der Rubrikenachse angezeigt werden, die Auswahlbox „Y-Achse“ die, deren Werte an der Werteachse des Graphen angezeigt werden. Ist als Diagrammtyp Zeit-Diagramm gewählt, ist als X-Achse automatisch das Erstellungsdatum des Formulars gewählt. „Startdatum“ gibt an, ab welchem Erstellungsdatum ein Formular berücksichtigt wird. Der Wert „Anzahl an Formularen“ gibt an, die wie viel zuletzt erstellten Formulare im Graphen angezeigt werden sollen. Ist der Wert für das Startdatum gelöscht oder die Anzahl an Formularen gleich 0, wird das entsprechende Feld bei der Einschränkung zur Auswahl der Formulare nicht berücksichtigt.
Die Auswahlbox „Legende anzeigen“ gibt an, ob eine Legende mit den Namen der Datensätze angezeigt werden soll.

Jeder Graph kann auch statisch sein, d.h. seine Werte werden nicht dynamisch aus der Datenbank geladen, sondern vorab einmalig definiert. Diese Funktionalität kann genutzt werden, um beispielsweise Sollwerte darzustellen, wodurch Abweichungen von diesen leichter festzustellen sind.

Abb. 6: CSV-Import Dialog

Um einen statischen Graphen zu erstellen muss das Kontrollkästchen „statisch“ angeklickt werden. Wo vorher die Komponenten für X- und Y-Achse definiert wurden, erscheint nun eine Schaltfläche mit der Aufschrift „Daten aus CSV-Datei laden“. Wird darauf geklickt erscheint der CSV-Import-Dialog (siehe Abbildung 6).

Die Beschreibung (siehe Abbildung 6 ) erklärt was hier getan werden muss. Mit der Suchen-Schaltfläche kann die gewünschte CSV-Datei ausgewählt werden (siehe Abbildung 6 ). Danach kann eingestellt werden, ab welcher Zeile die Datei genutzt werden soll, welches Zeichen die Spalten von einander trennt und welches Zeichen den Text umschließt, damit Spalten genauer angegeben werden können und das Trennzeichen auch in einer Spalte verwendet werden kann (siehe Abbildung 6 ).

Sind diese Einstellungen vorgenommen wird unten eine Tabelle angezeigt, die die CSV-Datei widerspiegelt. Klicken Sie auf eine Spalte der Tabelle und wählen Sie in der Auswahlbox darüber (siehe Abbildung 6 ) eine Referenz aus, um die Werte der Spalte dieser Referenz zuzuordnen.
Sollten bei der Zuordnung Fehler entstehen, so dass kein Import der Datei durchgeführt werden kann, werden diese unter der Tabelle angezeigt (siehe Abbildung 6 ). Solange ein Fehler besteht, bleibt die OK-Schaltfläche deaktiviert. Sobald eine Datei geladen und alle Fehler behoben wurden, kann sie angeklickt werden.

Komponenten Layout einstellen

Abb. 7: Eigenschaften

Die verfügbaren Optionen zum Einstellen des Layouts können von Komponententyp zu Komponententyp variieren. Es gibt jedoch Standard-Layoutoptionen, die von den meisten Komponenten verwendet werden (siehe Abbildung 7). Die Layoutoptionen werden unterhalb der Einstellungen unter dem Menüpunkt „Eigenschaften“ vorgenommen.

Das Diagramm

Für Diagramme wird ein JFreeChart genutzt. Da das JFreeChart bereits ein Menü zum Konfigurieren des Layouts besitzt, wird kein Eigenschaften-Menü im Formular-Editor angezeigt. Stattdessen kann das bereits bestehende Menü mit einem Rechtsklick auf das Diagramm und einem Klick auf Eigenschaften verwendet werden.

Formularvorschau

Um eine Formularvorlage zu testen, kann eine Vorschau mit einem Klick auf die -Schaltfläche erstellt werden. Dabei wird aus der aktuellen Vorlage ein Formular erstellt, ohne dabei die Vorlage in der GECAMed-Datenbank zu speichern. Als Patient wird der aktuell gewählte Patient, als Arzt, der aktuell gewählte Arzt verwendet. Dabei wird nichts für den Patienten abgespeichert. Es werden lediglich Daten ausgelesen, die auch dann ausgelesen werden würden, falls aktuelle Arzt für den aktuellen Patienten ein Formular dieser Vorlage erstellen würde. Es kann jedoch aus bestimmten Gründen nicht auf alle Daten zugegriffen werden, weshalb beispielsweise ein Diagramm in der Vorschau nicht richtig angezeigt werden wird.

Skript-Editor

Mit Hilfe des Skript-Editors kann das Verhalten eines Formulars wesentlich beeinflusst werden. So kann z.B. auf Benutzeraktionen reagiert, Berechnungen ausgeführt und sogar Komponenten verändert werden. Wer Skripte selber erstellen möchte, sollte über Java und JavaScript Kenntnisse verfügen. Das ist notwendig, da es sich bei der Skriptsprache um JavaScript handelt und im Skript auf vordefinierte Java Objekte zugegriffen werden kann und neue Java Objekte erstellt werden können. Mit diesen Objekten kann dann wie in Java gearbeitet werden. Falls keine Java Kenntnisse vorhanden sind, sollten zumindest Grundkenntnisse in der objektorientierten Programmierung vorhanden sein.

Nützliche Links zur Einführung in diese Themen:

Galileo Computing - Java ist auch eine Insel (Ereignisse beim AWT)

Galileo Computing - JavaScript: Browser übergreifende Lösungen

Java Scripting Programmer’s Guide

Der Script-Editor wird durch einen Klick auf die -Schaltfläche in der Titelleiste des Formular-Editors geöffnet.

Grundlegender Aufbau des Skript-Editors

Der Skript-Editor ist ein eigenes Fenster, das zusätzlich zu GECAMed geöffnet wird und anders als ein Dialogfenster, gleichzeitig benutzt werden kann. Er stellt eine kleine Entwicklungsumgebung für die Skripte der dynamischen Formulare dar.

In der Mitte befindet sich ein Texteditor, in der die Skripte editiert werden. Er verfügt über Syntax-Hervorhebung für JavaScript.

Im oberen Teil befinden sich Schaltflächen zum Speichern, Zurücksetzen auf den zuletzt gespeicherten Punkt, Rückgängig machen, Wiederherstellen, Suchen und Ersetzen. Dabei erfolgt das Speichern einer Änderungen nicht direkt in der GECAMed Datenbank oder einer XML-Datei, sondern gibt nur die Änderungen an die aktuell editierte Formular-Vorlage weiter. Diese verwendet also erst die neuen Skripte, wenn sie im Skript-Editor gespeichert wurden. Mit der -Schaltfläche wird nur das momentan geöffnete Skript gespeichert. Erst mit der -Schaltfläche werden alle Skripte dieser Komponente gespeichert.

Am linken Rand befindet sich die Auswahl der zu editierenden Skripte. In der Auswahlbox kann die Komponente ausgewählt werden, deren Skripte editiert werden sollen. Dabei wird jeweils der Komponentenschlüssel angezeigt. Das erste Skript ist die Initialisierungsmethode, die global für alle Komponenten gleich ist und nur einmal, nämlich direkt nach dem öffnen des Formulars aufgerufen wird.

Darunter befinden sich die für diese Komponente möglichen Ereignisse. Standardmäßig werden nur die am häufigsten benötigten Ereignisse dargestellt. Wird das Kontrollkästchen „erweiterter Modus“ aktiviert, werden alle verfügbaren Ereignisse angezeigt. Die Ereignisse entsprechen den Methoden, der Listener, die an die entsprechende Komponente angemeldet werden können (eine Schaltfläche entspricht einem javax.swing.JButton – entsprechend wird hier unter anderem das Ereignis „actionPerformed“ zu finden sein).

Als drittes werden die für diese Formularvorlage definierten Funktionen angezeigt. Funktionen werden vom Benutzer selbst definiert. Es können jeder Zeit Funktionen hinzugefügt, entfernt und umbenannt werden. Funktionen sind genau wie die Initialisierungsmethode global für alle Komponenten eines Formulars verfügbar, werden jedoch nicht automatisch aufgerufen, sondern können innerhalb eines Skripts (also in der Initialisierungsmethode, in einem Ereignis oder in einer Funktion) aufgerufen werden.

Ein Skript schreiben

In diesem Kapitel werden JavaScript Kenntnisse, ein grundlegendes Verständnis von objektorientierter Programmierung und Kenntnisse über das Event-Handling von javax.swing-Komponen vorausgesetzt. Es werden nicht die Grundlagen der Java Scripting API erläutert, sondern nur die Besonderheiten in der Verwendung von Java Scripting für den Formular-Editor. Eine detailliertere Anleitung über die Java Scripting API ist im Java Scripting API Programmer's Guide zu finden.

Jede im Formular-Editor eingefügte Komponente entspricht einer javax.swing-Komponente, also einer JComponent. An jede dieser JComponents sind alle von ihr unterstützten Listener angemeldet. Die Ereignisse, die an der linken Seite angezeigt werden entsprechen den Methoden, die von einer Klasse implementiert werden müssen, die diese Listener implementiert.

Da an einen JButton ein ActionListener angemeldet werden kann, existiert das Ereignis „actionPerformed“, das beim drücken des JButtons aufgerufen wird. Das Skript, das dem actionPerformed-Ereignis hinterlegt ist, wird dann ausgeführt.

Auf jede Komponente im Formular kann mit ihrem Schlüsselwort als Objektname zugegriffen werden und sie kann wie ein Java Objekt verwendet werden. Es gibt also zum einen die Komponenten, die vom Benutzer eingefügt werden, zum anderen aber auch fest definierte Objekte auf die innerhalb des Skriptes zugegriffen wird.
Eine Liste der Komponententypen und der vorgegebenen Objekte sind in Abbildung 8 und Abbildung 9 zu sehen.

JDateChooser API ChartPanel APIAbb. 8: Einfügbare Komponententypen

Abb. 9: Verfügbare fixe Objekte

Bei nachträglichen Änderungen an einer Formularvorlage sollten die Name von Komponenten, deren Wert in der Datenbank gespeichert wird, unbedingt gleich bleiben, da es sonst zu inkonsistenten Daten kommen kann.

Eine Übersicht über die verfügbaren benutzerdefinierten Komponenten, fest definierten Objekte und Funktionen kann mit einem Rechtsklick auf den Texteditor des Skript-Editors aufgerufen werden. Per klick auf eines der Elemente wird es an die aktuelle Cursorposition des Editors eingefügt.

BMI berechnen - Ein Beispielskript

Abb. 10: Struktur der BMI Berechnung

Für ein besseres Verständnis, wie Skripte hinterlegt werden, soll im Folgenden ein Formular erstellt werden, das den Body Mass Index (BMI) eines Patienten berechnet.
Gehen wir davon aus, dass im Formular-Editor die Struktur bereits erstellt wurde (wie in Abbildung 10 zu sehen). Dabei besteht ein numerisches Textfeld mit dem Schlüssel „tfHeight“ zum eintragen der Größe des Patienten, eines mit dem Schlüssel „tfWeight“ zum eintragen des Gewicht des Patienten und ein Label mit dem Schlüssel „lblBmi“ in das das BMI hineingeschrieben wird.

Abb. 11: Skript-Editor

Öffnen Sie nun den Skript-Editor und erstellen Sie eine neue Funktion, indem auf die -Schaltfläche links unterhalb von „Funktionen“ in Bereich klicken. Es öffnet sich ein Dialog, indem Sie den Namen der Funktion eingeben, in unserem Fall „calculateBMI“. Klicken Sie nun auf den neu erschienenen Eintrag in der Liste der Funktionen namens „calculateBMI“, um das Skript zu öffnen.
Der Rumpf der Funktion existiert bereits, der Skript-Editor sollte so aussehen, wie in Abbildung 11 zu sehen. Wir füllen diesen Rumpf nun mit Anweisungen.
Zunächst sollen die Werte für Größe und Gewicht des Patienten aus den Textfeldern ausgelesen werden:

var height = new java.lang.Float(tfHeight.getValue());
var weight  = new java.lang.Float(tfWeight.getValue());

Die Variablen height und weight enthalten jetzt die Größe und das Gewicht des Patienten. Der BMI wird berechnet, indem das Gewicht (in Kilogramm) durch die Größe (in Meter) zum Quadrat geteilt wird, also:

BMI = Gewicht [kg] / Größe [m]²

Da wir die Größe des Patienten in cm angeben lassen, müssen wir sie vorher noch in Meter umrechnen. Das Skript zum berechnen des BMIs würde also aussehen wie folgt:

height = height / 100;
 
var bmiValue = weight / (height * height);

Da wir aber keine Division durch 0 wollen, prüfen wir zunächst noch ab, ob die Größe des Patienten ein sinnvoller Wert ist. Außerdem wollen wir keine Zahl mit vielen Nachkommastellen, sondern nur zwei Nachkommastelle. Anschließend setzten wir den berechneten Wert als Text des Labels lblBmi.

if (height <= 0) {
   return;
}
 
/* Berechneter Wert mal 100, auf ganze Zahl runden und danach durch 100 rechnen,
 * um genau zwei Nachkommastelle zu erhalten.
 */
var bmiValue = java.lang.Math.round(100 * (weight / (height * height))) / 100;
 
height = height / 100;
 
var bmiValue = weight / (height * height);
 
lblBmi.setText(bmiValue);

Um das ganze etwas anschaulicher zu gestalten, könnte man die Hintergrundfarbe des Ergebnisses je nach Wert des BMIs verändern.
Normalgewicht hat man beispielsweise mit einem BMI von 18,5 bis 25. Untergewicht ist also alles unter 18,5, Übergewicht alles über 25 (stark vereinfacht dargestellt). Wir färben also das BMI grün, für Normalgewicht und rot für Über- und Untergewicht.

if (bmiValue < 18.5 || bmiValue > 25) {
   lblBmi.setBackground(java.awt.Color.RED);
} else {
   lblBmi.setBackground(java.awt.Color.GREEN);
}

Um nicht immer den Packagenamen vor dem Klassennamen zu schreiben, kann ein Package auch importiert werden. Für die hier verwendeten Packages sähe das aus wie folgt.

importPackage(java.lang);
importPackage(java.awt);

Die gesamte Funktion könnte folglich so aussehen:

/* Calculates the BMI out of the given values
 */
function calculateBMI () {
  // IMPORTS
  importPackage(java.awt);
  importPackage(java.lang);
 
  /* Get the patient's size and weight and 
   * allocate it to the variables height and weight.
   */
  var height = new Float(tfHeight.getValue());
  var weight = new Float(tfWeight.getValue());
 
  /* The patient's size must be > 0,
   * else: exit the function as you cannot devide through 0
   */
  if (height <= 0) {
    return 0;
  }
 
  // convert the patient's size from cm to m
  height = height / 100;
 
  // calculate the BMI
  // (rounded on two decimal places)
  var bmiValue = Math.round(100 * (weight / (height * height))) / 100;
 
  // set the calculated bmi as value of the label
  lblBmi.setText(bmiValue);
 
  // set the color, depending on the BMI
  if (bmiValue < 18.5 || bmiValue > 25) {
    lblBmi.setBackground(java.awt.Color.RED);
  } else {
    lblBmi.setBackground(java.awt.Color.GREEN);
  }
}

Sie können jeder Zeit die Syntax des geöffneten Skripts auf Fehler prüfen. Klicken Sie dazu auf die -Schaltfläche. Daraufhin erscheint unterhalb des Editors eine Nachricht in rot, falls Fehler bestehen oder in schwarz, die Ihnen sagt, das keine Fehler bestehen.

Wählen Sie nun links als Komponente das numerische Textfeld tfHeight und wählen Sie dann das Ereignis „caretUpdated“, das immer dann ausgelöst wird, wenn irgendetwas im Eingabebereich des Textfeldes passiert. Rufen sie dort die Funktion claculateBmi auf. Das gleiche tun Sie für die Komponente tfWeight.

Wenn alles gespeichert ist, können Sie eine Vorschau aufrufen. Dort werden Sie sehen, wie der Wert des Labels entsprechend geändert wird, sobald etwas in eines der Textfelder eingetippt wird.

Hier können Sie sich die Formularvorlage als XML-Datei zum importieren in ihr GECAMed herunterladen: bmi_simple.xml

Hier können Sie sich eine erweiterte Version der BMI-Formularvorlage herunterladen. Sie besitzt mehrere Diagramme und eine Datentabelle zur Übersicht über alle eingetragenen Daten: bmi_advanced.zip

Beispiel Funktion

Im Folgenden finden Sie ein paar Beispiel Funktionen, die so in Ihr Formular übernommen werden können oder als Vorlage für eigene Funktionen dienen können:

calculateAge()
changeGraphDateToPatientAge()
clearSeriesOfDiagram()
convertColumnDateToAge()
convertXValueFromYearsToMonth()
getBirthdayOfCurrentPatient()
getBMI()
manipulateChart()

Formularansicht

Abb. 12: Formularansicht

Aus den im Formular-Editor erstellten Vorlagen, können in der Formularansicht Formulare erstellt werden. Wird ein Formular neu erstellt oder ein bestehendes geöffnet, wird es in der Formularansicht (Abbildung 12) dargestellt. Hier kann es bearbeitet, gespeichert, gelöscht und gedruckt werden.
Im unteren Bereich der Formularansicht ist eine Historie eingeblendet (siehe Abbildung 12 ), die nur Formulare anzeigt. Das Formular selber wird in der Mitte der Ansicht (siehe Abbildung 12 ) angezeigt. Oberhalb des geöffneten Formulars sind verschiedene Karteireiter zu sehen, über die zwischen den geöffneten Formularen gewechselt werden kann.

Formulare erstellen

Ein neues Formular kann erstellt werden, indem auf die Schaltfläche „Neues Formular“ (siehe Abbildung 12) geklickt wird. Daraufhin öffnet sich ein Dialog wie in Abbildung 13 zu sehen. Hier werden alle Formular-Vorlagen angezeigt (siehe Abbildung 13 ), die dieser GECAMed-Installation zur Verfügung stehen. Wählen Sie eine Vorlage aus und drücken Sie auf „OK“, damit für den momentan ausgewählten Patienten ein neues Formular nach dieser Vorlage erstellt wird. Ein neues Formular kann von überall aus der Patientenansicht erstellt werden. Nach dem Erstellen wechselt GECAMed immer in die Formularansicht und zeigt das gerade erstellte Formular in einem neuen Karteireiter an.

Abb. 13: neues Formular erstellen

Formulare speichern

Wird an einem Formular etwas geändert, wechselt die Titelleiste der Patientenansicht von grau nach gelb und die Speichernschaltfläche wird aktiviert (siehe Abbildung 12 ). Mit einem Klick auf die -Schaltfläche werden alle Änderungen gespeichert, die für diesen Patienten im Patientenmodul gemacht wurden - auch die, die außerhalb der Formularansicht gemacht wurden.

Formulare öffnen und schließen

Abb. 14: Formular Rechtsklickmenü von Historie

Formulare können aus der Historie heraus geöffnet werden. Dabei kann sowohl die Historie in der Historienansicht, als auch die Historie in der Formularansicht benutzt werden. Zum öffnen eines Formulars kann entweder ein Doppelklick auf das entsprechende Formular verwendet werden oder ein Rechtsklick. Beim Doppelklick wird das Formular sofort geöffnet, bei einem Rechtsklick erscheint ein Menü (siehe Abbildung 14 ). In diesem Kontextmenü kann durch einen Klick auf den Menüpunkt „Formular öffnen“ das Formular geöffnet werden.

Wird ein Formular geöffnet wechselt GECAMed in die Formularansicht (falls Sie sich nicht schon in dieser befinden) und zeigt das Formular dort in einem neuen Karteireiter an.

Abb. 15: Formular Rechtsklickmenü von Karteireiter

Abb. 16: Bestätigungsdialog: Formular schließen

Mit einem Rechtsklick auf den Karteireiter eines Formulars öffnet sich das Kontextmenü (siehe Abbildung 15). In diesem Menü kann mit einem Klick auf den Menüpunkt „Schließen“ das gewählte Formular geschlossen werden, mit einem Klick auf den Menüpunkt „Alle schließen“ werden alle zurzeit geöffneten Formulare des Patienten geschlossen. Soll ein Formular geschlossen werden, dass nicht gespeicherte Daten enthält, wird vorher abgefragt, ob Sie dieses Formular wirklich schließen möchten (siehe Abbildung 16). Wenn Sie diesen Dialog mit „Ja“ bestätigen, wird das entsprechende Formular gespeichert und geschlossen, bestätigen Sie mit „Nein“, wird das Formular geschlossen, ohne es zu speichern und falls Sie auf „Abbrechen“ klicken, wird das Formular nicht geschlossen und der Vorgang wird abgebrochen. Haben Sie „Alle schließen“ gewählt und eines der Formulare ist noch nicht gespeichert, werden Sie darauf hingewiesen, dass ein oder mehrere nicht gespeicherte Formulare bestehen. Hier haben Sie die gleichen Auswahlmöglichkeiten, wie bei einzelnen Formularen. Die gewählte Option wird für alle Formulare übernommen.

Formularinhalte importieren

Es besteht die Möglichkeit, Formularinhalte für eine in GECAMed bestehende Formularvorlage zu importieren. Wenn beispielsweise bereits Messungen oder Auswertungen für einen Patienten bestehen, eine Formularvorlage zum Eintragen der Daten in GECAMed aber erst nachträglich erstellt wurde, ist es eventuell mühsam für jeden Datensatz ein Formular zu erstellen und die Daten in GECAMed einzugeben. Oftmals ist es einfacher die Daten in Excel (oder ein vergleichbares Programm) einzugeben. Aus diesem kann dann ganz einfach eine CSV-Datei erstellt werden. Mittels dieser wiederum können die Werte als Formulare importiert werden.
Für jedes Schlüsselwort einer Formularvorlage, dessen Komponente in der Datenbank gespeichert wird, kann dabei ein Wert eingegeben werden. Für das Erstellungsdatum des Formulars muss hingegen ein Wert eingegeben werden. Die Erstellungsdaten können alle auf heute ausgestellt werden, genau so gut kann aber auch als Erstellungsdatum des Formulars das tatsächliche Messdatum angegeben werden. Das wäre beispielsweise Sinnvoll, falls eine Datentabelle oder ein Diagramm verwendet wird, um eine Übersicht zu geben, oder um die Werte in der Historie entsprechend anordnen zulassen.

Eine Spalte in der CSV-Datei stellt dabei die Werte für jeweils eine Komponente der Formularvorlage bzw. das Erstellungsdatum dar. Jede Zeile entspricht einem neuen Formular, das durch den Import erstellt wird und mit den entsprechenden Daten abgespeichert wird.

Eine CSV-Datei, für das oben gezeigte BMI-Beispiel könnte also so aussehen:

Erstellungsdatum Größe Gewicht BMI
2006-01-01 10:00 160 46 17,97
2007-01-01 10:00 163 51 19,20
2008-01-01 10:00 166 54 19,60
2009-01-01 10:00 167 55 19,72
2010-01-01 10:00 168 57 20,20

Um die in einer CSV-Datei angegebenen Formulare nun automatisch erstellen zu lassen, öffnen Sie den Neues-Formular-Erstellen-Dialog. Wählen Sie die Vorlage aus, zu der Sie Formulare importieren möchten und klicken Sie dann auf die Importieren-Schaltfläche (siehe Abbildung 13 ). Daraufhin öffnet sich der CSV-Datei-Import-Dialog (siehe Abbildung 6). Die Bedienung ist Äquivalent zum Importieren von statischen Graphen.

Formulare zum Herunterladen

Formulare löschen

Formulare können über die Historie gelöscht werden. Dabei kann sowohl die Historie in der Historienansicht, als auch die Historie in der Formularansicht benutzt werden. Zum löschen eines Formulars muss ein Rechtsklick auf das entsprechende Formular verwendet werden. Dabei erscheint ein Menü (siehe Abbildung 14 ), indem durch einen Klick auf den Punkt „Formular löschen“ das ausgewählte Formular gelöscht werden kann.

Ist das Formular geöffnet, kann es auch über einen Rechtsklick auf den zugehörigen Karteireiter gelöscht werden. Bei dem Rechtsklick erscheint ein Menü (siehe Abbildung 15), indem durch einen Klick auf den Punkt „Formular löschen“ das entsprechende Formular gelöscht werden kann.

Jedes Mal, bevor ein Formular gelöscht wird, erscheint ein Bestätigungsdialog (siehe Abbildung 17), der fragt, ob das Formular wirklich gelöscht werden soll. Wird der Löschvorgang mit „OK“ bestätigt, wird das Formular unwiderruflich gelöscht. Wird der Vorgang abgebrochen, bleibt das Formular bestehen.

Abb. 17: Bestätigungsdialog: Formular löschen

Formulare ausdrucken

Wie bereits unter Formularvorlage einstellen beschrieben, gibt es mehrere Möglichkeiten, ein Formular zu drucken. Via iReport oder XSL. Bei einem Rechtsklick auf das Tab eines geöffneten Formulars erscheint ein Kontextmenü (siehe Abbildung 15), welches 3 Druckoptionen zur Verfügung stellt.

Via iReport drucken

Wir „iReport Drucken“ angeklickt, öffnet sich die Druckvorschau, das Druckenmenü oder das Dokument wird umgehend gedruckt, je nachdem wie die Druckeinstellungen in GECAMed gesetzt wurden. Diese Option ist jedoch nur aktiv, wenn das Formular abspeichert ist. Anderenfalls ist der Menüpunkt ausgegraut und kann nicht angeklickt werden.

Wie das Resultat des Druckauftrags aussieht, hängt von mehreren Faktoren ab. Zunächst natürlich vom Formular selber. Jedoch wird das Formular nicht einfach so ausgedruckt, wie es auf dem Bildschirm zu sehen ist. Um das eigentliche Formular herum können andere Informationen dargestellt werden. Dazu gibt es eine Druckvorlage, die im Administrationsmenü für Druckvorlagen eingestellt werden kann. In den PageHeader-Tag dieser iReport-Vorlage wird das Formular eingefügt. Der PageHeader-Tag sollte beim Erstellen der iReport-Vorlage deshalb frei bleiben. Diese Druckvorlage wird für jedes Formular verwendet.

Für jede Formularvorlage kann eine weitere iReport-Vorlage definiert werden. Während die erste Vorlage den Rahmen des Ausdrucks definiert, definiert diese die Darstellung des eigentlichen Formulars. Welche iReport-Vorlage verwendet wird, kann im Formular-Editor bestimmt werden (siehe Formularvorlage einstellen). Falls keine iReport-Vorlage für die Formularvorlage des Formulars gespeichert ist, wird ein Abbild (eine Art Screenshot) des gesamten Formulars gemacht und als Bild in die Druckvorlage eingefügt und gegebenenfalls herunter skaliert, damit das Formular auf eine Seite passt.

Via XSL drucken / editieren

Wenn eine der beiden Optionen ausgewählt wird, wird geprüft, wie viele XSL-Druckvorlagen für dieses Formular und diese Option zur Verfügung stehen. Sind es mehr als eins, wird ein Auswahldialog angezeigt, bevor es weiter geht. Falls keine Vorlage zur Verfügung steht ist die Option ausgegraut und kann gar nicht erst ausgewählt werden. Die Option ist außerdem ausgegraut, wenn das Formular nicht abgespeichert ist oder in den Benutzereinstellungen nicht festgelegt wurde, mit welchem Programm die zu erstellende Datei geöffnet werden soll („Einstellungen“ - „Einstellungen“ - „Formular-Editor“ - „Drucke und öffne Formulare mit …“). Zur Auswahl stehen Microsoft Word, OpenOffice Writer und „das Standard Programm“. Letzteres bedeutet, dass der PC selber, anhand der Dateiendung, entscheidet, mit welchem Programm er die Datei öffnet. Dabei wird der das Standardprogramm zum Drucken genutzt, wenn „XSL drucken“ ausgewählt wurde und das Standardprogramm zum editieren genutzt, wenn „XSL editieren“ ausgewählt wurde. Falls Word oder Writer ausgewählt wurde, wird die Datei immer mit diesem Programm geöffnet. Der Unterschied zwischen Editieren und Drucken besteht darin, dass beim Drucken die Datei zwar in Word oder Writer geladen wird, sie das aber nicht sehen, da sie nur gedruckt und direkt wieder geschlossen wird.

Hier zwei Beispiel XSL-Druckvorlagen, um am Beispiel BMI darzustellen, wie so eine Druckvorlage aussehen kann.
Zum einen eine XSLT-Datei, die eine HTML-Datei für die Historie erstellt, zum anderen eine XSL-FO-Datei, die eine HTML-, RTF- oder PDF-Datei für einen Brief erstellt: Simple BMI XSL Druckvorlagen.

de/project/gecamed/userguide/formeditor.txt · Zuletzt geändert: 2014/02/10 12:16 von Johannes Hermen
© Centre de Recherche Public Henri Tudor | Legal Notice