Base

Kapitel 7
Datenbank-Anbindung

Dokumentationen zu LibreOffice unter de.libreoffice.org

Copyright
Dieses Dokument unterliegt dem Copyright © 2015. Die Beitragenden sind unten aufgeführt. Sie
dürfen dieses Dokument unter den Bedingungen der GNU General Public License (http://www.gnu.org/licenses/gpl.html), Version 3 oder höher, oder der Creative Commons Attribution License(http://creativecommons.org/licenses/by/3.0/), Version 3.0 oder höher, verändern und/oder weitergeben.
Warennamen werden ohne Gewährleistung der freien Verwendbarkeit benutzt.
Fast alle Hardware- und Softwarebezeichnungen und weitere Stichworte und sonstige Angaben,
die in diesem Buch verwendet werden, sind als eingetragene Marken geschützt.
Da es nicht möglich ist, in allen Fällen zeitnah zu ermitteln, ob ein Markenschutz besteht, wird das
Symbol (R) in diesem Buch nicht verwendet.

Mitwirkende/Autoren
Robert Großkopf

Jost Lange

Jochen Schiffers

Michael Niedermair

Rückmeldung (Feedback)Kommentare oder Vorschläge zu diesem Dokument können Sie in deutscher Sprache an die
Adresse discuss@de.libreoffice.org senden.

Vorsicht

Alles, was an eine Mailingliste geschickt wird, inklusive der E-Mail-Adresse undanderer persönlicher Daten, die die E-Mail enthält, wird öffentlich archiviert und kannnicht gelöscht werden. Also, schreiben Sie mit Bedacht!

Datum der Veröffentlichung und Softwareversion
Veröffentlicht am 15.08.2021. Basierend auf der LibreOffice Version 7.2.

Datenbank-Anbindung

2

Inhalt
Allgemeines zur Datenbank-Anbindung ......................................................................................... 4
Anmeldung der Datenbank ............................................................................................................. 4
Datenquellenbrowser ..................................................................................................................... 4
Daten in Text .............................................................................................................................. 6
Daten in Felder ........................................................................................................................ 10
Seriendruck .................................................................................................................................. 10
Aktuelle Dokument-Datenquelle ............................................................................................... 11
Explorer ein/aus ....................................................................................................................... 11
Serienbrieferstellung ..................................................................................................................... 11
Erstellung von Etiketten ................................................................................................................ 18
Serienbriefe und Etiketten direkt erstellen .................................................................................... 22
Serienbrieffelder mit der Maus erstellen ................................................................................... 22
Serienbrieffelder über Feldbefehle erstellen ............................................................................ 23
Externe Formulare ........................................................................................................................ 24
Vorteil externer Formulare ....................................................................................................... 26
Nachteil externer Formulare .................................................................................................... 26
Datenbanknutzung in Calc ........................................................................................................... 27
Daten in Calc einfügen ............................................................................................................. 27
Daten aus Calc in eine Datenbank exportieren ........................................................................ 31
Daten von einer Datenbank zu einer anderen konvertieren .......................................................... 32
Daten über die Zwischenablage in eine Tabelle einfügen ............................................................. 32
Datenimport aus PDF-Formularen ................................................................................................ 33
Erstellen eines PDF-Formulars ................................................................................................ 33
Auslesen der Daten aus dem PDF-Formular ........................................................................... 343

Allgemeines zur Datenbank-Anbindung
Base lässt sich in LibreOffice Writer und LibreOffice Calc auf verschiedene Weise als Datenquellenutzen. Die Nutzung von Base ist dabei nicht unbedingt an eine Anmeldung der Datenbank in den
Einstellungen von LibreOffice gebunden. So interagieren externe Formulare auch direkt mit Base,sofern dort als Datenquelle der Weg zur Datenbank angegeben wird.

Anmeldung der Datenbank
Für viele Funktionen wie z.B. die Nutzung beim Etikettendruck, die Nutzung von Daten für Serienbriefe usw. ist die Anmeldung einer Datenbank in den Einstellungen von LibreOffice notwendig.
Über Extras → Optionen → LibreOffice Base → Datenbanken → Neu lässt sich eine Datenbank für den
weitergehenden Gebrauch in anderen LibreOffice-Komponenten anmelden.

Die Datenbank wird über den Dateibrowser gesucht und auf ähnliche Weise mit LibreOffice verknüpft wie sonst bei einem einfachen Formular. Der Datenbank selbst wird allerdings ein eingängigerer Name gegeben, der ohne weiteres anders lauten kann als der Name der eigentlichen Datenbankdatei. Die Namensbezeichnung ist so etwas wie ein Alias-Name, was ja auch bei Abfragen in
Datenbanken vergeben werden kann.

DatenquellenbrowserÜber den Datenquellenbrowser im Writer oder in Calc erhalten sie Zugriff auf Tabellen und Abfragen der registrierten Datenbanken unter dem dort angegebenen registrierten Namen. Der Browseröffnet sich über Ansicht → Datenquellen oder nach dem Drücken der Tastenkombination
Strg+Umschalt+F4 oder über das entsprechende, in der Grundeinstellung nicht eingeblendete,
Symbol in der Standard-Symbolleiste.

HinweisDie folgende Beschreibung des Datenquellenbrowser richtet sich nach den Funktionen im Writer aus. Für Calc siehe Datenbanknutzung in Calc.

Datenquellenbrowser

4Auf der linken Seite im Datenquellen-Browser sind die angemeldeten Datenquellen zu sehen. Die
Datenquelle "Bibliography" ist standardmäßig bei LibreOffice mit dabei. Die weiteren Datenquellen
unterscheiden sich je nach angemeldetem Namen.

Durch einen Klick auf das + - Zeichen vor den Datenbankbezeichnungen öffnet sich die Datenbank
und zeigt an, dass sich darin ein Unterordner für Abfragen und ein Unterordner für Tabellen befindet. Die weiteren Unterordner der Datenbank werden nicht zur Verfügung gestellt. Interne Formulare sowie Berichte sind also nur über die Datenbank selbst verfügbar.
Erst beim Klick auf den Ordner Tabellen erfolgt der tatsächliche Datenbankzugriff. Bei passwortgeschützten Datenbanken erfolgt zu diesem Zeitpunkt die Passwortabfrage.
Rechts von dem Verzeichnisbaum zeigt sich die angewählte Tabelle. Sie kann wie in Base selbst
bearbeitet werden. Bei stärker ausgeprägten relationalen Datenbanken ist allerdings die Eingabe
in die Tabelle mit Vorsicht zu bewerkstelligen, da die Tabellen ja über Fremdschlüssel miteinander
verknüpft sind. Allein die unten abgebildete Datenbank zeigt eine separate Tabelle für die Straßennamen, eine für Postleitzahlen und noch eine für den Ort.
Für den richtigen Blick auf die Daten ohne entsprechende Editiermöglichkeit eignen sich daher
Abfragen oder entsprechende Ansichten (Views) besser.

Von den Zeichen in der Symbolleiste sind viele bereits aus der Eingabe von Daten in Tabellen
bekannt. Neu ist insbesondere der letzte Abschnitt: «Daten in Text, Daten in Felder, Seriendruck,
Aktuelle Dokument-Datenquelle, Explorer ein/aus».

Datenquellenbrowser

5Abbildung 1: Symbolleiste Datenquellenbrowser

HinweisDer Datenquellenbrowser eignet sich auch für die Dateneingabe. Dies sollte bei
FIREBIRD so lange nicht zur Eingabe und Änderung von Daten genutzt werden, wiediese Datenbank noch das Abspeichern in der *.odb-Datei erfordert. Sonst scheinen
die Daten geändert, werden aber nicht gesichert.

Daten in Text
Die Funktion «Daten in Text» steht zur Verfügung, sobald ein Datensatz markiert wurde.

Abbildung 2: Markierung eines Datensatzes
Wird jetzt «Daten in Text» angewählt, so erscheint ein Assistent, der die erforderlichen Formatierungen vornimmt:

Datenquellenbrowser

6Abbildung 3: Daten Einfügen als Tabelle
Für das Einfügen von Daten in den Text stehen die Möglichkeiten der Darstellung in Tabellenform,
als einzelne Felder oder als Gesamttext zur Verfügung.
Die obige Abbildung zeigt den Aufbau «Daten einfügen als Tabelle». Bei Zahlenfeldern und
Datumsfeldern kann das Format der Datenbank durch ein eigenes gewähltes Format geändert
werden. Ansonsten erfolgt die Formatierung mit der Auswahl der Tabellenfelder. Die Reihenfolge
der Felder wird über die Pfeiltasten festgelegt.
Sobald Tabellenspalten gewählt sind, wird der Button Eigenschaften für die Tabellen aktiviert. Hierkönnen die üblichen Tabelleneigenschaften des Writer eingestellt werden (Breite der Tabelle, Spaltenbreite …).
Das Markierfeld gibt darüber Auskunft, ob eine Tabellenüberschrift gewünscht ist. Ist dieses Markierfeld nicht angewählt, so wird für die Überschrift keine separate Zeile eingefügt.
Die so eventuell gewählte Zeile für die Tabellenüberschrift kann entweder die Spaltennamen übernehmen oder nur die Zeile erstellen und den Platz für die Überschrift zum späteren Editieren
schaffen.

Datenquellenbrowser

7

Abbildung 4: Über «Autoformat» stehen Tabellenformate zur AuswahlÜber den Button Autoformat werden einige vorformatierte Tabellenansichten angeboten. Bis auf
das Vorschlagsformat «Standard» können alle hier enthaltenen Formatierungen umbenannt werden.
Um dem Autoformat-Vorschlag für Tabellen einer Tabelle hinzuzufügen, muss eine Tabelle erstellt
worden sein. Diese wird dann markiert und kann über den Button Hinzufügen in die Tabellenliste
aufgenommen werden.
Die Tabelle wird schließlich mit der Anzahl der markierten Zeilen erstellt.
Über «Daten einfügen als Felder» wird die Möglichkeit geboten, in einem kleinen Editor die verschiedenen Tabellenfelder hintereinander in einem Text zu positionieren. Dem erstellten Text kannaußerdem eine Absatzvorlage zugewiesen werden. Auch hier ist die Formatierung von Datumsund Zahlenwerten separat wählbar, kann aber auch direkt aus den Tabelleneinstellungen derDatenbank gelesen werden.

Datenquellenbrowser

8Abbildung 5: «Daten einfügen als Felder» – entspricht auch dem Fenster für «Daten einfügen als Text»
Die auf diese Weise in den Text eingefügten Felder können nachher auch einzeln gelöscht oder als
Serienbrieffelder weiter genutzt werden.
Wird Daten einfügen als Text gewählt, so unterscheidet sich das gegenüber den Feldern nur insofern, als bei den Feldern weiterhin die Datenbankverknüpfung bestehen bleibt. Bei der Einfügung als Text wird lediglich der direkte Inhalt der jeweiligen Felder übernommen, nicht aber die
Verknüpfung zur Datenbank selbst. Daher unterscheidet sich auch das Fenster für diese Funktion
nicht von dem Fenster der vorhergehenden.
Das Ergebnis der beiden Funktionen sieht im Vergleich so aus:

Abbildung 6: Vergleich: «Daten als Felder» - Daten als«Text»Die Felder sind grau hinterlegt. Wird mit einer Maus über die Felder gefahren, so zeigt sich, dassdie Felder weiterhin eine Verbindung zur Datenbank "Adressen", zur dortigen Tabelle "Person" undzum, in dieser Tabelle befindlichen, Feld "GebDat" haben.

Datenquellenbrowser

9Abbildung 7: Doppelklick auf ein eingefügtes Feld zeigt die Eigenschaften des Seriendruckfeldes
Ein Doppelklick z.B. auf das Feld "GebDat" öffnet schließlich folgende Übersicht. Hier wird dannklar, welches Feld letztlich über die Funktion «Daten einfügen als Felder» gegründet wurde. Es ist
der gleiche Feldtyp, der auch über Einfügen → Feldbefehl → Weitere Feldbefehle → Datenbank
erzeugt wird.
Einfacher lässt sich so ein Feld übrigens erzeugen, wenn im Datenquellenbrowser der Spaltenkopf
der Tabelle markiert und mit der Maus in das Dokument gezogen wird. So kann direkt ein Serienbrief erstellt werden.

Daten in FelderÜber «Daten einfügen als Felder» im vorherigen Abschnitt wurden in einem Writer-Dokument
Seriendruckfelder erzeugt. Wird jetzt im Datenquellen-Browser ein anderer Datensatz markiert unddann «Daten in Felder» ausgewählt, so werden die vorherigen dargestellten Daten durch dieneuen Daten ersetzt:

Hier wurde ein anderer Datensatz markiert. Während bei Betätigung von «Daten in Felder» dievorher eingefügten Felder auf den neuen Datensatz umgeschrieben werden, bleibt der über«Daten einfügen als Text» erstellte Text bestehen.

Seriendruck
Mit diesem Button wird der Seriendruck-Assistent gestartet. Da für einen Serienbrief im obigen Beispiel die Daten aus verschiedenen Tabelle zusammengefasst werden müssen, muss zuerst einmal
Seriendruck10die Datenbank gestartet werden. In der Datenbank ist dann eine neue Abfrage zu erstellen, die die
Daten entsprechend zur Verfügung stellt.

Erfolgt der Start der Datenbank durch einen rechten Mausklick auf die Datenbank oder eine derTabellen oder Abfragen der Datenbank, so wird die Ansicht im Datenquellenbrowser anschließend
sofort aktualisiert. Anschließend kann dann der Serienbrief-Assistent über den entsprechenden
Button aufgerufen werden.

Aktuelle Dokument-Datenquelle
Ein Klick auf diesen Button öffnet direkt die Ansicht auf die Tabelle, die die Grundlage für die Datenbildet, die in das Dokument eingefügt wurden. Im obigen Beispiel zeigt sich also sofort die Tabelle"Person" aus der Datenbank "Adressen".

Explorer ein/aus
Mit Betätigung dieses Buttons wird die Ansicht auf den Verzeichnisbaum links von der Tabellenansicht ein- und ausgeschaltet. Dies dient dazu, gegebenenfalls mehr Platz für eine Sicht auf die
Daten zu erhalten. Um auf eine andere Tabelle zugreifen zu können, muss der Explorer eingeschaltet werden.

SerienbrieferstellungÜber den Datenbankbrowser ist auch der Serienbriefassistent zugänglich. Mit diesem Assistenten
wird kleinschrittig das Adressfeld und die Anrede anhand einer Datenquelle nachvollzogen. Prinzipiell ist die Erstellung von solchen Feldern natürlich auch ohne den Assistenten möglich. Hier wird
einmal beispielhaft der gesamte Assistent durchgearbeitet.

HinweisDer Serienbrief-Assistent ist seit der Version LO 5.2 auf 5 Schritte verkürzt worden.
Dabei sind die Inhalte der Schritte 1 bis 5 gleich geblieben.

Serienbrieferstellung

11Das Ausgangsdokument des Serienbriefs ist das Dokument, mit dem die Datenbankfelder verknüpft werden.
Das Serienbriefdokument hingegen ist das, in dem nachher die Daten der verschiedenen Personen stehen, die den Serienbrief erhalten haben. Im Serienbriefdokument ist keine Verknüpfung
zur Datenquelle mehr vorhanden. Dies entspricht der Einstellung aus «Daten einfügen als Text'.

Mit dem Serienbrief-Assistenten können entweder Briefe oder E-Mails entsprechend mit Daten aus
der Datenbank versorgt werden.

Serienbrieferstellung

12Das Einfügen des Adressblocks erfordert die umfangreichsten Einstellungen. Als Adressenliste
wird erst einmal die aktuell gewählte Abfrage oder Tabelle der aktuell gewählten Datenbank vorgeschlagen.
Unter Punkt 2 wird das prinzipielle Aussehen des Adressblocks festgelegt. Dieser Adressblock
kann entsprechend über den Button Mehr angepasst werden. Siehe hierzu die nächste Abbildung.
Punkt 3 dient dazu, den entsprechend angedeuteten Feldern aus dem Adressblock die richtigen
Felder aus der Datenbank zuzuweisen. Der Assistent erkennt zunächst einmal nur die Felder aus
der Datenbank, die genau so geschrieben wurden wie die Felder des Assistenten.
Unter Punkt 4 werden die Adressen angezeigt. Mit den Pfeiltasten können verschiedene Adressen
aus der Datenbank abgerufen werden. Bei der abgebildeten Adresse fallen 2 Elemente auf, dieeiner Nachbearbeitung bedürfen:••

Eine Anrede fehlt
Bis auf den Vornamen sind alle anderen Felder < noch nicht zugewiesen > , da die Benennung in der Datenbank anders ist als die Feldbenennungen, mit denen der Assistent zuerst
einmal arbeitet.

Um diese Fehler zu bearbeiten, muss zuerst der Adressblock aus Punkt 2 nachbearbeitet werden.

Serienbrieferstellung13

Im Hintergrund ist zu erkennen, dass bei der Nachbearbeitung zuerst einmal noch wieder eine
erweitere Auswahl von Adressblöcken präsentiert wird. Der passendste Adressblock wurde hierausgewählt und entsprechend bearbeitet.
Mit den Pfeiltasten werden Felder in den Adressblock übernommen bzw. aus dem Adressblock entfernt. Der Adressblock kann nicht direkt editiert werden. Stattdessen wird die Anordnung der Felderüber die auf der rechten Seite sichtbaren Pfeiltasten hergestellt.
Für die Adressanrede wurde einfach das Element «Anrede» eingefügt. Bis auf den Vornamen müssen jetzt noch alle anderen Felder entsprechend zugewiesen werden.
In unserem Fall muss auch das Element «Anrede» anders zugewiesen werden, da ein entsprechendes Feld mit etwas anderem Inhalt in der Abfrage existiert und hier aufgrund der Namensgleichheit als "Adressanrede" benutzt wird. Die "Adressanrede" für Rob lautet in der Abfrage derDatenbank «Herrn», die "Anrede" «Herr» für eine gegebenenfalls gesondert zu erstellende Anredezeile zum Beginn des Briefinhaltes.

Serienbrieferstellung

14

Hier wurden die Adresselemente aus dem Serienbriefassistenten erfolgreich entsprechenden Elementen aus der Abfrage der Datenbank zugeordnet. Als Vorschau dient weiterhin der erste Datensatz der Abfrage.

Serienbrieferstellung

15

Die wesentlichen Datenbankeinstellungen werden mit dem 4. Schritt eigentlich schon beendet.
Hier geht es lediglich darum, aus welchem Feld das Geschlecht des Adressaten abgelesen werdensoll. Dies war bereits so benannt, dass nur noch der Feldinhalt für den weiblichen Empfänger
gekennzeichnet werden musste.
Drei verschiedene Briefanreden werden so erzeugt. Alle mit einem 'w' versehenen Datensätze
starten mit 'Sehr geehrte Frau …', alle mit 'm' versehenen Datensätze mit 'Sehr geehrter Herr …' .
Ist kein Geschlecht angegeben, so wird schließlich 'Sehr geehrte Damen und Herren' gewählt.

Serienbrieferstellung

16

Hinweis

Die folgenden Schritte sind nur bis zur Version LO 5.1 vorhanden.

In der Regel ist das Dokument erst einmal eine Rohform, so dass es für den Gebrauch im Writernoch weiter bearbeitet werden kann. Dies kann im 6. Schritt erfolgen.

Serienbrieferstellung

17

Bisher sind alle Dokumente gleichlautend – bis auf die unterschiedlichen Inhalte, die aus derDatenbank gelesen werden. Dies kann in Schritt 7 geändert werden.

Das Ausgangsdokument ist das Dokument, in dem die Feldeigenschaften und die Verbindung
zur Datenbank gespeichert werden. Im Hintergrund ist währenddessen das Originaldokument desersten Datensatzes sichtbar, das in der Form verschickt würde. Dies wird als Serienbriefdokument
bezeichnet.
Erst wenn eine der Optionen durchgeführt wurde, in dem obigen Fall also das Ausgangsdokument
gespeichert wurde, kann der Serienbriefassistent beendet werden.

Erstellung von EtikettenÜber Dateien → Neu → Etiketten wird der Assistent zur Erstellung von Etiketten gestartet. Es öffnet
sich ein Fenster, das alle Formatierungs- und Inhaltsfragen zu den Etiketten abfragt, bevor die EtiErstellung von Etiketten

18ketten selbst erstellt werden. Die Einstellungen dieses Fensters werden in den persönlichen Einstellungen des Nutzers gespeichert.

Die Grundeinstellungen zum Inhalt werden im Reiter «Etiketten» erstellt. Wird hier statt Aufschriftüber das Markierfeld Adresse gewählt, so wird jedes Etikett mit dem gleichen Inhalt ausgefüllt, deraus den Einstellungen von LibreOffice zu dem Nutzer des Programms gelesen wird.
Als Beispieldatenbank dient hier wieder die Datenbank "Adressen". Auch wenn über dem nächsten
Selektionsfeld der Begriff «Tabelle» steht, werden hier Tabellen und Abfragen gelistet, wie sie im
Datenquellenbrowser verfügbar sind.
Über die Pfeiltasten werden die einzelnen Datenbankfelder in den Editor eingefügt. Die Bezeichnung für das Datenbankfeld "Nachname" wird hier zu<Adressen.Serienbriefabfrage.1.Nachname>. Die Reihenfolge ist also
<Datenbank.Tabelle.1.Datenbankfeld>.
In dem Editor kann mit der Tastatur gearbeitet werden. So ist es z. B. möglich, zu Beginn einen
Zeilenumbruch einzufügen, damit die Etiketten nicht direkt an der oberen Kante beschriftet werden,
sondern der Inhalt möglichst komplett und gut sichtbar gedruckt werden kann.
Das Format kann im Reiter «Etiketten» vorgewählt werden. Hier sind viele Etikettenmarken eingearbeitet, so dass meist keine weiteren Einstellungen im Reiter «Format» notwendig sind.

Erstellung von Etiketten

19In den Versionen 3.4.x bis 3.5.2 kann aufgrund einer Änderung der Grundeinstellungen im Etikettenassistenten ein Darstellungsfehler vorliegen, wenn die Etiketten
zusammen genau die gleiche Breite haben wie die Seitenbreite. Unter diesen Bedingungen rutscht das letzte Etikett einfach eine Zeile tiefer.

HinweisIn der Version 3.3.x wurde hier standardmäßig die Seitenbreite für DIN-A4-Etikettenbögen geringfügig von 21,00 cm auf 21,04 cm erweitert. Ein nachträgliches Erweitern der Seitenbreite bringt bei den aktuellen Etikettenbögen auch hier die Lösung.
In der Version 3.5.3 wurden deshalb im Reiter «Format» Seiteneinstellungen hinzugefügt.

Unter dem Reiter «Format» lässt sich eine genaue Einstellung der Etikettengröße vornehmen. Die
Einstellungen haben nur eine Bedeutung, wenn die Marke und der Typ nicht bekannt sind. Wichtig
ist hier bei Etiketten der Breite 7,00 cm, die Seitenbreite (hier: «Page Width») geringfügig größer
als 3*7,00 cm = 21,00 cm zu stellen. Erst dann werden 3 Etiketten nebeneinander auf einer Seite
ausgegeben.

Erstellung von Etiketten

20Unter dem Reiter «Zusätze» kann schließlich noch eingestellt werden, ob nur ein einzelnes Etikettoder eine ganze fortlaufende Seite erstellt werden soll. Die fortlaufende Seite wird dann, beginnend mit dem ersten Datensatz, mit Daten aus der Datenbank bestückt. Sind mehr Datensätze
vorhanden als auf eine Seite passen, so wird automatisch das nächste Blatt mit den fortlaufenden
Daten versehen.
Mit dem Markierfeld «Inhalte synchronisieren» werden alle Etiketten miteinander verbunden, so
dass die anschließenden Änderungen im Layout einer Etikette auf die anderen Etiketten übernommen werden. Um den editierten Inhalt zu übertragen, muss lediglich die eingeblendete Schaltfläche mit dem Aufdruck Synchronisieren betätigt werden.
Über den Button Neues Dokument wird schließlich ein Dokument mit Serienbrieffeldern erzeugt.
Mit dem Aufruf des Druckvorganges erscheint die folgende Nachfrage:

Erst wenn diese Nachfrage mit «Ja» beantwortet wird, werden die Adressdatenbank-Felder auch
mit einem entsprechenden Inhalt gefüllt.

Erstellung von Etiketten

21Ist die Abfrage ausgesucht und sind die entsprechenden Datensätze ausgewählt (hier: «Alle»), sokann mit dem Druck begonnen werden. Ratsam vor allem bei ersten Tests ist die «Ausgabe» ineine «Datei», die als ein Dokument gespeichert wird. Die Speicherung in mehrere Dokumente
dient hier nicht dem Etikettendruck, sondern dem Druck von Briefen an unterschiedliche Personen,die so separat nachbearbeitet werden können.

Serienbriefe und Etiketten direkt erstellen
Neben den Assistenten steht natürlich der Weg offen, durch möglichst direkte Interaktion Serienbriefe und Etiketten selbst zu erstellen.

Serienbrieffelder mit der Maus erstellen
Serienbrief-Felder können mit der Maus aus dem Datenbankbrowser heraus erstellt werden:

Der Tabellenkopf wird mit der linken Maustaste markiert. Die Maustaste wird gedrückt gehalten
und der Cursor in das Textdokument gezogen. Der Cursor verändert sein Symbol zu einem EinfüSerienbriefe und Etiketten direkt erstellen22gesymbol. In dem Textdokument wird schließlich das Serienbrieffeld eingefügt, das hier in derkompletten Beschreibung über Ansicht → Feldname sichtbar gemacht wurde.
Auch aus einer nicht angemeldeten Datenbank heraus können Serienbrieffelder mit der Maus
direkt erstellt werden. Hierzu muss die Datenbank neben dem Writer-Dokument geöffnet sein. Ist
eine Tabelle oder Abfrage ausgewählt, so wird mit der linken Maustaste der jeweilige Tabellenkopf
markiert und in das Writer-Dokument hinüber gezogen. Der Ablauf entspricht also dem im vorherigen Abschnitt geschilderten Vorgehen.

Serienbrieffelder über Feldbefehle erstellen
Serienbrief-Felder können über Einfügen → Feldbefehl → Weitere Feldbefehle → Datenbank eingefügt
werden.

Hier stehen in der gewählten Datenbank alle Tabellen und Abfragen zur Verfügung. Über den Button Einfügen können nacheinander die verschiedenen Felder direkt in den Text an der momentanen Cursorposition eingebunden werden.
Soll, wie im Serienbrief, eine Anrede erstellt werden, so kann dies mit Hilfe eines versteckten
Absatzes oder versteckten Textes funktionieren: Einfügen → Feldbefehl → Andere → Funktionen →Versteckter Absatz. Bei beiden Varianten ist zu beachten, dass die Bedingung, die formuliert wird,
nicht erfüllt sein darf, damit der Absatz erscheint.
Damit die Formulierung 'Sehr geehrte Frau <Nachname>,' nur dann erscheint, wenn die Person
weiblich ist, reicht als Bedingung[Adressen.Serienbriefabfrage.Geschlecht] != "w".

Serienbriefe und Etiketten direkt erstellen

23Nur kann es jetzt noch passieren, dass kein Nachname existiert. Unter diesen Umständen sollte
dort stattdessen 'Sehr geehrte Damen und Herren,' erscheinen. Also ist diese Bedingung hinzuzufügen. Insgesamt ergibt das die Bedingung:[Adressen.Serienbriefabfrage.Geschlecht] != "w" OR NOT [Adressen.Serienbriefabfrage.Nachname]
Damit ist schließlich ausgeschlossen, dass der Absatz erscheint, wenn die Person nicht weiblich istoder kein Nachname eingetragen wurde.
Entsprechend kann mit den Eintragungen für das männliche Geschlecht und für fehlende Eintragungen für die beiden verbleibenden Anreden verfahren werden.
Auf die gleiche Art und Weise kann natürlich auch eine Anrede im Adressfeld erstellt werden,
soweit eben das Geschlecht angegeben wurde.
Weitere Informationen hierzu in der Hilfestellung unter dem Titel «Versteckter Text» bzw. «Bedingter Text».
Noch einfacher wäre es natürlich für Personen mit Datenbankkenntnissen, die gesamte Anredebereits in der Abfrage zu hinterlegen. Dies ist über eine Korrelierte Unterabfrage (Kapitel Abfragen)möglich.
Für Etiketten besonders interessant ist der Feldtyp «Nächster Datensatz». Wird dieser Feldtyp am
Schluss einer Etikette gewählt, so wird die nächste Etikette mit dem darauffolgenden Datensatz
gefüllt. Typische Etiketten für den fortlaufenden Etikettendruck sehen also wie im folgenden Bildaus, wenn über Ansicht → Feldnamen die entsprechenden Bezeichnungen sichtbar gemacht werden:

Abbildung 8: Feldbefehle für Etiketten mit fortlaufendem Inhalt
Bei der letzten Etikette auf der Seite ist allerdings darauf zu achten, dass hier der nächste Datensatz schon automatisch mit dem Seitenumbruch aufgerufen wird. Dort darf also der Feldtyp«Nächster Datensatz» nicht erscheinen. Sonst fehlt ein Datensatz, weil ein doppelter Datensatzsprung enthalten ist.
Das Erstellen von Serienbriefen ist auch direkt im Formular einer Datenbank möglich. Voraussetzung ist lediglich, dass die Datenbank in LibreOffice registriert wird.

Tipp

Beim Erstellen der Serienbriefe sollte allerdings darauf geachtet werden, dassAnsicht → Drucklayout gewählt wird. Dadurch ist sichergestellt, dass die Elementeanschließend auch an der korrekten Position auf dem Blatt erscheinen. Wird ein so
erstelltes Formular gedruckt, so erscheint die übliche Serienbriefabfrage.
Serienbriefe dieser Art haben den Vorteil, dass neben der *.odb-Datei keine weiteren
Dateien für den Druck existieren müssen.

Externe Formulare
Sollen einfache Formulareigenschaften unter LibreOffice in anderen Programmteilen wie Writer
und Calc genutzt werden, so reicht es aus, über Ansicht → Symbolleisten → Formularentwurf die
Externe Formulare24Formularentwurfsleiste anzeigen zu lassen, den «Formularnavigator» zu öffnen und ein Formularzu gründen oder, wie im Kapitel «Formulare» beschrieben, eine Formulargründung über ein Formularfeld. Es erscheint bei den Eigenschaften unter dem Reiter «Daten» ein etwas anderer Aufbau
als bei Formularen direkt in der Datenbankdatei *.odb:

Abbildung 9: Formular mit einer externen ...

Abbildung 10: ... und einer internen Datenquelle.
Lediglich die «Datenquelle» muss bei externen Formularen zusätzlich ausgewählt werden.
Geschieht dies mit dem Button «...
...»rechts von dem Listenfeld zur Datenquelle, so wird der Dateibrowser geöffnet. Eine beliebige *.odb-Datei kann ausgewählt werden. Anschließend steht in dem
Feld zur Datenquelle ein Link, der mit der Bezeichnung «file:///» beginnt.
Wird stattdessen nur im Listenfeld gesucht, so stehen dort die bereits in LibreOffice registrierten
Datenbanken unter dem registrierten Namen zur Verfügung.
Die Formulare werden im Weiteren dann genau so erstellt wie unter Base selbst. Zur Formularerstellung gilt daher das Gleiche wie unter Base.
Die so erstellten Formulare werden standardmäßig bei jedem neuen Öffnen der Datei im Bearbeitungsmodus und nicht, wie in Base, schreibgeschützt geöffnet. Um eine versehentliche Änderungdes Formulars zu vermeiden kann über Datei → Eigenschaften → Sicherheit die Datei schreibgeschützt geöffnet werden. Das Formular kann hier sogar mit einem Passwort gegen Veränderungengeschützt werden. Auf Betriebssystemebene lässt sich letztlich auch die ganze Datei als schreibgeschützt deklarieren. Dann sind immer noch die Eingaben in die Formularfelder möglich, abernicht mehr das Verschieben der Felder oder eine Texteingabe zwischen den Feldern.
Das Erstellen von Formularen kann auch im Schnellverfahren durch Ziehen und
Ablegen erfolgen. Dafür ist die Datenbank zu öffnen, die Tabelle bzw. Abfrage aufzusuchen und der jeweilige Tabellenkopf zu markieren.

Tipp

Für den Writer gilt: Mit der linken Maustaste markieren, ShiftShift und Strg-Taste
Strg
gedrückt halten, so dass ein Verknüpfungssymbol als Mauscursor erscheint, in das
Writerdokument ziehen.
Bei Calc-Dateien muss ohne Zuhilfenahme zusätzlicher Tasten in das Calc-Dokument gezogen werden. Dort erscheint das Kopiersymbol als Mauscursor.
In beiden Fällen wird ein Eingabefeld sowie ein dazugehöriges Beschriftungsfeld mit
der Bezeichnung des Feldnamens erzeugt. Beim ersten Einfügen wird gleichzeitig
die Verbindung zur Datenquelle erstellt. So kann direkt nach dem Ziehen und Ablegen mit der Eingabe von Daten in diesem Formular begonnen werden.

Externe Formulare

25

Tipp

Vorsicht

Sind bereits in Base Formulare erstellt worden, so können sie aus Base heraus als
externe Formulare abgespeichert werden. Es muss dann lediglich noch die Verbindung zur Datenbank erstellt werden und die Formulare funktionieren außerhalb der*.odb-Datei. Sollten Makros in den Formularen genutzt worden sein, so ist hiernatürlich auch eine Anpassung notwendig.
Die Nutzung von externen Formularen kann in Zusammenhang mit FIREBIRD zu
Datenverlusten führen. Die Firebird Datenbank benötigt auch in LO 7.1 immer nochdie Sicherung der Daten über das Speicher-Symbol der Datenbankdatei.
Nur mittels Makro kann diese Sicherung auch bei externen Formularen erfolgen.
Dabei sollte das Makro an die Eigenschaft "Nach der Datensatzaktion" gebunden
werden:SUB DataSave(oEvent AS OBJECT)oEvent.Source.activeConnection.Parent.flush
END SUB

Vorteil externer Formulare
Base muss nicht erst geöffnet werden, um mit der Datenbank zu arbeiten. Im Hintergrund ist also
nicht immer ein weiteres Fenster geöffnet.
Bei einer fertigen Datenbank können anderen Nutzern der Datenbank anschließend verbesserte
Formulare problemlos zugesandt werden. So können sie während der Entwicklung weiterer Formulare die Datenbank weiter nutzen und müssen nicht, für Außenstehende kompliziert, Formulare
aus einer Datenbank in eine andere kopieren.
Formulare zu einer Datenbank können je nach Nutzer der Datenbank unterschiedlich sein. Nutzer,
die keine Datenkorrekturen und Neueingaben tätigen, können von anderen Nutzern den jeweils
aktuellen Datenbestand zugesandt bekommen und einfach die *.odb-Datei austauschen, um einen
aktuellen Bestand zu haben. Dies könnte z.B. bei einer Datenbank für Vereine sinnvoll sein, wo
alle Vorstandsmitglieder die Datenbank erhalten, aber nur eine Person Daten letztlich bearbeitet,
die anderen aber einen Blick auf die Adressen ihrer jeweiligen Abteilung haben.
Über externe Formulare ist der Zugriff und die Bearbeitung von Inhalten mehrerer Datenbanken
möglich. Die unterschiedlichen Datenbanken brauchen nur im jeweiligen Neben- oder Unterformular selbst angegeben zu werden. Auch der Zugriff auf mehrere externe Datenbanken wie z.B. eine
Datenbanksammlung unter MySQL/MariaDB ist damit möglich.

Nachteil externer Formulare
Andere Nutzer müssen immer Formulare und Base in der gleichen Verzeichnisstruktur installieren.
Nur so kann der einwandfreie Kontakt zur Datenbank hergestellt werden. Sind die Datenbanken
angemeldet, so muss allerdings lediglich der Anmeldename übereinstimmen.
Nur die Formulare sind extern erstellbar, nicht aber Abfragen und Berichte. Ein einfacher Blick aufeine Abfrage muss also über ein Formular erfolgen. Als Darstellung eignet sich da sicher das
Tabellenkontrollfeld ganz gut. Ein Bericht hingegen erfordert die Öffnung der Datenbank. Dies kannauch über Makros mit einem Druck von Berichten aus einem externen Formular heraus erfolgen.
Alternativ dazu kann er zumindest teilweise mit Hilfe von Serienbrieffeldern nachgestellt werden.
Zu weiteren Druckmöglichkeiten siehe auch das entsprechende Beispieldatenbankpaket «Serienbrief».

Externe Formulare

26

Datenbanknutzung in Calc
Daten können in Calc zu Berechnungszwecken genutzt werden. Dazu ist es notwendig, die Datenzuerst in einem Tabellenblatt von Calc verfügbar zu machen.

Daten in Calc einfügen
Daten lassen sich aus der Datenbank auf verschiedene Weisen in Calc einfügen:Die Tabelle wird ausgewählt, mit der linken Maustaste markiert und in ein Tabellenblatt von Calc
hereingezogen. Mit dem Cursor wird die linke obere Ecke der Tabelle festgelegt. Die Tabelle wird
mit Feldbezeichnungen erstellt. Der Datenquellen-Browser bietet hier nicht erst «Daten in Text»
oder «Daten in Felder» an.
Die so nach Calc hereingezogenen Daten weisen die folgenden Eigenschaften auf:
Nicht nur die Daten werden importiert, sondern auch die Eigenschaften der Felder werden ausgelesen und beim Import beachtet. Felder wie z.B. die Hausnummern, die als Textfelder deklariert
wurden, werden auch als Text formatiert in Calc eingefügt.
Der Import wird direkt als Bereich eingefügt. Ihm wird standardmäßig der Name Import1 zugewiesen. Über diesen Bereich können die Daten später angesprochen werden. Über Daten → Bereichaktualisieren wird der Bereich gegebenenfalls einem neuen Datenstand aus der Datenbank heraus
angepasst.
Werden einzelne Datenzeilen oder die komplette Tabelle in der Datenansicht markiert, so kann derBereich auch über einen Klick auf «Daten in Text» aktualisiert werden. Hierbei werden dann nur
die markierten Zeilen der Tabelle neu geschrieben. Alle anderen Zeilen werden aus der Tabelle inCalc entfernt.

Datenbanknutzung in Calc

27

Die hereingezogenen Daten sind nicht weiter formatiert als es den Eigenschaften der Datenbankfelder entspricht.

Auch über das Kontextmenü der Tabelle kann eine Kopie der Daten erfolgen. Hier wird allerdings
kein Importbereich erzeugt, sondern eine Kopie. Die Eigenschaften der Datenfelder werden nicht
ausgelesen, sondern von Calc analysiert. Außerdem werden die Feldbezeichnungen als Tabellenköpfe vorformatiert.

Datenbanknutzung in Calc

28

Die Unterschiede zeigen sich besonders bei Feldern, die in der Datenbank als Text formatiert sind.
Beim Import macht Calc daraus Textfelder und setzt Zahlen, die es sonst auch als Zahlen interpretieren würde, ein Hochkomma ('137) voran. Mit diesen Zahlen kann also nicht direkt weiter
gerechnet werden.
Bei einem eventuellen Export wird das Hochkomma allerdings wieder entfernt, so dass die Daten
letztlich in der gleichen Art bestehen bleiben.
Importierte Daten können natürlich im Nachhinein formatiert werden. Hierzu wird der importierte
Bereich komplett markiert und dann über Format → AutoFormat Vorlagen weiter formatiert:

Diese Formatierung bleibt erhalten, wenn unter Daten → Bereich festlegen die folgenden Angaben
gemacht werden:

Datenbanknutzung in Calc

29

Die Einstellungen müssen aufgeklappt werden. Dann sollte Formatierung beibehalten ausgewählt
werden. Zusätzlich ist noch sinnvoll, Importierte Daten nicht speichern zu wählen, wenn eine automatische Abfrage der Daten bei jedem Programmstart erfolgen soll. Dabei werden im übrigen auchDaten aufgenommen, die neu hinzugefügt werden. In sofern ist der Eintrag in Umfang nur derStartbereich. Es erfolgt automatisch eine Erweiterung des Bereiches nach unten.

Tipp

Der Import von Daten nach Calc überschreibt den vorherigen Inhalt – und auch die
eventuell bereits erledigten Formatierungen, die anschließend direkt für einzelene
Felder erfolgt sind. Werden beständig in die gleiche Tabelle Daten exportiert, so
empfiehlt es sich, ein separates Tabellenblatt für den Datenimport zu nutzen. Die
Daten werden dann über den Bezug Tabellenname.Feldbezeichnung in einem anderen Tabellenblatt ausgelesen. Die Felder in diesem Tabellenblatt können beliebig
vorformatiert werden, ohne dass das Format überschrieben wird.

Datenbanknutzung in Calc

30

Tipp

Vorsicht

Daten können auch direkt aus der Datenbank über die Zwischenablage oder überZiehen und Ablegen mit der Maus kopiert werden. Wird eine Tabelle oder Abfrage in
ein Calc-Blatt gezogen, so wird der gesamte Inhalt eingefügt. Wird die Tabelle oder
Abfrage geöffnet und ein oder mehrere Datensätze markiert, so werden nur dieseDatensätze zusammen mit den Feldnamen beim Ziehen kopiert.
Kopien über die Zwischenablage werden in Calc so übernommen, wie sie in derDatenquelle sichtbar sind. Tabellenköpfe werden als Feldbezeichner hervorgehoben,
Zahlen mit der Anzahl an Nachkommastellen übernommen, die in Base angezeigt
werden.
Kopien über Drag-and-Drop transportieren den tatsächlichen Inhalt der Datenquelle,also auch z.B. Nachkommastellen von Zahlen, die zur Zeit in der Datenquelle nicht
zu sehen, wohl aber vorhanden sind. (Bug 112023)

Daten aus Calc in eine Datenbank exportieren
Die Daten werden in dem Tabellenblatt von Calc markiert. Die linke Maustaste wird gedrückt undauf den Tabellenbereich der gewünschten Datenbank im Datenbankbrowser gezogen.

Datenbanknutzung in Calc

31

Der Cursor verändert sein Symbol und deutet an, dass etwas hinzugefügt werden kann.
Es öffnet sich das erste Fenster des Importassistenten. Die weiteren Schritte mit dem Assistenten
sind im Kapitel «Tabellen» im Abschnitt «Import von Daten aus anderen Datenquellen» beschrieben.
Der Transport der Daten aus einer Calc-Tabelle in eine Datenbank läuft nicht in der
gleichen Weise ab wie der Transport von Daten aus einer Datenbank zu einer anderen Datenbank.

HinweisDer oben beschriebene Weg führt z.B. dazu, dass Zeilenumbrüche in Feldern derTabelle nicht in die Tabelle der Datenbank übernommen werden (Bug 117436) . Wird
stattdessen die Calc-Datei als Datenquelle für eine Datenbank genommen, so kannvon dieser Datenbank aus zu einer internen HSQLDB-Datenbank der Tabelleninhalt
mit Zeilenumbruch kopiert werden.

Daten von einer Datenbank zu einer anderen konvertieren
Im Explorer des Datenquellenbrowsers können Tabellen von einer Datenbank zur anderen kopiertwerden, indem die Quelltabelle mit der linken Maustaste markiert wird, die Taste dann gedrückt
gehalten wird und über dem Tabellencontainer der Zieldatenbank losgelassen wird. Es erscheint
dann der Dialog zum Kopieren von Tabellen.
Auf diese Weise können beispielsweise Datenbanken, die sonst nur gelesen werden können
(Datenquelle z.B. ein Adressbuch aus einem Mailprogramm oder eine Tabellenkalkulationstabelle),
als Grundlage für eine Datenbank genutzt werden, die anschließend auch schreibend auf die
Daten zugreift. Auch können beim Wechsel eines Datenbankprogramms (z.B. von PostgreSQL zu
MySQL) die Daten direkt kopiert werden.
Wird erwünscht, dass die neue Datenbank andere Relationen aufweisen soll als die alte Datenbank, so kann dies durch entsprechende Abfragen in der Datenbank realisiert werden. Wer darin
nicht so firm ist, kann stattdessen Calc nutzen. Hier werden die Daten in ein Tabellenblatt gezogen
und anschließend mit Hilfe von Calc für den Import in die Zieldatenbank vorbereitet.
Für einen möglich sauberen Import in eine neue Datenbank sollten die Tabellen der neuen Datenbank vorher erstellt werden. So können Formatierungsprobleme und Probleme bei der Erstellung
von Primärschlüsseln rechtzeitig erkannt werden.

Daten über die Zwischenablage in eine Tabelle einfügen
Sind Daten in Tabellenform vorhanden, so können diese über die Zwischenablage und den Assistenten in Base eingefügt werden.
Wird in Base mit einem rechten Mausklick auf die Zieltabelle der Einfügevorgang begonnen, so
erscheinen in dem Kontextmenü der Maus unter «Kopieren» die Befehle «Einfügen» und «Inhalte
einfügen …». Wird hier «Einfügen» gewählt, so ist beim Importassistenten die entsprechende
Tabelle sowie das Anhängen von Daten bereits vorgewählt. «Inhalte einfügen …» schaltet hierlediglich eine Abfrage für einen Importfilter vor. Hier steht «HTML» und «RTF» zur Verfügung.
Wird stattdessen nur in den Tabellencontainer mit der rechten Maustaste geklickt, so erscheint der
Importassistent mit der entsprechenden Wahl einer neuen Tabelle.

Daten über die Zwischenablage in eine Tabelle einfügen32Datenimport aus PDF-Formularen
Wer Daten aus verschiedenen Quellen von außen her importieren will, sollte am besten eine Formularstruktur wählen, die bei der Eingabe der Daten nicht weiter verändert werden kann. Mit Hilfe
des Writers lassen sich solche PDF-Formulare erstellen, im Internet verteilen und entsprechend
z.B. als E-Mail-Anhang ausgefüllt zurückschicken. Fehlt schließlich nur noch der möglichst einfache Import in die Base-Datenbank. Das Beispiel1 soll so eine Importmöglichkeit aufzeigen.

Erstellen eines PDF-Formulars
Ein PDF-Formular wird als externes Formular ohne Datenbankanbindung erstellt. Über Ansicht →Symbolleisten → Formular-Steuerelemente werden die notwendigen Elemente für das Formularangezeigt und können entsprechend eingefügt werden.
Leider werden im PDF-Formular keine Unterschiede zwischen Zahlenfeldern, Datumsfeldern und
Textfeldern gemacht. Für das beigefügte Beispiel reicht es also völlig aus, bei jedem Eingabefeld
ein Textfeld aufzuziehen. Weitere Feldformatierungen des Writer-Formulars gehen bei dem Exportin ein PDF-Formular zwangsläufig verloren.
Grundsätzlich ermöglichen PDF-Formulare nur die folgenden Formularfelder:
•
•
•
•
•

1

Schaltfläche
Textfeld
Checkbox
Combobox und
Listbox

Die Datenbank «Beispiel_PDFFormular_Import.odb» zu diesem Bericht ist den Beispieldatenbanken fürdieses Handbuch beigefügt.

Datenimport aus PDF-Formularen

33

Das Testformular enthält insgesamt 4 Textfelder. In Eigenschaften: Textfeld → Allgemein → Name soll
für den folgenden Importmodus die jeweilige Bezeichnung gewählt werden, die auch in der Tabelle
der Datenbank als Feldname vorgesehen ist. Dadurch kann einwandfrei Feldname und Feldinhalt
zugeordnet werden.
Hilfetexte werden zwar beim Auslesen der Daten mit angezeigt, erscheinen allerdings wohl nicht injedem *pdf-Viewer.

HinweisDer Acrobat Reader hat mit der voreingestellten Standard-Schriftart der Felder Probleme. Hier sollte eine weit verbreitete Schriftart wie Arial gewählt werden. Ist die in
den Eingabefeldern definierte Schriftart nicht auf dem System vorhanden, so weigert
sich der Acrobat Reader, eine Eingabe in den Feldern zu ermöglichen.
Der Fehler liegt auch darin begründet, dass LibreOffice die Schriftarten, die in den
Formularfeldern benutzt werden, nicht mit exportiert.

Damit das Formular die Daten anschließend auch enthält, ist nach der Dateneingabe über Datei →Speichern unter im PDF-Viewer eine Speicherung der Datei vorzunehmen. Dieser Befehl kann vonViewer zu Viewer unterschiedlich sein. Ohne diese Maßnahme zeigt der Viewer die Daten nachdem Öffnen des Formular auf dem eigenen Rechner zwar an, liest sie aber wohl aus den temporären Dateien des Viewers, nicht aus der *.pdf-Datei direkt. Das Formular bleibt dann beim Transportvon einem Rechner auf einen anderen leer.

Auslesen der Daten aus dem PDF-Formular
Das Formular der Base-Datenbank sieht recht einfach aus. Es ist mit der Tabelle verbunden undzeigt die gerade eingelesenen Daten an. Dabei sind die jüngsten Einträge in dem Tabellenkontrollfeld oben zu sehen.

Das Makro zum Einlesen der Daten wird unter Eigenschaften : Schaltfläche → Ereignisse → Aktion ausführen eingetragen.
Zum Auslesen der Daten wird hier auf das OpenSource-Programm «pdftk» zurückgegriffen. Das
Programm ist auf jeden Fall frei für Linux und Windows erhältlich. Linux-Distributionen haben meist
bereits ein Paket in den Repositories. Windows-User finden das Programm hier: https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ .
Unter Linux geht das Auslesen der Daten mit dem folgenden Befehl:
for i in *.pdf ; do pdftk "$i" dump_data_fields_utf8 >> auswertung.txt ; done

Wird der Befehl liest aus der im gleichen Verzeichnis liegenden *.pdf-Datei die Daten in eine
Textdatei mit der Bezeichnung «auswertung.txt».
Die mit «pdftk» ausgelesenen Daten werden in eine Textdatei geschrieben, die wie folgt aussieht:

Datenimport aus PDF-Formularen

34

Für jedes Feld sind in der Textdatei 5 Zeilen enthalten. Für die Auswertung im Makro sind die Zeilen «FieldName» (Feldname auch in der Zieltabelle), «FieldValue» (Inhalt des Feldes nach Abspeicherung der *.pdf-Datei) sowie «FieldJustification» (letzte Zeile, die einen Feldeintrag beendet) von
Bedeutung.
Der gesamte Import wird über Makros geregelt. Hier muss das PDF-Formular im gleichen Pfad wie
die Datenbank abgelegt werden. Die Daten werden in die Textdatei ausgelesen und aus dieser
Textdatei wieder eingelesen. Dies geschieht so oft, wie *.pdf-Dateien mit Formulardaten in dem
Verzeichnis liegen. Alte Dateien sollten also tunlichst aus dem Verzeichnis entfernt werden, denn
die Funktion überprüft nicht auf Duplikate.
SUB PDF_Form_Import(oEvent AS OBJECT)
DIM inNumber AS INTEGER
DIM stRow AS STRING
DIM i AS INTEGERDIM k AS INTEGERDIM oDatasource AS OBJECTDIM oConnection AS OBJECTDIM oSQL_Command AS OBJECTDIM oResult AS OBJECT
DIM stSql AS STRING
DIM oDB AS OBJECTDIM oFileAccess AS OBJECT
DIM inFields AS INTEGER
DIM stFieldName AS STRING
DIM stFieldValue AS STRING
DIM stFieldType AS STRING
DIM stDir AS STRING
DIM stDir2 AS STRING
DIM stPDFForm AS STRING
DIM stFile AS STRING
DIM stTable AS STRING
DIM inNull AS INTEGER
DIM aFiles()DIM aNull()
DIM stCommand AS STRING
DIM stParameter AS STRING
DIM oShell AS OBJECT

Nach der Deklaration der Variablen wird die Anzahl der Felder angegeben, die das PDF-Formular
enthält. Die Zählung beginnt hier mit 0. Beim Wert '3' sind also insgesamt 4 Felder in dem Formu-

Datenimport aus PDF-Formularen

35lar vorhanden. Mit Hilfe dieser Zählung wird ermittelt, wann alle Daten für einen Datensatz ausgelesen wurden, so dass die Daten in die Tabelle der Datenbank übergeben werden können.
inFields = 3
stTable = "Name"oDatasource = ThisComponent.Parent.CurrentController
If NOT (oDatasource.isConnected()) THEN
oDatasource.connect()
END IFoConnection = oDatasource.ActiveConnection()oSQL_Command = oConnection.createStatement()

Die Datenbankverbindung wurde ermittelt. Anschließend wird der Pfad zu der bestehenden Datenbankdatei im Dateisystem ausgelesen. Mit Hilfe dieses Pfades wird in dem Array aFiles derInhalt des Verzeichnisses ermittelt. Für jede der Dateien des Verzeichnisses wird in einer Schleife
nachgesehen, ob die Dateiendung «.pdf» lautet. Groß- und Kleinschreibung sind hier egal, da das
Ergebnis der Suche über LCase direkt in Kleinschreibung umgesetzt wird.
oDB = ThisComponent.Parent
stDir = Left(oDB.Location,Len(oDB.Location)-Len(oDB.Title))
oFileAccess = createUnoService("com.sun.star.ucb.SimpleFileAccess")
aFiles = oFileAccess.getFolderContents(stDir, False)
FOR k = 0 TO uBound(aFiles())
IF LCase(Right(aFiles(k),4)) = ".pdf" THEN
stDir2 = ConvertFromUrl(stDir)
stPDFForm = ConvertFromUrl(aFiles(k))

Um das Kommando für das Auslesen betriebssystemspezifisch adressieren zu können, muss derursprünglich mit file:// beginnende Pfadname dem jeweiligen System angepasst werden. Das
Startkommando für das Programm «pdftk» ist abhängig vom Betriebssystem entweder mit dem
Zusatz «.exe», vielleicht sogar mit dem gesamten Pfad zum Programm wie z.B. «C:\Program Files(x86)\pdftk\pdftk.exe», oder eben ohne Zusatz zu versehen. Über GetGuiType wird der Systemtyp ermittelt, wobei '1' für Windows, '3' für MAC und '4' für Unix/Linux steht. Im folgenden wird nur
zwischen Windows und allen anderen Systemen unterschieden.
Im Anschluss daran gibt de Befehl Shell() die Startinformationen für pdftk an die Konsole weiter. Über die Angabe von True wird dabei geregelt, dass LibreOffice wartet, bis der Shell-Prozess
beendet wird.
IF GetGuiType = 1 THEN '()stCommand = "pdftk.exe"
ELSE
stCommand = "pdftk"
END IF
stParameter = stPDFForm & " dump_data_fields_utf8 output "& stDir2 & "PDF_Form_Data.txt"
Shell(stCommand,0,stParameter,True)
stFile = stDir & "PDF_Form_Data.txt"
i = -1
inNumber = FreeFile

Mit der Funktion FreeFile wird ermittelt, welchen freien Datenkanal das Betriebssystem alsnächstes zur Verfügung stellen wird. Dieser Datenkanal wird als eine Integerziffer ausgelesen unddirekt zur Öffnung der gerade erstellten PDF-Datendatei genutzt. Die Datei wird über INPUT ausgelesen. Dies ist aus Sicht von LibreOffice gesehen. Daten von außerhalb werden in das Programm LibreOffice eingelesen.
OPEN stFile FOR INPUT AS inNumber
DO WHILE NOT Eof(inNumber)LINE INPUT #inNumber, stRow

Zeile für Zeile wird die PDF-Datendatei jetzt ausgelesen. Taucht der Begriff «FieldName: » auf, so
entspricht der folgende Inhalt der Zeile der Bezeichnung des Feldes im PDF-Formular und durch
die Definition des Formulars auch der Bezeichnung des Feldes in der Datenbanktabelle, in die derInhalt geschrieben werden soll.

Datenimport aus PDF-Formularen

36Alle Feldnamen werden direkt für den späteren SQL-Befehl zusammengefasst. Das bedeutet, dassdie Feldnamen mit doppelten Anführungszeichen versehen und durch Kommas voneinander
getrennt werden.
Zu jedem Feldnamen wird außerdem durch eine Abfrage ermittelt, um welchen Feldtyp der Tabelle
es sich hierbei handelt (HSQLDB, SQL-Code für Firebird siehe Anhang). Datumswerte und Dezimalzahlen müssen anders weiter gegeben werden als Texte.
IF instr(stRow, "FieldName: ") THEN
IF stFieldName = "" THEN
stFieldName = """"+mid(stRow,12)+""""ELSE
stFieldName = stFieldName & ",""" + mid(stRow,12)+""""END IF
stSql = "SELECT TYPE_NAME FROM INFORMATION_SCHEMA.SYSTEM_COLUMNSWHERE TABLE_NAME = '" + stTable + "' AND
COLUMN_NAME = '" + mid(stRow,12) + "'"oResult = oSQL_Command.executeQuery(stSql)
WHILE oResult.next
stFieldType = oResult.getString(1)WEND
END IF

Der SQL-Code für FIREBIRD ist hier leider wesentlich komplizierter, das FIREBIRD in den
Systemtabellen die Feldtypen nicht benennt, sondern nur numerisch aufführt:HinweisstSql = "SELECT TRIM(CASE ""b"".RDB$FIELD_TYPE||'|'||
COALESCE(""b"".RDB$FIELD_SUB_TYPE,0) "+ _"WHEN '7|0' THEN 'SMALLINT' "+ _"WHEN '8|0' THEN 'INTEGER' "+ _"WHEN '8|1' THEN 'NUMERIC' "+ _"WHEN '8|2' THEN 'DECIMAL' "+ _"WHEN '10|0' THEN 'FLOAT' "+ _"WHEN '12|0' THEN 'DATE' "+ _"WHEN '13|0' THEN 'TIME' "+ _"WHEN '14|0' THEN 'CHAR' "+ _"WHEN '16|0' THEN 'BIGINT' "+ _"WHEN '35|0' THEN 'TIMESTAMP' "+ _"WHEN '37|0' THEN 'VARCHAR' "+ _"WHEN '261|0' THEN 'BLOB' "+ _"WHEN '261|1' THEN 'BLOB Text' "+ _"WHEN '261|2' THEN 'BLOB BLR' "+ _"WHEN '261|3' THEN 'BLOB ACL' "+ _"END) AS ""SQL_Datentyp"" "+ _"FROM RDB$RELATION_FIELDS AS ""a"", RDB$FIELDS AS ""b"" "+ _"WHERE ""a"".RDB$FIELD_SOURCE = ""b"".RDB$FIELD_NAME "+ _"AND ""a"".RDB$RELATION_NAME = '" + stTable + "' "+ _"AND ""a"".RDB$FIELD_NAME = '" + mid(stRow,12) + "'"Wie bei den Feldnamen wird auch bei den Werten verfahren. Sie dürfen allerdings nicht in doppelten Anführungszeichen weitergegeben werden, sondern müssen für den SQL-Code entsprechendvorbereitet werden. So muss Schrift in einfache Anführungszeichen gesetzt werden, Datumsangaben SQL-konform umgewandelt werden usw. Dies geschieht durch die extra ausgelagerte Funktion SQL_Value.
IF instr(stRow, "FieldValue: ") THEN
IF stFieldValue = "" THEN
stFieldValue = SQL_Value(mid(stRow,13), stFieldType)
ELSE
stFieldValue = stFieldValue & "," &SQL_Value(mid(stRow,13), stFieldType)END IF
END IF

Datenimport aus PDF-Formularen

37

Taucht der Begriff «FieldJustification:» auf, so ist das Ende einer Kombination von Feldbezeichnung und Feldwert erreicht. Der Zähler i, der anschließend mit der vorher angegebenen Anzahl
der Felder inFields verglichen werden soll, wird um '1' heraufgesetzt.
Wenn schließlich i und inFields gleich ist wird der SQL-Befehl zusammengestellt. Allerdingssoll vermieden werden, dass leere Datensätze bei leeren Formularen entstehen. Deshalb wird vorher nachgesehen, ob die Werte aller Felder NULL sind. Ist dies der Fall, so wird kein SQL-Befehl
ausgelöst. Ansonsten wird der Datensatz in die Tabelle "Name" eingefügt. Anschließend werden
die Variablen wieder auf ihre Standardwerte zurückgesetzt und das nächste PDF-Formular kannausgelesen werden.
IF instr(stRow, "FieldJustification:") THENi = i + 1
END IFIF i = inFields THEN
aNull = Split(stFieldValue,",")FOR n = 0 TO Ubound(aNull())
IF aNull(n) = "NULL" THEN inNull = inNull + 1
NEXT
IF inNull < inFields THEN
stSql ="INSERT INTO """ + stTable + """(" + stFieldName + ")"stSql = stSql + "VALUES (" + stFieldValue + ")"oSQL_Command.executeUpdate(stSql)
END IFstFieldName = ""stFieldValue = ""stFieldType = ""i = -1
inNull = 0
END IFLOOP
CLOSE inNumber

Zum Schluss der Prozedur bleibt schließlich eine Datei «PDF_Form_Data.txt» übrig. Diese Datei
wird gelöscht. Anschließend wird das Formular neu geladen, damit die eingelesenen Daten direkt
angezeigt werden können.
Kill(stFile)END IFNEXT
oEvent.Source.Model.Parent.reload()
END SUB

Enthält ein Text ein einfaches Anführungszeichen «'», so wird es beim Einfügen in SQL als Endedes Textes angesehen. Der SQL-Code für den Insert-Befehl scheitert, wenn anschließend noch
Text folgt, der nicht in einfachen Anführungszeichen steht. Um dies zu vermeiden muss jedes einfache Anführungszeichen innerhalb des Textes mit einem weiteren einfachen Anführungszeichen
maskiert werde. Das erledigt die Funktion String_to_SQL.
FUNCTION String_to_SQL(st AS STRING) AS STRING
IF InStr(st,"'") THEN
st = Join(Split(st,"'"),"''")END IF
String_to_SQL = stEND FUNCTION

Die Datumsangabe in einem PDF-Formular wird als Text ausgelesen. Sie kann nicht vorher auf
korrekte Eingabe kontrolliert werden.
In der deutschen Schreibweise werden Tag, Monat und Jahr voneinander häufig durch einen Punkt
getrennt. Dabei kann die Tagesangabe und die Monatsangabe einstellig oder zweistellig, die Jahresangabe zweistellig oder vierstellig sein.
Für den SQL-Code muss die Datumsangabe beginnend mit der vierstelligen Jahreszahl in dem folgenden international üblichen erweiterten ISO-Format Format geschrieben werden: YYYY-MM-DD.
Es muss also gegebenenfalls eine Umwandlung des eingegebenen Datums erfolgen.
Datenimport aus PDF-Formularen

38

Die Datumsangabe wird in den Tagesanteil, den Monatsanteil und den Jahresanteil aufgesplittet.
Die Tagesangabe und die Monatsangabe wird mit einer führenden «0» versehen und anschließend
von rechts aus auf zwei Zeichen begrenzt. Damit ist die Angabe auf jeden Fall zweistellig.
Ist die Jahresangabe bereits vierstellig (größer als 1000), so wird der Wert nicht geändert. Ansonsten wird bei einer Jahresangabe größer als 30 davon ausgegangen, dass es sich um eine Angabe
handelt, die im letzten Jahrhundert liegt und um 1900 erhöht werden muss. Alle anderen Jahresangaben werden als Angaben für das aktuelle Jahrhundert angesehen.
FUNCTION Date_to_SQLDate(st AS STRING) AS STRING
DIM stDay AS STRING
DIM stMonth AS STRING
DIM stDate AS STRING
DIM inYear AS INTEGER
stDay = Right("0" & Day(CDate(st)), 2)
stMonth = Right("0" & Month(CDate(st)), 2)
inYear = Year(CDate(st))
IF inYear = 0 THEN
inYear = Year(Now())
END IFIF inYear > 1000 THENELSEIF inYear > 30 THEN
inYear = 1900 + inYear
ELSE
inYear = 2000 + inYear
END IF
stDate = inYear & "-" & stMonth & "-" & stDay
Date_to_SQLDate = stDate
END FUNCTION

Die Funktion SQL_Value fasst die vorhergehenden Funktionen sowie die NULL-Werte zusammen
und gibt entsprechend vorformatierte Werte für die Eingabe in die Datenbank an die aufrufende
Prozedur zurück.
Für leere Felder wird NULL zurück gegeben. Damit bleibt das Feld auch in der Tabelle anschließend leer.
FUNCTION SQL_Value(st AS STRING, stType AS STRING) AS STRING
DIM stValue AS STRING
IF st = "" THENSQL_Value = "NULL"

Handelt es sich bei dem Feldtyp um ein Datumsfeld und ist der Inhalt als Datum zu erkennen, sosoll der Inhalt in ein SQL-Datumsformat umgewandelt werden. Ist der Inhalt nicht als Datum
erkennbar, so soll das Feld leer bleiben.
ELSEIF stType = "DATE" THEN
IF isDate(st) THENSQL_Value = "'" & Date_to_SQLDate(st) & "'"ELSE
SQL_Value = "NULL"
END IF

Handelt es sich bei dem Feldtyp um ein Dezimalfeld, so kann es Nachkommastellen geben. Der
Dezimaltrenner in Basic und auch in SQL ist allerdings ein Punkt. Entsprechend müssen Zahlenumgewandelt werden, sofern sie ein Komma enthalten. Das Feld kann nur Zahlen aufnehmen, so
dass andere Zeichen wie z.B. Maßeinheiten entfernt werden müssen. Dies geschieht mit der Funktion Val(). Leider gibt diese Funktion aber den Wert mit dem Dezimaltrenner der eingestellten
Sprache zurück, so dass hier anschließend noch das Komma erneut durch einen Punkt ersetzt
werden muss.
ELSEIF stType = "DECIMAL" THEN
stValue = Str(Val(Join(Split(st,","),".")))SQL_Value = Join(Split(stValue,","),".")

Alle anderen Inhalte werden als Text behandelt. Einfache Anführungszeichen werden mit einem
weiteren einfachen Anführungszeichen maskiert und der Gesamtbegriff wiederum in einfachen
Anführungszeichen gefasst weitergegeben.
Datenimport aus PDF-Formularen

39

ELSE
SQL_Value = "'" & String_to_SQL(st) & "'"END IF
END FUNCTION

Zu weiteren Details beim Aufbau von Makros sollte das separate Kapitel dieses Handbuches zu
Rate gezogen werden. Dieses Beispiel sollte lediglich aufzeigen, dass es auch möglich ist, Daten
aus PDF-Formularen nach Base zu übertragen, ohne die Werte über die Zwischenablage aus
jedem Feld in die Datenbank kopieren zu müssen. Der Aufbau der obigen Prozedur ist dabei recht
allgemein gehalten und müsste sicher den jeweiligen Bedürfnissen angepasst werden.

Datenimport aus PDF-Formularen40