Eigene Listengeneratorfunktionen mit DBPRINT

Die Funktion DBPRINT erlaubt die Erstellung komplexer Abfragen und die vollsändige Ausgabe aller resultierenden Werte

Im Artikel über die Funktion DLOOKUP wurde ja bereits beschrieben, wie man mit dieser Funktion relativ einfach auf beliebige Datenbankinhalte zurückgreife kann und die Ausgabe dieser Inhalte sogar noch formatieren kann. Leider hat die Funktion DLOOKUP den Nachteil, immer nur einen - nämlich den ersten auf die angegebenen Bedingungen zutreffenden - Datensatz auszugeben. Es ist also beispielsweise nicht möglich, mit dieser Funktion eine Auflistung aller Maßangaben oder Provenienzangaben eines Sammlungsobjektes in einem Bericht auszugeben.

Dafür steht ab der MuseumPlus Version 5.0.02 038 die Funktion DBPRINT zur Verfügung, welche diesen Nachteil nicht hat und obendrein ein paar zusätzliche Möglichkeiten bietet. Neben der Funktion, in Berichtsdefinitionen relativ einfach direkt auf die Datenstruktur zugreifen zu können, wurde eine einfache Syntax implementiert, um die ausgelesenen Werte mit wenigen Parametern auch gleich zu formatieren. Damit entfallen komplexe und schwer verständliche Kombinationen aus mehrere Funktionen im Listengenerator.

Verwendung von DBPRINT

Um die Funktion im Listengenerator von MuseumPlus zu verwenden, wird der Funktionsname DBPRINT wie gewohnt mit einem vorangestellten Gleichheitszeichen in die Spalte Feld oder Ausdruck der Listendefinition platziert. Die komplette Syntax der Funktion lautet:

=dbprint("feldliste","tabelle oder join","suchkriterium","sortierung","trennzeichen")

Die Funktion erlaubt die Angabe von bis zu fünf Kriterien, wobei nur die ersten beiden immer angegeben werden müssen - alle weiteren Parameter sind optional. Alle Kriterien werden als Text angegeben und als solcher jeweils von doppelten Anführungszeichen umschlossen:

1. Feldliste

Dieser Parameter enthält alle Felder, die aus der angegebenen Tabelle (oder dem angegebenen JOIN-Ausdruck) ausgelesen werden sollen. Es können also nur Felder angegeben werden, die in der entsprechenden Tabelle / dem angebenenen JOIN-Ausdruck auch enthalten sind. Da oft nicht nur ein Feld ausgelesen werden soll, können hier direkt mehrere Felder mit einem definierten Trennzeichen angegeben werden. Die für die Feldliste geltende Syntax sieht dabei so aus:

"feld oder zeichenkette@format[trennzeichen]feld oder zeichenkette@format"

Sieht auf den ersten Blick komplizierter aus, als es tatsächlich ist. Will ich zum Beispiel für die Liste aller einem Sammlungsobjekt zugewiesenen Werteangaben die Felder WerttypDatum des WertesWert und Währung mit der Funktion DBPRINT ausgeben, sieht der Parameter Feldliste folgendermaßen aus:

"OweAktionS[: ]OweEreignisD[, ]OwePreisF[ ]OweWaehrungS"

Wie man sieht, werden auch bei DBPRINT die Feldnamen als generische Feldnamen angegeben, die in MuseumPlus über die Tastenkombination <STRG>-I ermittelt werden können. Die gewünschten Trennzeichen werden wiederum in eckige Klammer zwischen die einzelnen Felder geschrieben - ausgegeben wird dabei natürlich nur der Text zwischen den eckigen Klammern, nicht die Klammern selbst. Ist eines der Felder in der Liste nicht ausgefüllt, wird das jeweilige Trennzeichen hinter dem Feld auch nicht ausgegeben. Auf diese Weise werden mehrere verwaiste Trennzeichen hintereinander in der Druckausgabe vermieden.

In der Syntaxbeschreibung des Parameters Feldliste taucht allerdings auch noch ein Parameter @format auf, der optional ist - also angegeben werden kann, aber nicht muss. Er dient dazu, das Feld, hinter dem er aufgeführt wird, auf eine bestimmte Weise zu formatieren. Verwendet werden kann diese Option nur bei Zahlen- und Datumsfeldern. Möchte ich also im oben genannten Beispiel vom Datum der Werteinträge nur das Jahr ausgeben und die Werteangaben mit Tausendertrennung und zwei Nachkommastellen ausgeben, muss ich Folgendes als Feldliste angeben:

"OweAktionS[: ]OweEreignisD@yyyy[, ]OwePreisF@standard[ ]OweWaehrungS"

Die Angabe von @yyyy bewirkt, dass vom vollständigen Datum nur die vierstellige Jahreszahl ausgegeben wird, während die Angabe @standard beim Wert automatisch die Formatierung als Währungsangabe, also mit Tausendertrennung und mit zwei Nachkommastellen bewirkt. Verwendet werden können als Format-Angabe alle Formatierungen, die auch in der gleichnamigen Funktion FORMAT erlaubt sind.

2. Tabelle oder Join

Der zweite Parameter der Funktion DBPRINT enthält normalerweise den Namen der Tabelle, welche die gewünschten Datenfelder enthält. Wie bereits bei der Funktion DLOOKUP erwähnt, kann diese Information direkt in MuseumPlus nicht ohne Weiteres ermittelt werden, aber in diesem Artikel findet sich eine kleine Übersicht über die wichtigsten Tabellen von MuseumPlus mit einer kurzen Beschreibung, wie man die Tabelle zu einem bestimmten Datenfeld identifizieren kann.

Für das oben bereits aufgeführt Beispiel, Werte eines Sammlungsobjektes auszugeben, würde nur eine einzelne Tabelle ausgelesen werden müssen; der Parameter würde wie folgt aussehen:

"ObjHandel"

Anders als bei DLOOKUP erlaubt aber DBPRINT, die Daten aus mehreren Tabellen gleichzeitig auszulesen. Wann brauche ich das? Zum Beispiel, um bei der Ausgabe aller einem Sammlungsobjekt zugeordneten Künstler nicht nur den Künstler und seine Lebensdaten, sondern auch die Attribute der Zuordnung vom Künstler zum jeweiligen Sammlungsobjekt (also zum Beispiel seine Rolle und Funktion bei der Erschaffung des Sammlungsobjekts) auszugeben. Diese Angaben sind in MuseumPlus in zwei verschiedenen Tabellen gespeichert, die aber mit Hilfe eines JOIN-Ausdrucks miteinander verknüpft und damit wie eine einzige Tabelle abgefragt werden können. Für das angesprochene Beispiel lauten die Namen der beiden Tabellen Obj_Kuenstler und Kuenstler. Um beide Tabellen miteinander verknüpfen zu können, brauche ich jeweils aus jeder Tabelle ein Feld, welches einen gemeinsamen Schlüssel enthält - also kennzeichnet, welche Datensätze aus beiden Tabellen zusammengehören. Diese Schlüsselfelder sind für die wichtigsten Tabellen ebenfalls hier aufgeführt. Für das erwähnte Beispiel würde also der JOIN-Ausdruck folgendermaßen aussehen:

"Obj_Kuenstler INNER JOIN Kuenstler ON Obj_Kuenstler.OkuKueId=Kuenstler.KueId"

Die Schlüsselfelder lauten also in den beiden Tabellen OkuKueId und KueId und enthalten jeweils die Datensatznummer des entsprechenden Künstlers.

3. Suchkriterium

Der dritte Parameter der Funktion DBPRINT enthält - im Übrigen vollkommen identisch zur Funktion DLOOKUP - das einschränkende Kriterium, damit die Funktion nicht "irgendeinen" Datensatz aus der Datenbank abruft, sondern eben den gewünschten. Weiter oben hatte ich bereits als Beispiel die Abfrage von Wertangaben aus dem Fenster Handel und Werte im Modul Sammlung angegeben. Wenn ich also z.B. das Suchkriterium formulieren wollte, um für ein bestimmtes Objekt alle Ausstellungs-Versicherungswerte zu ermitteln, würde ich das wie folgt tun: Zunächst möchte ich einschränken, dass ich nur Werte eines bestimmten Objektes erhalte. Im Listengenerator von MuseumPlus sähe dies dann so aus:

"ObjId=" & [ObjId]

Zusätzlich schränke ich noch ein, dass ich nur Werte vom Typ Vers.wert (Ausstellung) erhalte:

"OweObjId=" & [ObjId] & " AND OweGeschaeftS='Vers.wert (Ausstellung)'"

Man sieht, dass auch hier die Kenntnis der jeweiligen generischen Feldnamen eines Feldes erforderlich ist. Eine Besonderheit stellt die Angabe [ObjId] dar, die vom Listengenerator bei der Erzeugung der tatsächlichen Datenbankabfrage durch die Datensatznummern der jeweils abgefragten Objekte ersetzt wird.

4. Sortierung

Da die Funktion DBPRINT ja unter Umständen eine Liste von mehreren Werten auszugeben hat, wünscht man sich vielleicht, diese Werte in einer bestimmten Reihenfolge in der Auflistung zu sehen. Diese Reihenfolge kann mit diesem Parameter gesteuert werden. Als Sortierung wird der oder die generischen Feldnamen angegeben, nach denen sortiert werden sollen. Außerdem kann noch die Sortierrichtung angegeben werden. Lasse ich letztere weg, wird immer von aufsteigender Sortierreihenfolge ausgegangen.

Um noch einmal das Beispiel der Werte eines Sammlungsobjektes aufzugreifen: Die Sortierung nach dem Datum in absteigender Reihenfolge (also die neuesten Werte zuerst) würde so angegeben werden:

"OweEreignisD DESC"

Mögliche Sortierreihenfolgen sind ASC für aufsteigende und DESC für absteigende Sortierung.

5. Trennzeichen

Mit diesem Parameter wird festgelegt, welches Trennzeichen (oder welcher Text) verwendet werden soll, um mehrere auf die angegebenen Suchkriterien passende Datensätze voneinander zu trennen. Wird kein Trennzeichen angegeben, trennt DBPRINT die Datensätze einfach durch einen Zeilenumbruch.

Vollständige Verwendungsbeispiele für DBPRINT

Im folgenden sind einige Beispiele für die Verwendung von DBPRINT aufgeführt, die zum einen direkt im Listengenerator verwendet werden können, auf der anderen Seite aber vielleicht auch eine Idee von den vielen Einsatzmöglichkeiten für diese Funktion geben.

Einige Beispiele zur Verwendung im Modul Sammlung

Ausgabe aller Ausstellungs-Versicherungswerte eines Sammlungsobjektes, durch ";" getrennt:

DBPRINT("OweAktionS[: ]OweEreignisD@yyyy[, ]OwePreisF@standard[ ]OweWaehrungS","ObjHandel","OweObjId=" & [ObjId] & " AND OweGeschaeftS='Vers.wert (Ausstellung)'","OweEreignisD DESC",";")

Ausgabe aller Künstler / Beteiligten eines Sammlungsobjektes, nach dem Feld Sortierung sortiert und durch Zeilenumbruch getrennt:

DBPRINT("OkuFunktionS[, ]OkuArtS[:]KueVornameS[ ]KueNameS[, ]KueDatierungS","Obj_Kuenstler INNER JOIN Kuenstler ON Obj_Kuenstler.OkuKueId=Kuenstler.KueId","OkuObjId=" & [ObjId],"OkuSortL")