Verwendung der Funktion DLOOKUP

Hier erläutern wir praktische Szenarien für die Druckausgabe, die mit Hilfe der VisualBasic Funktion DLOOKUP umgesetzt werden können

Die Verwendung von Listengeneratorfunktionen für die Druckausgabe ist zwar für den Benutzer relativ bequem, hat aber den Nachteil, dass nicht gesteuert werden kann, welche Angaben ausgegeben werden und in welcher Formatierung. Wenn ich beispielsweise für einen Export den Versicherungswert als unformatierten Zahlenwert zum Weiterrechnen in Microsoft Excel ausgeben will, stoße ich bei den in MuseumPlus eingebauten Listengeneratorfunktionen schnell an Grenzen.

Glücklicherweise erlaubt der Listengenerator in MuseumPlus auf die Verwendung von VisualBasic-Funktionen. Diese werden wie normale Feldnamen in der Spalte Feld oder Ausdruck in der Listendefinition hinterlegt. Bei der Druckausgabe wird dann die entsprechende Funktion ausgeführt und ihr Rückgabewert wie ein normaler Feldinhalt ausgegeben.

Eine dieser praktischen VisualBasic-Funktionen ist die Funktion DLOOKUP. Es handelt sich um eine Funktion, mit der man direkt auf die Datenbanktabellen der MuseumPlus-Datenbank zugreifen und gezielt Werte auslesen kann. Zur Entwarnung sei gesagt: Man kann dabei nichts "kaputtmachen", da ausschließlich lesender Zugriff erlaubt ist.

Verwendung von DLOOKUP

Um die Funktion im Listengenerator von MuseumPlus zu verwenden, wird der Funktionsname mit einem vorangestellten Gleichheitszeichen in die Spalte Feld oder Ausdruck der Listendefinition hineingeschrieben.

=DLOOKUP("Feldliste","Tabelle","Suchkriterium")

Der Funktion selbst müssen dabei noch folgende Parameter mitgegeben werden, die grundsätzlich vollständig von doppelten Anführungszeichen umschlossen sein müssen:

1. Feldliste

Dieser Parameter enthält die Datenfelder aus der ausgelesenen Tabelle, welche von der Funktion ausgegeben werden sollen. Sollen mehrere Felder ausgegeben werden, müssen die Feldbezeichnungen durch Komma voneinander getrennt werden.

Die spannende Frage ist zunächst, woher man die entsprechenden Feldbezeichnungen bekommt, da es sich dabei ja um die Bezeichnungen der Datenfelder in der Datenbank handelt, die komplett anders lauten als die entsprechenden Felder in den Masken von MuseumPlus. Zum Glück bietet MuseumPlus seit der Version 4.5 eine nützliche Funktion, mit der alle Feldbezeichnungen inklusive des Datenbankfeldnamens aller Eingabefelder angezeigt werden können. Dazu stellt man die Einfügemarke in das gewünschte Datenfeld in MuseumPlus, drückt die Taste <F3> und bekommt dann in einem separaten Fenster alle Feldbezeichnungen angezeigt. Die für die Verwendung in der Funktion DLOOKUP relevante Bezeichnung ist der generische Feldname.

Neben den eigentlichen Feldbezeichnungen kann der Parameter aber auch unveränderlichen Text oder sogar weitere VisualBasic-Funktionen enthalten, mit denen das entsprechende Datenfeld vor der Druckausgabe formatiert werden kann. Im Folgenden habe ich ein paar Beispiele für den Parameter Feldliste zusammengestellt:

Verknüpfung mehrerer Datenfelder

"OwePreisF & OweWaehrungS"

Die einzelnen Felder werden dabei durch "&" getrennt.

Verwendung fester Texte und Trennzeichen

"'Wert: ' & OwePreisF & ' ' & OweWaehrungS"

Die unveränderlichen Textbestandteile werden dabei von einfachen Anführungszeichen umschlossen.

Verwendung von VisualBasic-Funktionen zur Formatierung

"FORMAT (OwePreisF,'#,##0.00') & ' ' & OweWaehrungS"

2. Tabelle

Der zweite Parameter der Funktion DLOOKUP enthält den Namen der Tabelle, welche die gewünschten Datenfelder enthält. Anders als bei Ermittlung der generischen Datenfeldnamen gibt es in MuseumPlus leider (oder zum Glück) keine Funktion, mit deren Hilfe der Anwender den Namen der Tabelle ermitteln kann, in der sich ein bestimmtes Datenfeld befindet. Daher habe ich hier eine kleine Übersicht über die wichtigsten Tabellen von MuseumPlus zusammengestellt. Jedes Datenfeld in MuseumPlus trägt ein Präfix aus drei Buchstaben, aus dem sich mit Hilfe des Übersicht der Name der zugehörigen Tabelle in der Datenbank ermitteln lässt.

Für "Datenbankspezialisten" sei noch kurz angemerkt: Die Funktion DLOOKUP liest grundsätzlich nur Werte aus jeweils EINER Tabelle aus, es ist also nicht möglich, mit einem einzigen DLOOKUP-Aufruf Werte aus unterschiedlichen Tabellen abzurufen.

3. Suchkriterium

Der dritte Parameter der Funktion enthält nun das einschränkende Kriterium, damit die Funktion nicht "irgendeinen" Datensatz aus der Datenbank abruft, sondern möglichst den gewünschten. Weiter oben hatte ich bereits als Beispiel die Abfrage von Wertangaben (z.B. Versicherungswerte etc.) 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 den Versicherungswert 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]

Das reicht allerdings noch nicht ganz, zusätzlich schränke ich noch ein, dass ich nur Werte vom Typ Versicherungswert erhalte:

"OweObjId=" & [ObjId] & " AND OweGeschaeftS='Versicherungswert'"

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.

Um das Beispiel also zu komplettieren, sähe die vollständige DLOOKUP-Anweisung zur Abfrage der Versicherungswertes eines Objektes folgendermaßen aus:

=DLOOKUP("FORMAT (OwePreisF,'#,##0.00') & ' ' & OweWaehrungS","ObjHandel","OweObjId=" & [ObjId] & " AND OweGeschaeftS='Versicherungswert'")

Einschränkungen

Trotz der vielen Möglichkeiten, welche die Funktion eröffnet, sei ein Nachteil nicht verschwiegen: Es kann jeweils nur ein Datensatz ausgegeben werden. Treffen die der Funktion mitgegebenen Suchkriterien auf mehrere Datensätze zu, wird nur der erste gefundene Datensatz bei der Ausgabe berücksichtigt. Seit der MuseumPlus Version 5.0.02 038 steht allerdings die Funktion DBPRINT im Listengenerator zur Verfügung, welche diesen Nachteil ausgleicht und die Ausgabe mehrerer Datensätze erlaubt und die hier genauer beschrieben ist.