BaseAnhang

Dokumentationen zu LibreOffice unter de.libreoffice.org

Copyright
Dieses Dokument unterliegt dem Copyright © 2014. 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.8.2014. Basierend auf der LibreOffice Version 4.3.

Anmerkung für Macintosh Nutzer
Einige Tastenbelegungen (Tastenkürzel) und Menüeinträge unterscheiden sich zwischen derMacintosh Version und denen für Windows- und Linux-Rechnern. Die unten stehende Tabelle gibt
Ihnen einige grundlegende Hinweise dazu. Eine ausführlichere Aufstellung dazu finden Sie in der
Hilfedatei des jeweiligen Moduls.
Windows/Linux

entspricht am Mac

EffektMenü-Auswahl Extras →Optionen

LibreOffice → EinstellungenZugriff auf die Programmoptionen

Rechts-Klick

Control+Klick
ControlÖffnen eines Kontextmenüs

Ctrl (Control)oder Strg (Steuerung)⌘ (Command)

Tastenkürzel in Verbindung mit anderen
TastenF5Shift+⌘
F5
Shift ⌘+F5

Öffnen des Dokumentnavigator-Dialogs

F11

⌘+T
T

Öffnen des Formatvorlagen-Dialogs

Anhang2

Inhalt
Barcode .......................................................................................................................................... 4
Datentypen des Tabelleneditors ..................................................................................................... 4
Ganzzahlen ................................................................................................................................ 4
Fließkommazahlen .................................................................................................................... 4
Text ............................................................................................................................................ 5
Zeit ............................................................................................................................................. 5
Sonstige ..................................................................................................................................... 5
Datentypen in StarBasic ................................................................................................................. 6
Zahlen ........................................................................................................................................ 6
Sonstige ..................................................................................................................................... 6
Eingebaute Funktionen und abgespeicherte Prozeduren ............................................................... 6
Numerisch ................................................................................................................................. 7
Text ............................................................................................................................................ 8
Datum/Zeit ............................................................................................................................... 10
Datenbankverbindung .............................................................................................................. 11
System ..................................................................................................................................... 12
Steuerzeichen zur Nutzung in Abfragen ....................................................................................... 13
Informationstabellen der HSQLDB ............................................................................................... 13
Datenbankreparatur für *.odb-Dateien .......................................................................................... 15
Wiederherstellung der Datenbank-Archivdatei ......................................................................... 15
Weitere Informationen zur Datenbank-Archivdatei ................................................................... 16
Behebung von Versionsproblemen .......................................................................................... 23
Weitere Tipps ........................................................................................................................... 24
Datenbankverbindung zu einer externen HSQLDB ...................................................................... 24
Parallelinstallation von interner und externer HSQLDB ................................................................ 26Änderung der Datenbankverbindung zur externen HSQLDB ........................................................ 27Änderung der Datenbankverbindung für einen Mehrbenutzerbetrieb ....................................... 28
Autoinkrementwerte mit der externen HSQLDB ....................................................................... 30

3

Barcode
Um die Barcode-Druckfunktion nutzen zu können, muss der Font «ean13.ttf» installiert sein. Dieser
Font ist frei verfügbar.
EAN13-Barcodes können mittels «ean13.ttf» folgendermaßen erstellt werden:
1

2

3

4

5

6

7

Zahl Großbuchstaben, A=0 B=1 usw.

8

9

10

11

12

13

*

Kleinbuchstaben, a=0 b=1 usw.

14

15
+

Siehe hierzu die Abfrage "Barcode_EAN13_ttf_Bericht" der Beispieldatenbank«Medien_ohne_Makros»

Datentypen des Tabelleneditors
Ganzzahlen
Typ

ZusatzHSQLDB

UmfangSpeicherbedarf

Tiny Integer

TINYINTTINYINT

28 = 256 | - 128 bis+ 127

1 ByteSmall Integer

SMALLINT

SMALLINT

216 = 65536 |- 32768 bis + 32767

2 ByteInteger

INTEGERINTEGER | INT

232 = 4294967296 |- 2147483648 bis+ 2147483647

4 ByteBigIntBIGINT

BIGINT

264

8 ByteFließkommazahlen
Typ

ZusatzHSQLDB

UmfangSpeicherbedarf

DezimalDECIMAL

DECIMAL

Unbegrenzt, durch
GUI auf 50 Stellen,
einstellbar, feste
Nachkommastellen,
exakte Genauigkeit

variabel

Zahl

NUMERICNUMERIC

Unbegrenzt, durch
GUI auf 50 Stellen,
einstellbar, feste
Nachkommastellen,
exakte Genauigkeit

variabel

Float

FLOAT

(Double wird
stattdessen
genutzt)

Real

REAL

REAL

DoubleDOUBLEDOUBLE [PRECISION] |FLOATEinstellbar, nicht
exakt, 15 Dezimalstellen maximal

8 ByteDatentypen des Tabelleneditors

4

Text
Typ

ZusatzHSQLDB

UmfangSpeicherbedarf

Text

VARCHAR

VARCHAReinstellbar

variabel

Text

VARCHAR_IG
NORECASE

VARCHAR_IG
NORECASE

Einstellbar, Auswirkung auf Sortierung,
ignoriert Unterschiede zwischen
Groß- und Kleinschreibung

variabel

Text (fix)

CHAR

CHAR | CHARACTER

Einstellbar, Rest
zum tatsächlichen
Text wird mit Leerzeichen aufgefüllt

fest

Memo

LONGVARCHARLONGVARCHAR

Typ

ZusatzHSQLDB

Datum

DATE

DATE

4 Byte

Zeit

TIME

TIME

4 ByteDatum/Zeit

TIMESTAMPTIMESTAMP |DATETIME

Einstellbar (0, 6 – 6
bedeutet mit Millisekunden)

8 ByteTyp

ZusatzHSQLDB

UmfangSpeicherbedarf

Ja/Nein

BOOLEANBOOLEAN |BIT

Binärfeld (fix)

BINARYBINARY

Wie Integer

fest

Binärfeld

VARBINARYVARBINARY

Wie Integer

variabel

Bild

LONGVARBINARYLONGVARBINARY

Wie Integer

variabel, für größere
Bilder gedacht

OTHER

OTHER

OTHER |OBJECTvariabelZeit
UmfangSpeicherbedarf

Sonstige

In den Tabellendefinitionen und bei der Änderung von Datentypen in Abfragen mit den Funktionen«Convert» oder «Cast» werden bei einigen Datentypen Abgaben zur Anzahl an Zeichen (a), zur
Genauigkeit (g, entspricht der Gesamtzahl an Ziffern) und zu den Dezimalstellen (d) erwartet:
CHAR(a), VARCHAR(a), DOUBLE(g), NUMERIC(g,d), DECIMAL(g,d) und TIMESTAMP(g).
TIMESTAMP(g) kann nur die Werte '0' oder '6' annehmen. '0' bedeutet, dass keine Sekunden im
Nachkommabereich (Zehntel, Hundertstel …) gespeichert werden. Die Genauigkeit des Timestamps kann nur direkt über den SQL-Befehl eingegeben werden. Sollen also Zeitangaben im
Sportbereich eingetragen werden, so ist TIMESTAMP(6) über Extras → SQL voreinzustellen.

Datentypen des Tabelleneditors

5Datentypen in StarBasic
ZahlenTyp

Entspricht
in HSQLDBStartwert

AnmerkungSpeicherbedarf

Integer

SMALLINT

0216 = - 32768 bis+ 32767

2 ByteLong

INTEGER0232 = - 2147483648
bis + 2147483647

4 Byte0.0

Dezimaltrenner: «.»4 ByteSingleDoubleDOUBLE

0.0

Dezimatrenner: «.»8 ByteCurrencyÄhnlich DECIMAL, NUMERIC

0.0000Währung, 4 Dezimalstellen fest

8 ByteTyp

Entspricht
in HSQLDBStartwert

AnmerkungSpeicherbedarf

Boolean

BOOLEANFalse

1 = „ja“, alles
andere: „nein“

1 ByteDate

TIMESTAMP

00:00:00

Datum und Zeit

8 ByteString

VARCHAR

Leerer Stringbis 65536 Zeichen

variabel

Object

OTHER

Null

Sonstige

Variant

LeervariabelKann jeden (anderen) Datentyp
annehmenvariabel

Vor allem bei Zahlenwerten besteht große Verwechselungsgefahr. In der Datenbank steht z.B.
häufig im Primärschlüssel der Datentyp «INTEGER». Wird jetzt per Makro ausgelesen, so muss
dort die aufnehmende Variable den Typ «Long» haben, da diese vom Umfang her mit «INTEGER»
aus der Datenbank übereinstimmt. Der entsprechende Auslesebefehl heißt dann auch «getLong».

Eingebaute Funktionen und abgespeicherte Prozeduren
In der eingebauten HSQLDB sind die folgenden Funktionen verfügbar. Ein paar Funktionen können leider nur dann genutzt werden, wenn in der Abfrage «SQL-Kommando direkt ausführen»
gewählt wurde. Dies verhindert dann gleichzeitig, dass die Abfragen editierbar bleiben.
Funktionen, die mit der grafischen Benutzeroberfläche zusammenarbeiten, sind gekennzeichnet
mit [funktioniert mit der GUI]. Funktionen, die nur über «SQL-Kommando direkt ausführen»ansprechbar sind, sind gekennzeichnet mit [SQL direkt – funktioniert nicht mit der GUI].

Eingebaute Funktionen und abgespeicherte Prozeduren

6

NumerischDa hier mit Fließkommazahlen gerechnet wird empfiehlt es sich gegebenenfalls auf die Einstellung
der Felder bei einer Abfrage zu achten. Meist ist hier die Anzeige der Nachkommazahlen begrenzt,
so dass eventuell überraschende Ergebnisse zustande kommen. Dann wird z.B. in Spalte1 0,00, in
Spalte2 1000 angezeigt. In Spalte3 soll dann Spalte1 * Spalte2 stehen – dort steht plötzlich 1.
ABS(d)

Gibt des absoluten Wert einer Zahl wieder, entfernt also ggf. das
Minus-Vorzeichen.
[funktioniert in der GUI]

ACOS(d)Gibt den Arcuscosinus wieder.
[funktioniert in der GUI]

ASIN(d)Gibt den Arcussinus wieder.
[funktioniert in der GUI]

ATAN(d)Gibt den Arcustangens wieder.
[funktioniert in der GUI]

ATAN2(a,b)

Gibt den Arcustangens über Koordinaten wieder. 'a' ist der Wert der
x-Achse, 'b' der Wert der y-Achse[funktioniert in der GUI]BITAND(a,b)

Sowohl die binäre Schreibweise von 'a' als auch die binäre Schreibweise von 'b' müssen an der gleichen Stelle eine '1' stehen haben,
damit die '1' in das Ergebnis übernommen wird.
BITAND(3,5) ergibt 1; 0011 AND 0101 = 0001
[funktioniert in der GUI]BITOR(a,b)

Entweder die binäre Schreibweise von 'a' oder die binäre Schreibweise von 'b' müssen an der gleichen Stelle eine '1' stehen haben,
damit die '1' in das Ergebnis übernommen wird.
BITOR(3,5) ergibt 7; 0011 OR 0101 = 0111
[funktioniert in der GUI]CEILING(d)Gibt die kleinste Ganzzahl an, die nicht kleiner als d ist.
[funktioniert in der GUI]

COS(d)

Gibt den Cosinus wieder.
[funktioniert in der GUI]

COT(d)

Gibt den Cotangens wieder.
[funktioniert in der GUI]

DEGREES(d)Gibt zu Bogenmaßen die Gradzahl wieder.
[funktioniert in der GUI]

EXP(d)

Gibt ed ( e: (2.718...) ) wieder.
[funktioniert in der GUI]FLOOR(d)Gibt die größte Ganzzahl an, die nicht größer als d ist.
[funktioniert in der GUI]

LOG(d)

Gibt den natürlichen Logarithmus zur Basis 'e' wieder.
[funktioniert in der GUI]

LOG10(d)Gibt den Logarithmus zur Basis 10 wieder.
[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren

7MOD(a,b)

Gibt den Rest als Ganzzahl wieder, der bei der Division von 2 Ganzzahlen entsteht.
MOD(11,3) ergibt 2, weil 3*3+2=11[funktioniert in der GUI]

PI()

Gibt π (3.1415...) wieder.
[funktioniert in der GUI]

POWER(a,b)

ab , POWER(2,3) = 8, weil 2³ = 8[funktioniert in der GUI]RADIANS(d)Gibt zu den Gradzahlen das Bogenmaß wieder.
[funktioniert in der GUI]RAND()

Gibt eine Zufallszahl x größer oder gleich 0.0 und kleiner als 1.0 wieder.
[funktioniert in der GUI]ROUND(a,b)

Rundet a auf b Stellen nach dem Dezimalzeichen.
[funktioniert in der GUI]ROUNDMAGIC(d)Löst Rundungsprobleme, die durch Fließkommazahlen entstehen.
3.11-3.1-0.01 ist eventuell nicht genau 0, wird aber als 0 in der GUI
angezeigt. ROUNDMAGIC macht daraus einen tatsächlichen 0-Wert.
[funktioniert in der GUI]

SIGN(d)Gibt -1 wieder, wenn 'd' kleiner als 0 ist, 0 wenn 'd'==0 und 1 wenn 'd'größer als 0 ist.
[funktioniert in der GUI]

SIN(A)

Gibt den Sinus eines Bogenmaßes wieder.
[funktioniert in der GUI]SQRT(d)Gibt die Quadratwurzel wieder.
[funktioniert in der GUI]

TAN(A)

Gibt den Tangens eines Bogenmaßes wieder.
[funktioniert in der GUI]TRUNCATE(a,b)

Schneidet 'a' auf 'b' Zeichen nach dem Dezimalpunkt ab.
TRUNCATE(2.37456,2) = 2.37
[funktioniert in der GUI]

Text
ASCII(s)Gibt den ASCII-Code des ersten Buchstaben des Strings wieder.
[funktioniert in der GUI]

BIT_LENGTH(str)

Gibt die Länge des Textes str in Bits wieder.
[funktioniert in der GUI]

CHAR(c)Gibt den Buchstaben wieder, der zu dem ASCII-Code c gehört. Dabei
geht es nicht nur um Buchstaben, sondern auch um Steuerzeichen.
CHAR(13) erzeugt in einer Abfrage einen Zeilenumbruch, der inmehrzeiligen Feldern eines Formulars oder in Berichten sichtbar wird.
[funktioniert in der GUI]

CHAR_LENGTH(str)

Gibt die Länge des Textes in Buchstaben wieder.
[funktioniert in der GUI]CONCAT(str1,str2)

Verbindet str1 + str2
[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren8'str1'||'str2'||'str3' oder'str1'+'str2'+'str3'

Verbindet str1 + str2 + str3, einfachere Alternative zu CONCAT[funktioniert in der GUI]

DIFFERENCE(s1,s2)

Gibt den ?Klang?unterschied zwischen s1 und s2 wieder. Hier wird
lediglich eine Ganzzahl ausgegeben. 0 bedeutet dabei gleichen
Klang. So erscheint 'for' und 'four' mit 0 gleich, Kürzen und Würzen
wird auf 1 gesetzt, Mund und Mond wieder auf 0[funktioniert in der GUI]HEXTORAW(s1)Übersetzt Hexadezimalcode in andere Zeichen[funktioniert in der GUI]

INSERT(s,start,len,s2)

Gibt einen Text wieder, bei dem Teile ersetzt werden. Beginnend mit«start» wird über eine Länge «len» aus dem Text s Text ausgeschnitten und durch den Text s2 ersetzt.
INSERT( 'Bundesbahn', 3, 4, 'mmel') macht aus 'Bundesbahn' 'Bummelbahn', wobei die Länge des eingefügten Textes
auch ohne weiteres größer als die des ausgeschnittenen Textes sein
darf. So ergibt
INSERT( 'Bundesbahn', 3, 5, 's und B')'Bus und Bahn'.
[funktioniert in der GUI]LCASE(s)Wandelt den String in Kleinbuchstaben um.
[funktioniert in der GUI]LEFT(s,count)

Gibt die mit count angegebene Zeichenanzahl vom Beginn des Textes s wieder.
[funktioniert in der GUI]LENGTH(s)Gibt die Länge eines Textes in Anzahl der Buchstaben wieder.
[funktioniert in der GUI]

LOCATE(search,s,[start])

Gibt den ersten Treffer für den Begriff aus search in dem Text s wieder. Der Treffer wird numerisch angegeben: (1=left, 0=not found)
Die Angabe eines Startes innerhalb des Textes ist optional.
[funktioniert in der GUI]

LTRIM(s)Entfernt führende Leerzeichen und nicht druckbare Zeichen voneinem Text.
[funktioniert in der GUI]OCTET_LENGTH(str)

Gibt die Länge eines Textes in Bytes an. Dies entspricht im Prinzip
dem doppelten Wert der Zeichenanzahl.
[funktioniert in der GUI]RAWTOHEX(s1)Verwandelt in die Hexadezimalschreibweise, Umkehr von HEXTORAW()[funktioniert in der GUI]REPEAT(s,count)

Wiederholt den Text s count Mal[funktioniert in der GUI]REPLACE(s,replace,s2)

Ersetzt alle vorkommenden Textstücke mit dem Inhalt replace im Texts durch den Text s2[funktioniert in der GUI]RIGHT(s,count)Umgekehrt zu LEFT; gibt die mit count angegebene Zeichenzahl vom
Textende aus wieder.
[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren

9RTRIM(s)Entfernt alle Leerzeichen und nicht druckbaren Zeichen am Textende.
[funktioniert in der GUI]SOUNDEX(s)Gibt einen Code von 4 Zeichen wieder, die dem Klang von s entsprechen sollen – passt zu der Funktion DIFFERENCE()[funktioniert in der GUI]SPACE(count)

Gibt die in count angegebene Zahl an Leertasten wieder.
[funktioniert in der GUI]SUBSTR(s,start[,len])

Kürzel für SUBSTRING[funktioniert in der GUI]SUBSTRING(s,start[,len])

Gibt den Text s ab der Startposition wieder. (1=links) . Wird die Länge
ausgelassen, so wird der gesamte Text wiedergegeben.
[funktioniert in der GUI]UCASE(s)Wandelt den String in Großbuchstaben um.
[funktioniert in der GUI]

LOWER(s)Wie LCASE(s)[funktioniert in der GUI]

UPPER(s)Wie UCASE(s)[funktioniert in der GUI]

Datum/Zeit
CURDATE()

Gibt das aktuelle Datum wieder.
[funktioniert in der GUI]

CURTIME()

Gibt die aktuelle Zeit wieder.
[funktioniert in der GUI]DATEDIFF(string, datetime1, datetime2)

Datumsunterschied zwischen zwei Datums- bzw. Datumszeitangaben.
Der Eintrag in string entscheidet darüber, in welcher Einheit derUnterschied wiedergegeben wird: 'ms'='millisecond', 'ss'='second','mi'='minute', 'hh'='hour', 'dd'='day', 'mm'='month', 'yy' = 'year'.
Sowohl die Langfassung als auch die Kurzfassung ist für den einzusetzenden string möglich.
[funktioniert in der GUI]

DAY(date)

Gibt den Tag im Monat wieder. (1-31)[funktioniert in der GUI]DAYNAME(date)

Gibt den englischen Namen des Tages wieder.
[funktioniert in der GUI]

DAYOFMONTH(date)

Gibt den Tag im Monat wieder. (1-31), Synonym für DAY()[funktioniert in der GUI]

DAYOFWEEK(date)

Gibt den Wochentag als Zahl wieder. (1 bedeutet Sonntag)[funktioniert in der GUI]

DAYOFYEAR(date)

Gibt den Tag im Jahr wieder. (1-366)[funktioniert in der GUI]

HOUR(time)

Gibt die Stunde wieder. (0-23)[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren

10

MINUTE(time)

Gibt die Minute wieder. (0-59)[funktioniert in der GUI]MONTH(date)

Gibt den Monat wieder. (1-12)[funktioniert in der GUI]MONTHNAME(date)

Gibt den englischen Namen des Monats wieder.
[funktioniert in der GUI]

NOW()

Gibt das aktuelle Datum und die aktuelle Zeit zusammen als Zeitstempel wieder. Stattdessen kann auch CURRENT_TIMESTAMP
genutzt werden.
[funktioniert in der GUI]QUARTER(date)

Gibt das Quartal im Jahr wieder. (1-4)[funktioniert in der GUI]SECOND(time)

Gibt die Sekunden einer Zeitangabe wieder. (0-59)[funktioniert in der GUI]WEEK(date)

Gibt die Woche des Jahres wieder. (1-53)[funktioniert in der GUI]YEAR(date)

Gibt das Jahr aus einer Datumseingabe wieder.
[funktioniert in der GUI]

CURRENT_DATE

Synonym für CURDATE(), SQL-Standard[funktioniert in der GUI]

CURRENT_TIME

Synonym für CURTIME(), SQL-Standard[funktioniert in der GUI]

CURRENT_TIMESTAMP

Synonym für NOW(), SQL-Standard[funktioniert in der GUI]

Datenbankverbindung
DATABASE()

Gibt den Pfad und Namen der Datenbank, die zu dieser Verbindung
gehört, wieder.
[funktioniert in der GUI]

USER()

Gibt den Benutzernamen dieser Verbindung wieder. Der Nutzername
ist dann von Bedeutung, wenn die Datenbank in eine externe Datenbank umgewandelt werden soll.
[SQL direkt – funktioniert nicht mit der GUI]

CURRENT_USER

SQL Standardfunktion, Synonym für USER(). Zu beachten ist, dasshier keine Klammern zu setzen sind.
[funktioniert in der GUI]IDENTITY()

Gibt den letzten Wert für ein Autowertfeld wieder, das in der aktuellen
Verbindung erzeugt wurde. Dies wird bei der Makroprogrammierung
genutzt, um aus einem erstellten Primärschlüssel für eine Tabelleeinen Fremdschlüssel für eine andere Tabelle zu erstellen.
[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren

11System
IFNULL(exp,value)Wenn exp NULL ist wird value zurückgegeben, sonst exp. Stattdessen kann als Erweiterung auch COALESCE() genutzt werden. Exp
und value müssen den gleichen Datentyp haben.
IFNULL ist eine wichtige Funktion, wenn Felder durch Rechnung oder
CONCAT miteinander verbunden werden. Der Inhalt des Ergebnisses
wäre NULL, wenn auch nur ein Wert NULL ist.
"Nachname"||', '||"Vorname" würde für Personen, bei
denen z.B. der Eintrag für "Vorname" fehlt, ein leeres Feld, also NULL
ergeben.
"Nachname"||IFNULL(', '||"Vorname",'') würde stattdessen auch nur "Nachname" ausgeben.
[funktioniert in der GUI]

CASEWHEN(exp,v1,v2)

Wenn exp wahr ist wird v1 zurückgegeben, sonst v2. Stattdessen
kann auch CASE WHEN genutzt werden.
CASEWHEN("a">10,'Ziel erreicht','noch üben') gibt
'Ziel erreicht' aus, wenn der Inhalt des Feldes "a" größer als 10 ist.
[funktioniert in der GUI]CONVERT(term,type)

Wandelt term in einen anderen Datentyp um.
CONVERT("a",DECIMAL(5,2)) macht aus dem Feld "a" ein Feld
mit 5 Ziffern, davon 2 Nachkommastellen. Ist die Zahl zu groß, so
wird ein Fehler ausgegeben.
[funktioniert in der GUI]

CAST(term AS type)

Synonym zu CONVERT()[funktioniert in der GUI]COALESCE(expr1,expr2,
expr3,...)

Wenn expr1 nicht NULL ist wird expr1 wiedergegeben, ansonsten
wird expr2 überprüft, danach dann expr3 usw. Sämtliche Ausdrücke
müssen zumindest einen ähnlichen Datentyp haben. So geht die
alternative Darstellung von Ganzzahlen und Fließkommazahlen, abernicht auch noch des eines Datums- oder Zeitwertes.
[funktioniert in der GUI]NULLIF(v1,v2)

Wenn v1 gleich v2 ist wird NULL wiedergegeben, ansonsten v1.
Die Daten müssen vom Typ her vergleichbar sein.
[funktioniert in der GUI]CASE v1 WHEN v2
THEN v3 [ELSE v4]
END

Wenn v1 gleich v2 ist wird v3 wiedergegeben. Sonst wird v4 wiedergegeben oder NULL, wenn kein ELSE formuliert ist.
[SQL direkt – funktioniert nicht mit der GUI]CASE WHEN expr1
THEN v1[WHEN expr2
THEN v2] [ELSE v4]
END

Wenn expr1 wahr ist wird v1 zurückgegeben. [Optional können weitere Fälle angegeben werden] Sonst wird v4 wiedergegeben oder
NULL, wenn kein ELSE formuliert ist.
CASE WHEN DAYOFWEEK("Datum")=1 THEN 'Sonntag'
WHEN DAYOFWEEK("Datum")=2 THEN 'Montag' … END
könnte per SQL den Tagesnamen ausgeben, der sonst in der Funktion nur in Englisch verfügbar ist.
[funktioniert in der GUI]EXTRACT ({YEAR |MONTH | DAY | HOUR
| MINUTE | SECOND}FROM <Datums- oder
Zeitwert>)

Kann viele der Datums- und Zeitfunktionen ersetzen. Gibt das Jahr,
den Monat, den Tag usw. von einem Datums- bzw. Datumszeitwert
wieder.
EXTRACT(DAY FROM "Datum") gibt den Tag im Monat wieder.
[funktioniert in der GUI]

Eingebaute Funktionen und abgespeicherte Prozeduren

12

POSITION(<string
expression> IN<string
expression>)

Wenn der erste Text in dem zweiten enthalten ist wird die Position
des ersten Textes wiedergeben, ansonsten 0
Dies könnte statt einer Suchmöglichkeit mit «LIKE» genutzt werden.
[funktioniert in der GUI]SUBSTRING(<string
expression> FROM
<numeric expression> [FOR <numericexpression>])Liefert den Teil eines Textes ab der in FROM angegebenen Startposition, optional in der in FOR angegebenen Länge.
Steht im Feld "Name" z.B. 'Roberta', so ergibt
SUBSTRING("Name" FROM 3 FOR 3)
den Teilstring 'bert'.
[funktioniert in der GUI]

TRIM([{LEADING |TRAILING | BOTH}]FROM <string
expression>)

Nicht druckbare Sonderzeichen und Leerzeichen werden entfernt.
[funktioniert in der GUI]

Steuerzeichen zur Nutzung in Abfragen
In Abfragen lassen sich Felder miteinander verknüpfen. Aus zwei Feldern in
SELECT "Vorname", "Nachname" FROM "Tabelle"
wird durch
SELECT "Vorname"||' '||"Nachname" FROM "Tabelle"
ein Feld. Hier wird noch ein Leerzeichen mit eingefügt. Natürlich lassen sich hier alle möglichen
beliebigen Zeichen einfügen. Solange diese in '' stehen werden sie als Text interpretiert. Manchmal ist es aber auch sinnvoll, Zeilenumbrüche z.B. für einen Bericht einzufügen. Deshalb hier einekleine Liste von Steuerzeichen, die entsprechend durch einen Blick auf
http://de.wikipedia.org/wiki/Steuerzeichen erweitert werden kann.
CHAR( 9 )Horizontaler Tabulator

CHAR( 10 )Zeilenvorschub

Erzeugt in Serienbriefen und
im Report-Builder in einem
Feld einen Zeilenumbruch(Linux, Unix, Mac)

CHAR( 13 )Wagenrücklauf

Zeilenumbruch zusammen mit
dem Zeilenvorschub in Windows.
CHAR(13)||CHAR(10) ist
auch für Linux, Mac usw. möglich, daher die universelle Variante.

Informationstabellen der HSQLDBInnerhalb von Datenbanken wird in dem Bereich ″INFORMATION_SCHEMA″ die Information überalle Tabelleneigenschaften sowie ihre Verbindung untereinander abgelegt. Diese Informationen
ermöglichen in Base bei der Erstellung von Makros, Prozeduren mit weniger Parametern zu starten. Eine Anwendung findet sich in der Beispieldatenbank unter anderem im Modul «Wartung» in
der Prozedur «Tabellenbereinigung» für die Ansteuerung des Dialoges.
In einer Abfrage können die einzelnen Informationen sowie sämtliche dazugehörigen Felder auf die
folgende Art ermittelt werden.
Informationstabellen der HSQLDB

13

SELECT * FROM ″INFORMATION_SCHEMA″.″SYSTEM_ALIASES″
Im Gegensatz zu einer normalen Tabelle ist es hier notwendig, dem jeweiligen folgenden Begriff″INFORMATION_SCHEMA″ voranzustellen.
SYSTEM_ALIASES
SYSTEM_ALLTYPEINFOSYSTEM_BESTROWIDENTIFIERSYSTEM_CACHEINFOSYSTEM_CATALOGSSYSTEM_CHECK_COLUMN_USAGE
SYSTEM_CHECK_CONSTRAINTSSYSTEM_CHECK_ROUTINE_USAGE
SYSTEM_CHECK_TABLE_USAGE
SYSTEM_CLASSPRIVILEGESSYSTEM_COLUMNPRIVILEGESSYSTEM_COLUMNSSYSTEM_CROSSREFERENCE
SYSTEM_INDEXINFOSYSTEM_PRIMARYKEYSSYSTEM_PROCEDURECOLUMNSSYSTEM_PROCEDURESSYSTEM_PROPERTIESSYSTEM_SCHEMASSYSTEM_SEQUENCESSYSTEM_SESSIONINFOSYSTEM_SESSIONSSYSTEM_SUPERTABLESSYSTEM_SUPERTYPESSYSTEM_TABLEPRIVILEGESSYSTEM_TABLESSYSTEM_TABLETYPESSYSTEM_TABLE_CONSTRAINTSSYSTEM_TEXTTABLESSYSTEM_TRIGGERCOLUMNSSYSTEM_TRIGGERSSYSTEM_TYPEINFOSYSTEM_UDTATTRIBUTESSYSTEM_UDTS
SYSTEM_USAGE_PRIVILEGESSYSTEM_USERSSYSTEM_VERSIONCOLUMNSSYSTEM_VIEWSSYSTEM_VIEW_COLUMN_USAGE
SYSTEM_VIEW_ROUTINE_USAGE
SYSTEM_VIEW_TABLE_USAGE
Die folgende Abfrage gibt z.B. eine komplette Übersicht über alle in der Datenbank genutzten
Tabellen mit Feldtypen, Primärschlüsseln und Fremdschlüsseln:
SELECT"A"."TABLE_NAME","A"."COLUMN_NAME","A"."TYPE_NAME","A"."NULLABLE","B"."KEY_SEQ" AS "PRIMARYKEY","C"."PKTABLE_NAME" || '.' || "C"."PKCOLUMN_NAME" AS "FOREIGNKEY FOR"
FROM "INFORMATION_SCHEMA"."SYSTEM_COLUMNS" AS "A"Informationstabellen der HSQLDB

14LEFT JOIN "INFORMATION_SCHEMA"."SYSTEM_PRIMARYKEYS" AS "B"
ON ( "B"."TABLE_NAME" = "A"."TABLE_NAME" AND "B"."COLUMN_NAME" ="A"."COLUMN_NAME" )LEFT JOIN "INFORMATION_SCHEMA"."SYSTEM_CROSSREFERENCE" AS "C"
ON ( "C"."FKTABLE_NAME" = "A"."TABLE_NAME" AND "C"."FKCOLUMN_NAME"= "A"."COLUMN_NAME" )WHERE "A"."TABLE_SCHEM" = 'PUBLIC'

Datenbankreparatur für *.odb-Dateien
Regelmäßige Datensicherung sollte eigentlich Grundlage für den Umgang mit dem PC sein.
Sicherheitskopien sind so der einfachste Weg, auf einen halbwegs aktuellen Datenstand zurückgreifen zu können. Doch in der Praxis mangelt es eben häufig an dieser Stelle.
Formulare, Abfragen und Berichte können, sofern eine Vorversion der Datenbank gesichert wurde,über die Zwischenablage in eine neue Datenbank kopiert werden. Lässt sich allerdings, aus welchen Gründen auch immer, eine aktuelle Datenbankdatei nicht mehr öffnen, so ist das Hauptproblem: Wie komme ich (hoffentlich) an die Daten.
Bei plötzlichen Abstürzen des PC kann es passieren, dass geöffnete Datenbanken von LO (interne
Datenbank HSQLDB) nicht mehr zu öffnen sind. Stattdessen wird beim Versuch, die Datenbank zuöffnen, nach einem entsprechenden Filter für das Format gefragt.
Das Ganze liegt daran, dass Teile der Daten der geöffneten Datenbank im Arbeitsspeicher liegen
und lediglich temporär zwischengespeichert werden. Erst beim Schließen der Datei wird die
gesamte Datenbank in die Datei zurückgeschrieben und gepackt.

Wiederherstellung der Datenbank-Archivdatei
Um eventuell doch noch an die Daten zu kommen, kann das folgende Verfahren hilfreich sein:
1. Fertigen sie eine Kopie ihrer Datenbank für die weiteren Schritte an.
2. Versuchen sie die Kopie mit einem Packprogramm zu öffnen. Es handelt sich bei der*.odb-Datei um ein gepacktes Format, ein Zip-Archiv. Lässt sich die Datei so nicht direktöffnen, so funktioniert das Ganze vielleicht auch über die Umbenennung der Endung von*.odb zu *.zip.
Funktioniert das Öffnen nicht, so ist vermutlich von der Datenbank nichts mehr zu retten.
3. Folgende Verzeichnisse sehen sie nach dem Öffnen einer Datenbankdatei im Packprogramm auf jeden Fall:

Datenbankreparatur für *.odb-Dateien

15

Abbildung 1: Aufbau einer Datenbankdatei ohne Tabellen, Abfragen, Formulare und Berichte
4. Die Datenbankdatei muss ausgepackt werden. Die entscheidenden Informationen für die
Daten liegen im Unterverzeichnis «database» in den Dateien «data» und «script».
5. Gegebenenfalls empfiehlt es sich, die Datei «script» einmal anzuschauen und auf Ungereimtheiten zu überprüfen. Dieser Schritt kann aber auch erst einmal zum Testen übersprungen werden. Die «script»-Datei enthält vor allem die Beschreibung der Tabellenstruktur.
6. Gründen sie eine neue, leere Datenbankdatei und öffnen diese Datenbankdatei mit dem
Packprogramm.
7. Ersetzen sie die Dateien «data» und «script» aus der neuen Datenbankdatei durch die
unter «4.» entpackten Dateien.
8. Das Packprogramm muss nun geschlossen werden. War es, je nach Betriebssystem, notwendig, die Dateien vor dem Öffnen durch das Packprogramm nach *.zip umzubenennen,
so ist das jetzt wieder nach *.odb zu wandeln.
9. Öffnen sie die Datenbankdatei jetzt mit LO. Sie können hoffentlich wieder auf ihre Tabellenzugreifen.
10. Wie weit sich jetzt auch Abfragen, Formulare und Berichte auf ähnliche Weise wiederherstellen lassen, bleibt dem weiteren Testen überlassen.
Siehe hierzu auch: http://user.services.LO oder Ooo.org/en/forum/viewtopic.php?f=83&t=17125

Weitere Informationen zur Datenbank-Archivdatei
Eine Datenbank-Archivdatei enthält im tatsächlichen Gebrauch neben dem grundlegenden Verzeichnis für die Datenbank und dem für das OpenDocument-Format vorgeschriebenen Verzeichnis«META-INF» noch weitere Verzeichnisse, um Formulare und Berichte abzuspeichern. Eine
Beschreibung zum grundsätzliche Aufbau des OpenDocument-Formates ist u.a. unter http://de.wikipedia.org/wiki/OpenDocument zu finden.
Die folgende Übersicht zeigt eine Datenbank, die Tabellen ein Formular und einen Bericht enthält.
Nicht offen sichtbar ist hier, dass auch eine Abfrage zur Datenbank gehört. Solche Abfragen werden nicht in separaten Verzeichnissen gespeichert sondern sind in der Datei «content.xml» enthalten. Die dafür notwendigen Informationen beschränken sich schließlich auf eine einfache SQLFormulierung.

Datenbankreparatur für *.odb-Dateien

16

Abbildung 2: Datenbankdatei, die neben der Datenbank auch Informationen zu einem Formular
und einem Bericht abgespeichert hat.
Hier einige der Dateien aus der Datenbank-Archivdatei im Überblick:
mimetype
application/vnd.oasis.opendocument.base

Diese kleine Textdatei enthält lediglich den Hinweis, dass es sich bei der Archivdatei um eine
Datenbankdatei im OpenDocument-Format handelt.
content.xml einer Datenbank ohne Inhalt<?xml version="1.0" encoding="UTF-8"?><office:document-content
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
xmlns:ooo="http://openoffice.org/2004/office"xmlns:ooow="http://openoffice.org/2004/writer"
xmlns:oooc="http://openoffice.org/2004/calc"
xmlns:dom="http://www.w3.org/2001/xml-events"
xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rpt="http://openoffice.org/2005/report"

Datenbankreparatur für *.odb-Dateien

17xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:grddl="http://www.w3.org/2003/g/data-view#"
xmlns:tableooo="http://openoffice.org/2009/table"
xmlns:drawooo="http://openoffice.org/2010/draw"
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0"
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
xmlns:css3t="http://www.w3.org/TR/css3-text/"
office:version="1.2"><office:scripts/><office:font-face-decls/><office:automatic-styles/><office:body><office:database><db:data-source><db:connection-data><db:connection-resource xlink:href="sdbc:embedded:hsqldb"/><db:login db:is-password-required="false"/></db:connection-data><db:driver-settings
db:system-driver-settings=""
db:base-dn=""db:parameter-name-substitution="false"/><db:application-connection-settings
db:is-table-name-length-limited="false"
db:append-table-alias-name="false"
db:max-row-count="100"><db:table-filter><db:table-include-filter><db:table-filter-pattern>%</db:table-filter-pattern></db:table-include-filter></db:table-filter></db:application-connection-settings></db:data-source></office:database></office:body></office:document-content>

Zu Beginn wird die xml-Version und der verwendete Zeichensatz geklärt. Der gesamte nachfolgende Inhalt wird ohne Absatz direkt in einer Zeile ausgegeben. In der oben erstellten Übersicht
wird hoffentlich der Inhalt etwas klarer. Zusammengehörige Elemente werden in «Tags» gefasst.
Mit den Anfangsdefinitionen werden durch «xmlns» (XML-Namespace) die Namensräumeumschrieben, auf die innerhalb dieser Datei zugegriffen werden kann. Anschließend werden etwas
konkretere Angaben zum Inhalt gemacht. Hier ist dann z.B. ersichtlich, dass es sich um eineinterne HSQLDB-Datenbank handelt und die Angabe eines Passwortes nicht erforderlich ist.
content.xml einer Datenbank mit Inhalt
Der folgende Inhalt ist nur ein Auszug der content.xml-Datei und soll nur die Struktur klären.
<office:scripts/><office:font-face-decls><style:font-face style:name="F" svg:font-family=""/></office:font-face-decls><office:automatic-styles><style:style
style:name="co1"style:family="table-column"
style:data-style-name="N0"/><style:style
style:name="co2"style:family="table-column"
style:data-style-name="N107"/><style:style style:name="ce1" style:family="table-cell"><style:paragraph-properties fo:text-align="start"/></style:style>Datenbankreparatur für *.odb-Dateien18

<number:number-style style:name="N0" number:language="de" number:country="DE"><number:number number:min-integer-digits="1"/></number:number-style><number:currency-style
style:name="N107P0"
style:volatile="true"
number:language="de"number:country="DE"><number:number
number:decimal-places="2"number:min-integer-digits="1"number:grouping="true"/><number:text> </number:text><number:currency-symbol
number:language="de"number:country="DE">€</number:currency-symbol></number:currency-style>

Hier wird ein Feld als Währungsfeld festgelegt. Die Anzahl der Dezimalstellen werden genannt, derAbstand zwischen Zahlen und Währungssymbol sowie das Währungssymbol selbst.
<number:currency-style
style:name="N107"
number:language="de"number:country="DE"><style:text-properties fo:color="#ff0000"/><number:text>-</number:text><number:number
number:decimal-places="2"number:min-integer-digits="1"number:grouping="true"/><number:text> </number:text><number:currency-symbol
number:language="de"number:country="DE">€</number:currency-symbol><style:map style:condition="value()&gt;=0" style:apply-style-name="N107P0"/></number:currency-style>Im zweiten Abschnitt erfolgt die Festlegung, dass bis zu einem bestimmten Wert die Währung in
der Farbe Rot («#ff0000») erscheinen soll.
</office:automatic-styles><office:body><office:database><db:data-source>

Dieser Eintrag entspricht mit allen Unterpunkten dem aus der oben beschriebenen content.xml
einer Datenbank-Archivdatei ohne Inhalt.
</db:data-source><db:forms><db:component
db:name="Quittung"xlink:href="forms/Obj12"
db:as-template="false"/></db:forms>

Die Datenbank-Archivdatei enthält einen Unterordner, in dem die Details zu einem Formular abgespeichert sind. Das Formular ist auf der Benutzeroberfläche mit dem Namen «Quittung» verzeichnet.
<db:reports><db:component
db: name="Quittung"xlink:href="reports/Obj12"
db:as-template="false"/></db:reports>

Datenbankreparatur für *.odb-Dateien

19

Die Datenbank-Archivdatei enthält einen Unterordner, in dem die Details zu einem Bericht abgespeichert sind. Der Bericht ist auf der Benutzeroberfläche ebenfalls mit dem Namen «Quittung»verzeichnet.
<db:queries><db:query
db:name="Verkauf_berechnet"
db:command="SELECT &quot;a&quot;.*, ( SELECT &quot;Preis&quot; *&quot;a&quot;.&quot;Anzahl&quot; FROM &quot;Ware&quot; WHERE&quot;ID&quot; = &quot;a&quot;.&quot;Ware_ID&quot; ) AS
&quot;Anzahl*Preis&quot; FROM &quot;Verkauf&quot; AS &quot;a&quot;"/></db:queries>

Sämtliche Abfragen werden direkt in der content.xml gespeichert. «&quot;» steht dabei für ein doppeltes Anführungszeichen oben «"». Die oben stehende Abfrage ist in diesem Beispiel eigentlich
recht umfangreich und besteht aus vielen korrelierenden Unterabfragen. Sie ist hier nur verkürzt
wiedergegeben.
<db:table-representations><db:table-representation db:name="Quittung"/><db:table-representation db:name="Verkauf"/><db:table-representation db:name="Ware"><db:columns><db:column
db:name="ID"
db:style-name="co1"db:default-cell-style-name="ce1"/><db:column
db:name="MWSt"
db:style-name="co1"db:gefault-cell-style-name="ce1"/><db:column
db:name="Preis"
db:style-name="co2"db:default-cell-style-name="ce1"/><db:column
db:name="Ware"db:style-name="co1"db:default-cell-style-name="ce1"/></db:columns></db:table-representation></db:table-representations>

Wie sollen verschiedene Tabellen von der Ansicht her erscheinen. An dieser Stelle wird dasErscheinungsbild bestimmter Spalten gespeichert; in diesem Beispiel wurden Einstellungen derTabelle "Ware" mit ihren einzelnen Feldern "ID", "MWSt" usw. abgespeichert. Anscheinend wurdehier direkt etwas eingegeben und dabei an den Spalten der Tabelle ein bisschen verändert.
</office:database></office:body>Grundsätzlich ist in der content.xml der Inhalt der Abfragen und Informationen zum Erscheinungsbild der Tabellen direkt gespeichert. Außerdem gibt eine Definition der Verbindung zur Datenbank.
Schließlich kommen noch Verweise auf Formulare und Berichte hinzu.
settings.xml<?xml version="1.0" encoding="UTF-8"?><office:document-settings
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
xmlns:ooo="http://openoffice.org/2004/office"xmlns:db="urn:oasis:names:tc:opendocument:xmlns:database:1.0"
office:version="1.2"/>

Datenbankreparatur für *.odb-Dateien

20Bei einer Datenbank ohne weiteren Inhalt stehen hier nur die Grunddefinitionen. Mit Inhalt werden
hier aber die unterschiedlichsten Einstellungen abgespeichert. Nach dem Start mit der obigen Definition sind folgende Einstellungen in der Beispieldatei abgespeichert:<office:settings><config:config-item-set config:name="ooo:view-settings"><config:config-item-set config:name="Queries"><config:config-item-set config:name="Verkauf_berechnet"><config:config-item-set config:name="Tables"><config:config-item-set config:name="Table1"><config:config-item config:name="WindowName"config:type="string">Verkauf</config:config-item><config:config-item config:name="WindowLeft"config:type="int">153</config:config-item><config:config-item config:name="ShowAll"
config:type="boolean">true</config:config-item><config:config-item config:name="WindowTop"
config:type="int">17</config:config-item><config:config-item config:name="WindowWidth"
config:type="int">120</config:config-item><config:config-item config:name="WindowHeight"
config:type="int">120</config:config-item><config:config-item config:name="ComposedName"config:type="string">Verkauf</config:config-item><config:config-item config:name="TableName"config:type="string">Verkauf</config:config-item></config:config-item-set></config:config-item-set><config:config-item config:name="SplitterPosition"
config:type="int">105</config:config-item><config:config-item config:name="VisibleRows"
config:type="int">1024</config:config-item></config:config-item-set></config:config-item-set></config:config-item-set><config:config-item-set config:name="ooo:configuration-settings"><config:config-item-set config:name="layout-settings"><config:config-item-set config:name="Tables"><config:config-item-set config:name="Table1"><config:config-item config:name="WindowName"config:type="string">Verkauf</config:config-item><config:config-item config:name="WindowLeft"config:type="int">186</config:config-item><config:config-item config:name="ShowAll"
config:type="boolean">false</config:config-item><config:config-item config:name="WindowTop"
config:type="int">17</config:config-item><config:config-item config:name="WindowWidth"
config:type="int">120</config:config-item><config:config-item config:name="WindowHeight"
config:type="int">120</config:config-item><config:config-item config:name="ComposedName"config:type="string">Verkauf</config:config-item><config:config-item config:name="TableName"config:type="string">Verkauf</config:config-item></config:config-item-set><config:config-item-set config:name="Table2">... (identische config:type-Punkte wie "Table1"<config:config-item config:name="TableName"config:type="string">Ware</config:config-item></config:config-item-set><config:config-item-set config:name="Table3">... (identische config:type-Punkte wie "Table1"<config:config-item config:name="TableName"config:type="string">Quittung</config:config-item></config:config-item-set></config:config-item-set></config:config-item-set>Datenbankreparatur für *.odb-Dateien21</config:config-item-set></office:settings>

Die gesamte Übersicht bezieht sich auf verschiedene Ansichten der Fenster für die (eine) Abfrage"Verkauf berechnet" und für die Tabellen "Verkauf", "Ware" und "Quittung". Die letzten beiden wurden hier nur verkürzt wiedergegeben. Würden diese Einstellungen bei einer defekten *.odb-Datei
fehlen, so wäre das also nicht weiter von Bedeutung. Sie würden wieder erstellt, wenn die entsprechenden Fenster das nächste Mal geöffnet werden.
META-INF/manifest.xml<?xml version="1.0" encoding="UTF-8"?><manifest:manifest
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"><manifest:file-entry
manifest:full-path="/"manifest:media-type="application/vnd.oasis.opendocument.base"/><manifest:file-entry
manifest:full-path="database/script"
manifest:media-type=""/><manifest:file-entry
manifest:full-path="database/properties"
manifest:media-type=""/><manifest:file-entry
manifest:full-path="settings.xml"
manifest:media-type="text/xml"/><manifest:file-entry
manifest:full-path="content.xml"
manifest:media-type="text/xml"/></manifest:manifest>

Bei dieser Datei im Unterverzeichnis META-INF handelt es sich um ein Inhaltsverzeichnis dergesamten Datenbank-Archivdatei. Da es sich bei der oben gezeigten Datei um die Datei handelt,die in der leeren Datenbank (Abbildung 1) enthalten ist gibt es hier nur 5 Datei-Einträge («fileentry»). Bei der mit Formular und Bericht versehenen Datenbank-Archivdatei sind die Einträge inder META-INF entsprechend umfangreicher.
database/properties#HSQL Database Engine 1.8.0.10#Sun Jul 14 18:02:08 CEST 2013
hsqldb.script_format=0
runtime.gc_interval=0
sql.enforce_strict_size=true
hsqldb.cache_size_scale=8
readonly=false
hsqldb.nio_data_file=false
hsqldb.cache_scale=13
version=1.8.0
hsqldb.default_table_type=cachedhsqldb.cache_file_scale=1
hsqldb.lock_file=true
hsqldb.log_size=10
modified=no
hsqldb.cache_version=1.7.0
hsqldb.original_version=1.8.0
hsqldb.compatible_version=1.8.0

Die properties-Datei enthält die Grundeinstellungen für die interne HSQL Datenbank. Siehe dazu
auch das folgende Kapitel.
database/script
SET DATABASE COLLATION "German"
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE USER SA PASSWORD ""GRANT DBA TO SA
SET WRITE_DELAY 60

Datenbankreparatur für *.odb-Dateien

22In der script-Datei finden sich die Standardeinstellungen für die Verbindung zur Datenbank, zur
benutzten Sprache usw. Hier erscheint auch der später erwähnte Benutzer «SA».
In deiner mit Inhalt gefüllten Datenbank werden in dieser Datei die Grundlagen für die Tabellendefinitionen gespeichert:
SET DATABASE COLLATION "German"
CREATE SCHEMA PUBLIC AUTHORIZATION DBA

Die Tabellen werden definiert, bevor der Datenbanknutzer definiert wird. Zuerst werden die Tabellen mit ihren Feldern im Cache erstellt.
CREATE CACHED TABLE "Ware"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULLPRIMARY KEY,"Ware" VARCHAR(50),"Preis" DECIMAL(8,2),"MWSt" TINYINT)
CREATE CACHED TABLE "Verkauf"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULLPRIMARY KEY,"Anzahl" TINYINT,"Ware_ID" INTEGER,"Quittung_ID" INTEGER,CONSTRAINT SYS_FK_59 FOREIGN KEY("Ware_ID") REFERENCES "Ware"("ID"))
CREATE CACHED TABLE "Quittung"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULLPRIMARY KEY,"Datum" DATE)

Anschließend werden noch Änderungen an den Tabellen vorgenommen, damit die Beziehungen(«REFERENCES») stimmig sind
ALTER TABLE "Verkauf" ADD CONSTRAINT SYS_FK_76 FOREIGN KEY("Quittung_ID")
REFERENCES "Quittung"("ID")SET TABLE "Ware" INDEX'608 20'
SET TABLE "Verkauf" INDEX'1872 1656 1872 12'
SET TABLE "Quittung" INDEX'2232 1'

Nach der Einstellung der Position des Indexes in der data-Datei (erscheint nur hier in der scriptDatei, wird nie direkt in SQL eingegeben!) werden die automatisch hoch schreibenden Felder derTabellen («AutoWert») so eingestellt, dass sie die nächsten Werte bei Neueingaben erstellen. So
ist z.B. der letzte eingetragene Wert im Feld "ID" der Tabelle "Ware" die Nummer 19. Das automatische Hochschreiben beginnt also mit der Nummer 20.
ALTER TABLE "Ware" ALTER COLUMN "ID" RESTART WITH 20
ALTER TABLE "Verkauf" ALTER COLUMN "ID" RESTART WITH 12
ALTER TABLE "Quittung" ALTER COLUMN "ID" RESTART WITH 1
CREATE USER SA PASSWORD ""GRANT DBA TO SA
SET WRITE_DELAY 60

Behebung von VersionsproblemenWenn, wie auf den folgenden Seiten beschrieben, die externe HSQLDB verwendet wird, kanneventuell ein weiteres Problem mit den *.odb-Dateien in Verbindung mit manchen LO-Versionen
auftauchen. Wird eine externe HSQLDB genutzt, so ist der sicherste Weg der über das hsqldb.jarArchiv, das mit LO mitgeliefert wird. Wird ein anderes Archiv verwendet, so kann das dazu führen,
dass die internen Datenbanken plötzlich nicht mehr zugänglich sind. Dies liegt daran, dass LO inden Versionen 3.3 und 3.4 Schwierigkeiten hat, zwischen interner und externer HSQLDB zu unterscheiden und Meldungen von einem Versionskonflikt produziert.
Lassen sich interne Datenbanken nicht mehr öffnen so hilft pragmatisch erst einmal nur, LO ab der
Version 3.5 zu nutzen. Ansonsten muss als externe Datenbank die mitgelieferte hsqldb.jar-Datei
genutzt werden. Außerdem muss aus der *.odb-Datei das database-Verzeichnis extrahiert werden.
Die Datei properties hat hier einen Eintrag, der in LO 3.3 zu dieser Fehlermeldung führt:version=1.8.1
steht in Zeile 11.
Diese Zeile ist zu ändern auf
version=1.8.0
Datenbankreparatur für *.odb-Dateien

23

Danach ist das database-Verzeichnis wieder in das *.odb-Päckchen einzulesen und die Datenbank
lässt sich auch wieder unter LO 3.3 öffnen.

Weitere Tipps
Wenn aus irgendwelchen Gründen wohl die Datenbankdatei geöffnet wird, aber kein Zugang mehrzu den Tabellen existiert, kann direkt über Extras → SQL der Befehl SHUTDOWN SCRIPT eingegeben werden. Anschließend wird die Datenbank geschlossen und neu gestartet. Das Ganze funktioniert aber nicht, wenn bereits ein «Error im Script-file» gemeldet wird.
Die Daten der Datenbank liegen in der *.odb-Datei im Unterverzeichnis «database». Hier gibt es
eine Datei «data» und eine Datei «backup». Ist die Datei «data» defekt, so kann sie über die Datei«backup» wiederhergestellt werden. Hierzu muss die im Verzeichnis «database» liegende Datei«properties» bearbeitet werden. Hier gibt es eine Zeile «modified=no». Diese muss umgeschrieben werden zu «modified=yes». Das zeigt dem System an, dass die Datenbank nicht korrekt beendet wurde. Jetzt wird aus der komprimierten «backup»-Datei beim Neustart eine neue «data»Datei erstellt.

Datenbankverbindung zu einer externen HSQLDBDie interne HSQLDB unterscheidet sich erst einmal nicht von der externen Variante. Wenn, wie im
Folgenden beschrieben, erst einmal nur der Zugriff auf die Datenbank nach außerhalb gelegt werden soll, dann ist keine Serverfunktion erforderlich. Hier reicht schlicht das Archiv, was in LO mitgeliefert wurde. Im LO-Pfad liegt unter /program/classes/hsqldb.jar. Die Verwendung dieses Archivs
ist die sicherste Variante, da dann keine Versionsprobleme auftauchen.
Die externe HSQLDB steht unter http://hsqldb.org/ zum Download frei zur Verfügung. Diese anderen Versionen sollten allerdings nur genutzt werden, wenn Klarheit darüber besteht, wie Versionsprobleme zwischen interner und externer Variante behoben werden können.

Der Datenbanktreiber muss, sofern er nicht in dem Pfad der Java-Runtime liegt, als ClassPathunter Extras – Optionen – Java hinzugefügt werden.

Datenbankverbindung zu einer externen HSQLDB

24Die Verbindung zu der externen Datenbank erfolgt über JDBC. Die Datenbankdateien sollen in
einem bestimmten Verzeichnis abgelegt werden. Dieses Verzeichnis kann beliebig gewählt werden. Es liegt in dem folgenden Beispiel im home-Ordner. Nicht angegeben ist hier der weitere Verzeichnisverlauf sowie der Name der Datenbank.
Wichtig, damit auch Daten in die Datenbank über die GUI geschrieben werden können, muss:
ergänzend neben dem Datenbanknamen «;default_schema=true» stehen. Dies kann noch
durch ein «;shutdown=true» ergänzt werden, damit die DB nach dem Schließen von LO heruntergefahren wird.
Also:
jdbc:hsqldb:file:/home/PfadZurDatenbank/Datenbankname;default_schema=true;
shutdown=true
In dem Ordner befinden sich die Dateien
Datenbankname.backup
Datenbankname.data
Datenbankname.properties
Datenbankname.script
Datenbankname.log

Weiter geht es mit der Angabe des Standardnutzers, sofern nichts an der HSQLDB-Konfiguration
geändert wurde:

Datenbankverbindung zu einer externen HSQLDB

25

Damit ist die Verbindung erstellt und es kann auf die Datenbank zugegriffen werden.

Vorsicht

Wird eine externe Datenbank mit einer Version HSQLDB 2.* bearbeitet, so kann sie
anschließend nicht mehr in eine interne Datenbank unter LibreOffice umgewandelt
werden. Dies liegt an den zusätzlichen Funktionen, die in der Version 1.8.* nochnicht vorhanden sind. Dadurch endet der Aufruf mit der Version 1.8.* bereits beim
Einlesen der Script-Datei der Datenbank.
Ebenso wenig kann eine externe Datenbank, die einmal mit einer Version der 2erReihe bearbeitet wurde, anschließend wieder mit der externen Version 1.8.* bearbeitet werden, die kompatibel zu LibreOffice ist.
Auch kann bei der Nutzung einer anderen Version in der externen Datenbank die
Version der internen Datenbank überschrieben werden. Der Aufruf als interne Datenbank ist dann unmöglich.

Parallelinstallation von interner und externer HSQLDBDie Einbindung der externen Datei hsqldb.jar in den Class-Pfad kann bei unterschiedlichen Versionen dazu führen, dass interne Datenbanken anschließend nicht mehr zu öffnen sind. Base kommt
mit den gleichlautenden Treibern nicht zurecht und will die externe Variante auch für die internen
Datenbanken nutzen. Das geht beim ersten Öffnen noch gut. Beim zweiten Öffnen kommt dannaber die Meldung, dass die Datenbank nicht mehr zu öffnen ist, da sie mit einer neueren Version
der HSQLDB geschrieben wurde.
Dem kann abgeholfen werden, indem für die externen Datenbanken die Datei hsqldb.jar nicht überden Class-Pfad in LO fest eingegeben wird, sondern stattdessen der Class-Pfad für die jeweilige
Datenbankdatei über ein Makro geschrieben wird, wie auch hier zu lesen ist.

Parallelinstallation von interner und externer HSQLDB

26SUB Start
Const cPath = "/home/bob/public_html/hsqldb_test/hsqldb.jar"
DIM oDataSource AS OBJECTDIM oSettings AS OBJECT
DIM sURL AS STRING
sURL = ConvertToURL(cPath)oDataSource = ThisComponent.DataSource
oSettings = oDataSource.Settings
oSettings.JavaDriverClassPath = sURL
END SUB

Hier wird die Datei «hsqldb.jar» unter Linux in dem o.g. Pfad abgelegt. Anschließend wird dieser
Pfad der momentan geöffneten Datenbank als Treiberdatei zugewiesen.
Dieses Makro wird nach dem Öffnen der *.odb-Datei einmal aufgerufen. Es schreibt dann in die inder *.odb-Datei befindlichen Datei content.xml die entsprechende Verbindung zur Java-Klasse:<db:data-source-settings><db:data-source-setting
db:data-source-setting-is-list="false"
db:data-source-setting-name="JavaDriverClass"db:data-source-setting-type="string"><db:data-source-setting-value>org.hsqldb.jdbcDriver</db:data-source-setting-value></db:data-source-setting><db:data-source-setting
db:data-source-setting-is-list="false"
db:data-source-setting-name="JavaDriverClassPath"db:data-source-setting-type="string"><db:data-source-setting-value>
file:///home/robby/public_html/hsqldb_test/hsqldb.jar</db:data-source-setting-value></db:data-source-setting></db:data-source-settings>

Letztlich könnte also auch ohne das Makro ein entsprechender Pfad direkt in die content.xml der*.odb-Datei eingetragen werden. Nur ist dieser Weg für den Normalnutzer sicher nicht so komfortabel zu handhaben.

Änderung der Datenbankverbindung zur externen HSQLDBDie interne HSQL-Datenbank hat den Nachteil, dass die Abspeicherung der Daten innerhalb eines
gepackten Archivs erfolgt. Erst mit dem Packen werden alle Daten festgeschrieben. Dies kannleichter zu Datenverlust führen als es bei der Arbeit mit einer externen Datenbank der Fall ist. Im
folgenden werden die Schritte gezeigt, die notwendig sind, um den Umstieg einer bestehenden
Datenbank vom *.odb-Päckchen zur externen Version in HSQL zu erreichen.
Aus einer Kopie der bestehenden Datenbank wird das Verzeichnis «database» extrahiert. Der
Inhalt wird in das oben beschriebene frei wählbare Verzeichnis kopiert. Dabei sind die enthaltenen
Dateien um den Datenbanknamen zu ergänzen:
Datenbankname.backup
Datenbankname.data
Datenbankname.properties
Datenbankname.script
Datenbankname.log
Jetzt muss noch die «content.xml» aus dem *.odb-Päckchen extrahiert werden. Hier sind mit
einem einfachen Texteditor die folgenden Inhalte zu suchen, die leider in einer durchlaufenden
Zeile stehen:<db:connection-data><db:connection-resource xlink:href="sdbc:embedded:hsqldb"/>Änderung der Datenbankverbindung zur externen HSQLDB

27

<db:login db:is-password-required="false"/></db:connection-data><db:driver-settings
db:system-driver-settings=""
db:base-dn=""db:parameter-name-substitution="false"/>

Diese Zeilen sind mit der Verbindung zur externen Datenbank zu ersetzen, hier der Verbindung zu
einer Datenbank mit dem Namen "medien", die jetzt im Verzeichnis «hsqldb_data» liegt.
<db:connection-data><db:connection-resource
xlink:href="jdbc:hsqldb:file:/home/robby/Dokumente/Datenbanken/hsqldb_data/medien;def
ault_schema=true;shutdown=true"/><db:login db:user-name="sa" db:is-password-required="false"/></db:connection-data><db:driver-settings
db:java-driver-class="org.hsqldb.jdbcDriver"/>

Falls, wie oben geschrieben, die Grundkonfiguration der HSQLDB nicht angetastet wurde stimmt
auch der Nutzername und die nicht erforderliche Passworteinstellung.
Nach Änderung des Codes muss die content.xml wieder in das *.odb-Päckchen eingepackt werden. Das Verzeichnis «database» ist in dem Päckchen jetzt überflüssig. Die Daten werden in
Zukunft durch die externe Datenbank zur Verfügung gestellt.

Änderung der Datenbankverbindung für einen Mehrbenutzerbetrieb
Für die Mehrbenutzerfunktion muss die HSQLDB über einen Server zur Verfügung gestellt werden.
Wie die Installation des Servers erfolgt ist je nach Betriebssystem unterschiedlich. Für OpenSuSE
war nur ein entsprechendes Paket herunter zu laden und der Server zentral über YAST zu starten(Runlevel-Einstellungen). Nutzer anderer Betriebssysteme und Linux-Varianten finden sicher
geeignete Hinweise im Netz.
Im Heimatverzeichnis des Servers, unter SuSE /var/lib/hsqldb, befinden sich unter anderem ein
Verzeichnis «data», in dem die Datenbank abzulegen ist, und eine Datei «server.properties», dieden Zugang zu den (eventuell also auch mehreren) Datenbanken in diesem Verzeichnis regelt.
Die folgenden Zeilen geben den kompletten Inhalt dieser Datei auf dem Rechner wieder. Es wird
darin der Zugang zu 2 Datenbanken geregelt, nämlich der ursprünglichen Standard-Datenbank(die als neue Datenbank genutzt werden kann) als auch der Datenbank, die aus der *.odb-Datei
extrahiert wurde.
# Hsqldb Server cfg file.
# See the Advanced Topics chapter of the Hsqldb User Guide.
server.database.0
server.dbname.0
server.urlid.0

file:data/db0
firstdb
db0-url

server.database.1
server.dbname.1
server.urlid.1

file:data/medien
medienmedien-url

server.silent
server.trace

true
false

server.port
9001
server.no_system_exit

true

Die Datenbank 0 wird mit dem Namen "firstdb" angesprochen, obwohl die einzelnen Dateien indem Verzeichnis data mit "db0" beginnen. Die neue Datenbank wird als "Datenbank 1" hinzugefügt. Hier sind Datenbankname und Dateibeginn identisch.
Änderung der Datenbankverbindung zur externen HSQLDB

28

Die beiden Datenbanken werden mit folgenden Zugängen angesprochen:
jdbc:hsqldb:hsql://localhost/firstdb;default_schema=true
username sa
password
jdbc:hsqldb:hsql://localhost/medien;default_schema=true
username sa
password
Die URL wurde hier bereits jeweils um den für den Schreibzugang über die grafische Benutzeroberfläche von LO erforderlichen Zusatz «;default_schema=true» ergänzt.
Wenn tatsächlich im Serverbetrieb gearbeitet werden soll ist natürlich aus Sicherheitsgründen zuüberlegen, ob die Datenbank nicht mit einem Passwort geschützt werden soll.
Nun erfolgt die Serververbindung über LO. Im Hauptfenster von Base wird Bearbeiten → Datenbank → Eigenschaften aufgesucht.

Mit diesen Zugangsdaten wird auf den Server des eigenen Rechners zugegriffen. Im Netzwerk mit
anderen Rechnern müsste dann entweder über Rechnernamen oder die IP-Adresse auf den Server, der ja auf dem aktuellen Rechner läuft, zugegriffen werden.
Beispiel: Der Rechner hat die IP 192.168.0.20 und ist im Netz bekannt mit dem Namen lin_serv.
Jetzt ist an anderen Rechnern für die Verbindung zur Datenbank einzugeben:
jdbc:hsqldb:hsql://192.168.0.20/medien;default_schema=truebzw.:
jdbc:hsqldb:hsql://lin_serv/medien;default_schema=true
Die Datenbank ist nun angebunden und kann beschrieben werden. Hier kann allerdings ein
zusätzliches Problem auftauchen. Die vorher automatisch generierten Werte werden plötzlich nicht
mehr hochgeschrieben. Hier fehlt es noch an einer zusätzlichen Einstellung.

Änderung der Datenbankverbindung zur externen HSQLDB

29

Autoinkrementwerte mit der externen HSQLDBFür die Nutzung der Auto-Werte müssen je nach Version von Base bei der Tabellenerstellung verschiedene Wege beschritten werden. Allen gleich ist erst einmal der folgende Eintrag unter Bearbeiten → Datenbank → Erweiterte Einstellungen erforderlich:

Mit dem Zusatz GENERATED BY DEFAULT AS IDENTITY(START WITH 0) soll die Funktion
des automatisch hochzählenden Wertes für den Primärschlüssel erstellt werden. Die GUI vonLO übernimmt zwar diesen Befehl (auch in der aktuellen LO-Version), schreibt davor aber leider
die Anweisung NOT NULL, so dass die Reihenfolge der Befehlsfolge für die HSQLDB nicht lesbar
ist. Hierbei ist zu berücksichtigen, dass die HSQLDB mit dem obigen Befehl ja bereits mitgeteilt
bekommt, dass das entsprechende Feld den Primärschlüssel enthält.

HinweisIn LO ist deshalb die Eingabe des Autowertes in der GUI nicht möglich. Nutzer dieser Versionen erstellen zuerst eine Tabelle mit einem Primärschlüsselfeld ohne Autowert und geben dann direkt über Extras → SQL ein:
ALTER TABLE "Tabellenname" ALTER COLUMN "ID" INT GENERATED BYDEFAULT AS IDENTITY(START WITH 0)… wobei davon ausgegangen wird, dass das Primärschlüsselfeld den Namen "ID"hat.

Mit dem Auslesen des letzten Wertes und dem Hochlesen zum nächsten Wert hingegen klappt es
in allen Versionen von LO über den Befehl CALL IDENTITY(). Dies trifft dann z.B. auf die
Lösung zu, die Datenbank zuerst einmal als «*.odb-Päckchen» zu erstellen, gründlich zu testen
und danach dann die Datenbanktabellen einfach auszulagern.

Änderung der Datenbankverbindung zur externen HSQLDB

30

Sämtliche Abfragen, Formulare und Berichte lassen sich so weiter nutzen, da die Datenbank für
die «*.odb-Datei» weiter auf die gleiche Weise angesprochen wird und eventuell spezifische SQLBefehle mit der externen HSQLDB weiter gelesen werden können.

Änderung der Datenbankverbindung zur externen HSQLDB

31