Bedingte Ausgabe von Feldinhalten

Hier erfahren Sie, wie Sie die Ausgabe bestimmter Feldinhalte von Bedingungen abhängig gestalten können. 

Schon die Überschrift klingt technisch und damit abschreckend, ich weiß. Dennoch - eigentlich ist das dahinter stehende Prinzip ganz einfach. Was ich vorhabe, ist umgangssprachlich ausgedrückt Folgendes: "Wenn sich im Feld ein bestimmter Inhalt befindet (oder nicht befindet), soll das Eine ausgegeben werden, anderenfalls etwas Anderes."

Im Listengenerator von MuseumPlus kann man genau dies mit einem einfachen, aber wirkungsvollen Befehl erreichen:

=IIF("Bedingung","Anweisung, wenn zutreffend","Anweisung, wenn nicht zutreffend")

Der VBA-Befehl IIF erwartet also drei Parameter, die folgende Bedeutung haben:

  • Bedingung
    Dies ist ein logischer Ausdruck (also z.B. eine Vergleichsoperation), die wahr (zutreffend) oder falsch (nicht zutreffend) werden kann.
  • Anweisung, wenn zutreffend
    Dies ist eine Anweisung, die ausgeführt oder ein Text, der ausgegeben wird, wenn die Bedingung wahr (zutreffend) ist.
  • Anweisung, wenn nicht zutreffend
    Dies ist eine Anweisung, die ausgeführt oder ein Text, der ausgegeben wird, wenn die Bedingung falsch (nicht zutreffend) ist.

Bevor ich ein wenig näher auf den ersten Parameter, die Bedingung, eingehe, möchte ich noch kurz auf den Artikel über die Schreibweise von Feldnamen verweisen. Ich verwende in den folgenden Beispielen stets die Schreibweise [generischer Feldname].

Die Parameter der Funktion IIF

Der Parameter Bedingung

Wie bereits erwähnt steckt hinter diesem Parameter ein logischer Ausdruck, der entweder zutreffen kann oder nicht. In der booleschen Algebra spricht man dabei von den Zuständen wahr und falsch. Ein einfaches Beispiel für einen solchen Ausdruck:

[ObjJahrVonL] < 0

In diesem Beispiel wird überprüft, ob der Inhalt des Feldes [ObjJahrVonL] (also des Feldes Jahr von im Modul Sammlung) kleiner als der Wert 0 ist. Diese Vergleichsoperation kann entweder wahr werden, wenn das Feld tatsächlich einen Wert kleiner 0 enthält, oder sie wird falsch, wenn das Feld einen Wert gleich oder größer 0 enthält.

Eine interessante Möglichkeit bietet auch die ausschließliche Verwendung eines Feldnamens ohne Angabe irgendwelcher Vergleichoperatoren:

[ObjInventarNrS]

In diesem Fall wird überpüft, ob das Feld mit irgendeinem Inhalt gefüllt ist oder nicht. Ist das Feld gefüllt, wird der Ausdruck wahr, ist es leer, wird der Ausdruck falsch. Genaugenommen ist diese Schreibweise eine Kurzform für eine Funktion, die VisualBasic für die Arbeit mit Datenbankinhalten bereitstellt. Bei Datenbanken spricht man davon, dass ein Feld den Wert NULL enthält, wenn es nicht ausgefüllt ist. Und dieser Zustand kann auch mit folgendem Ausdruck abgefragt werden:

IsNull([ObjInventarNrS])

Dieser Ausdruck tut exakt das Gleiche wie der zuvor. Die Funktion IsNull() überprüft also, ob der Wert zwischen den runden Klammern den Wert NULL enthält und liefert den Wert wahr, wenn dem so ist, falsch, wenn dem nicht so ist.

Die Parameter Anweisung, wenn zutreffend / nicht zutreffend

Diese Parameter können zum Beispiel einfach nur einen Feldnamen enthalten. In diesem Fall wird der Inhalt des Feldes ausgegeben, wenn die Bedingung zutrifft bzw. nicht zutrifft. Ein Beispiel:

=IIF([ObjInventarNrS],[ObjInventarNrS],[ObjReferenzNrS])

Hier wird zunächst überprüft, ob das Feld Inventar Nr. im Modul Sammlung ausgefüllt ist. Wenn das so ist, wird der erste Parameter der IIF-Funktion ausgeführt. Der enthält ebenfalls nur den generischen Feldnamen des Feldes Inventar Nr., also wird der Feldinhalt dieses Feldes ausgegeben. Trifft die Bedingung nicht zu, wird der zweite Parameter der IIF-Funktion ausgeführt. Der enthält den generischen Feldnamen des Feldes Referenz-Nr., also wird in diesem Fall der Inhalt dieses Feldes ausgegeben.

Natürlich kann statt eines Feldinhaltes auch statischer Text ausgegeben werden:

=IIF([ObjInventarNrS],[ObjInventarNrS],"Keine Inventar-Nr. angegeben")

In diesem Beispiel wird im Fall, das das Feld Inventar Nr. nicht ausgefüllt ist, der Text "Keine Inventar-Nr. angegeben" ausgegeben.

Einige Beispiele für bedingte Druckausgaben

Beispiel 1: Vergleichsoperation

Im folgenden Beispiel wird überprüft, ob der Inhalt des Feldes Jahr von (es handelt sich dabei um ein Zahlenfeld) kleiner 0 ist. Wenn das so ist, soll der Wert als positiver Wert, ergänzt um den Text v.Chr. ausgegeben werden.

Aus dem Feldinhalt -250 soll also 250 v.Chr. werden:

=IIF([ObjJahrVonL]<0,[ObjJahrVonL] * -1 & " v.Chr.", [ObjJahrVonL])

Interessant ist hier die Anweisung, die ausgeführt wird, wenn die Bedingung zutrifft. Es wird zunächst der Feldinhalt des Feldes Jahr von mit -1 multipliziert, um einen positiven Wert zu erhalten. Anschließend wird durch das Zeichen die Zeichenfolge " v.Chr." an das Ergebnis dieser arithmetischen Operation quasi angeklebt.

Beispiel 2: Abfrage von Datenfeldern und Datensätzen

In diesem Beispiel möchte ich zeigen, wie man die Funktion DLOOKUP dazu verwenden kann, zu überprüfen, ob ein bestimmtes Datenfeld in MuseumPlus ausgefüllt ist oder nicht. Jetzt stellt sich möglichweise die eine oder der andere die Frage, warum ich dafür die Funktion DLOOKUP benötige. Weiter oben habe ich ja bereits gezeigt, wie man diesen Fall durch einfaches Angeben eines Feldnamens in der Bedingung der IIF-Funktion abdecken kann. Das Problem dabei ist: Es gibt einige Datenfelder in MuseumPlus, bei denen das so nicht funktioniert.

Möchte ich beispielsweise überprüfen, ob ein Objekt im Modul Sammlung Verknüpfungen zu anderen Sammlungsobjekten über die Funktion Objekt-Objekt-Verknüpfung enthält, kann ich das durch einfache Angabe eines Feldnamens als Bedingung nicht bewerkstelligen. Das funktioniert einfach ausgedrückt immer dann nicht, wenn es sich bei dem zu überprüfenden Feld eigentlich um eine Liste von Einträgen handelt (also z.B. Maße, Werte, Künstler, Objektverknüpfungen, Ausstellungs- und Literaturverknüpfungen usw.). Das Beispiel für die Objektverknüpfung sieht dabei folgendermaßen aus:

=IIF(DLOOKUP("OobObj2ID","ObjObj","OobBeziehungS='Teil von' AND OobObj1Id=" & [ObjId]),"Verknüpfung(en) vorhanden","Keine Verknüpfung(en) vorhanden")

Die Bedingung stellt in diesem Fall die Funktion DLOOKUP dar. Diese liefert den Wert NULL, wenn keine Objektverknüpfungen gefunden werden - und damit den Wert falsch. Wird hingegen eine Verknüpfung gefunden, liefert die Funktion die Objekt-ID des ersten gefundenen, verknüpften Objektes - was von IIF als wahr interpretiert wird.

Mehr Informationen zum Auslesen von Objektverknüpfungen finden sich hier.

Beispiel 3: Bedingte Kombination von Feldinhalten

Bisweilen stellt sich die Notwendigkeit, das die Inhalte zweier Felder - getrennt duch ein Trennzeichen oder einen kurzen Text - in der Druckausgabe kombiniert werden sollen. Das Problem ist dabei, das Trennzeichen oder den trennenden Text nur dann auszugeben, wenn das zweite Feld überhaupt ausgefüllt ist. Das kann auf folgende Weise gelöst werden:

=IIF([ObjDatierungS],[ObjTitelOriginalS] & ", " & [ObjDatierungS], [ObjTitelOriginalS] & ", ohne Datierung")

Im gezeigten Beispiel wird zunächst überprüft, ob das Feld Datierung ausgefüllt ist. Wenn dem so ist, wird das Feld Titel (Original), gefolgt von einem Leerzeichen und dem Feld Datierung ausgegeben. Anderenfalls wird statt des Feldes Datierung der Text "ohne Datierung" ausgegeben.

Beispiel 4: Bedingte Kürzung von Feldinhalten

Bisweilen können Textfelder durchaus auch viel Text enthalten, und nicht immer ist es gewünscht, den kompletten Text auszugeben. Im folgenden Beispiel soll ein Textfeld auf eine maximale Länge von 30 Zeichen für die Ausgabe gekürzt werden. Um sichtbar zu machen, dass tatsächlich noch mehr Text im Feld steht, sollen in diesem Fall drei Punkte an den gekürzten Feldinhalt angehängt werden:

=IIF(LEN([ObjTitelWeitereM])>30,LEFT([ObjTitelWeitereM],30) & "...", [ObjTitelWeitereM])

Zur besseren Sichtbarkeit stelle ich die drei Parameter der Funktion IIF mal getrennt dar:

  • 1. Parameter: Bedingung
    LEN([ObjTitelWeitereM])>30
    Für die Überprüfung der Länge des Feldinhaltes wird die Funktion LEN benutzt.
  • 2. Parameter: Anweisung, wenn Bedingung wahr ist
    LEFT([ObjTitelWeitereM],30) & "..."
    Die FunktionLEFT liefert die ersten 30 Zeichen des Feldes, an die dann noch "..." angehängt wird.
  • 3. Parameter: Anweisung, wenn Bedingung falsch ist
    [ObjTitelWeitereM]
    Hier passiert nichts Besonderes, es wird einfach nur der Inhalt des Feldes ausgegeben

Mehr Informationen zu diesen beiden Funktionen LEN und LEFT finden sich im Artikel über die Ausgabe von Teilen eines Feldinhaltes.