Ausgabe von Teilen eines Feldinhaltes

Nicht immer ist es erwünscht den ganzen Inhalt eines Feldes auszugeben. Manchmal kann es sinnvoll sein nur Teile eines Feldinhaltes in den Ausdruck zu übernehmen

Gerade in Listen, wenn Informationen in Spalten nebeneinander ausgedruckt werden sollen, ist Platz oft knapp. Wenn dann ein Feld besonders viel Text beinhaltet, kann dies das Layout der gesamten Liste sprengen. Abhilfe können im Listengenerator von MuseumPlus einige VBA-Funktionen schaffen, welche nur Teile eines Feldinhaltes ausgeben. In diesem Beitrag stelle ich diese Funktionen mit einigen leicht anwendbaren Beispielen vor.

Prüfen, ob ein Feld ausgefüllt ist mit ISNULL

Eine Besonderheit bei vielen Datenbanken - darunter MuseumPlus - ist, dass Datenfelder, die keinen Inhalt haben (also nicht ausgefüllt worden sind), eine Art Platzhalter enhalten, nämlich den Wert NULL. In MuseumPlus gibt es auch einen Suchoperator (in der deutschen Version lautet er Leer), mit ihm kann genau nach solchen Datenfeldern recherchiert werden.

Aber auch in Listendefinitionen leistet dieser spezielle Wert gute Dienste. Es kann nämlich mit einer Funktion überprüft werden, ob ein Feld diesen Wert enthält, um dann beispielsweise eine alternative Druckausgabe zu generieren. Die VBA-Funktion lautet ISNULL. Das folgende Beispiel zeigt, wie man sie im Listengenerator einsetzen kann:

=IIF(ISNULL([ObjInventarNrS], "Keine Inventarnummer angegeben", [ObjInventarNrS])

Dieses Beispiel nutzt zusätzlich die Funktion IIF, die im Artikel über die bedingte Ausgabe von Feldern erklärt ist. Man kann sich merken, dass die Funktion ISNULL immer den Wert wahr zurückliefert, wenn ein Feld keinen Inhalt hat. Ist ein Feld ausgefüllt, hat die Funktion den Wert falsch. Mit Hilfe eines einfachen logischen Operators kann ich die Funktionsweise auch umkehren, wie das folgende Beispiel zeigt:

=IIF(NOT ISNULL(DLOOKUP("ObmId", "ObjMass", "ObmTypS='Gewicht' AND ObmObjId=" & [ObjId]), "Gewicht beachten!", "")

Hier wird zunächst mit der Funktion DLOOKUP überprüft, ob für das aktuelle Objekt mindestens ein Maßeintrag vom Typ Gewicht existiert. Wenn das so ist, wird der Text "Gewicht beachten!" ausgegeben. Wenn nicht, erfolgt keine Ausgabe. Entscheidend ist in diesem Beispiel der Operator NOT, welcher eben aus dem "ist leer" des Befehls ISNULL ein "ist nicht leer" macht.

Zusammenfassend kann man also sagen, dass die Funktion ISNULL immer dann gut eingesetzt werden kann, wenn überprüft werden soll, ob ein Feld ausgefüllt ist, die Länge des Feldinhaltes aber keine Rolle spielt, so lange denn überhaupt einer (oder eben keiner) vorhanden ist.

Die Länge eines Feldinhaltes ermitteln mit LEN

Bevor man daran denkt, den Inhalt eines Feldes zu kürzen, sollte man erst einmal prüfen, wieviel Inhalt ein Feld denn überhaupt enthält. Dazu gibt es einen Befehl, der die Zeichenanzahl in einem Feld ermittelt und als Zahlenwert zurückliefert. Das folgende Beispiel zeigt den Einsatz der Funktion im Listengenerator von MuseumPlus:

="Das Feld enthält " & LEN([ObjTitelWeitereM]) & " Zeichen"

Die Funktion erwartet also nur einen einzigen Parameter, der die Zeichenkette oder das Datenfeld enthält, dessen Länge ermittelt werden soll. Bei Datenfeldern wird wohlgemerkt die ausgefüllte Länge ermittelt, nicht die Menge an Text, die das Feld maximal aufnehmen kann.

Die ersten n Zeichen eines Feldes ausgeben mit LEFT

Soll ein Feld gekürzt werden, stehen in VBA gleich mehrere Funktionen zur Verfügung, um dies zu bewerkstelligen. Eine davon ist LEFT, mit deren Hilfe eine bestimmte Anzahl von Zeichen (von links aus gelesen, daher left) aus der übergebenen Zeichenkette oder dem übergebenen Datenfeld ausgegeben werden können. Das folgende Beispiel zeigt, wie das in MuseumPlus angewendet werden kann:

=LEFT([ObjTitelWeitereM], 20)

Es werden in diesem Beispiel die ersten 20 Zeichen des Feldes Zusatztitel ausgegeben. Im Ausdruck kann das natürlich ziemlich unschön aussehen, da der Inhalt einfach abgeschnitten wird. Kombiniert man die Funktion LEN mit der Funktion LEFT in einer bedingten Ausgabe mittels IIF (alle, die jetzt immer noch wissen, was gemeint ist, dürfen sich als fortgeschrittene Listengeneratorprogrammierer betrachten...), dann sieht die Ausgabe deutlich schöner aus:

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

Der besseren Lesbarkeit halber zerlege ich das Beispiel mal in seine Einzelteile. Den Rahmen bildet eine Fallabfrage mit IIF, welche drei Parameter enthält:

  • 1. Parameter: Bedingung
    LEN([ObjTitelWeitereM]>20)
  • 2. Parameter: Aktion, wenn Bedingung zutrifft
    LEFT([ObjTitelWeitereM],20)
  • 3. Parameter: Aktion, wenn Bedingung nicht zutrifft
    [ObjTitelWeitereM]

Wenn das Feld Zusatztitel also mehr als 20 Zeichen enthält, wird es auf 20 Zeichen gekürzt und das Suffix "..." angehängt. Anderenfalls wird einfach das gesamte Feld ausgegeben.

Die letzten n Zeichen eines Feldes ausgeben mit RIGHT

Die Funktion RIGHT tut im Prinzip das Gleiche wie LEFT, nur dass sie eine Zeichenkette von rechts liest, also deren Ende ausgibt. Wenn ich also beispielsweise ein Feld habe, welches üblicherweise ein Datum in der Schreibweise DD.MM.JJJJ (also zum Beispiel 15.10.2007) enthält, und ich in der Ausgabe nur die Jahreszahl verwenden möchte, kann ich die Funktion RIGHT gut einsetzen:

=RIGHT([ObjDatierungS], 4)

Das oben gezeigte Beispiel ist natürlich ein wenig unzuverlässig, da es nicht berücksichtigt, dass das Feld Datierung im Modul Sammlung ein Textfeld ist und daher durchaus auch ganz anderen Text enthalten kann - aber es zeigt die grundsätzliche Funktionsweise.

Einen Teil eines Feldes ausgeben mit MID

Nachdem ich schon gezeigt habe, wie man den Anfang und das Ende eines Feldes ausgeben kann, fehlt nun nur noch die Ausgabe eines Teils, der sich innerhalb eines Feldes befindet:

=MID([ObjTitelOriginalS], 2, LEN([ObjTitelOriginalS]) - 2)

Wenn das Feld Titel (Original) im Modul Sammlung alle Titel in Anführungszeichen enthalten würde, in der Druckausgabe der Titel aber ohne Anführungszeichen ausgegeben werden soll, erledigt das oben gezeigte Beispiel diese Aufgabe. Es kürzt einfach den Feldinhalt des Feldes um das erste und letzte Zeichen. Der Befehl MID kennt also drei Parameter:

  • 1. Parameter: Zeichenkette oder Feld, welches den zu kürzenden Text enthält
  • 2. Parameter: Position des ersten auszugebenden Zeichens (bei 1 beginnend)
  • 3. Parameter: Anzahl der auszugebenden Zeichen

Ich kann das Beispiel noch etwas verbessern, in dem ich überprüfe, ob das erste Zeichen des Feldes überhaupt ein Anführungszeichen ist:

=IIF(LEFT([ObjTitelOriginalS],1)=CHR(34), MID([ObjTitelOriginalS], 2, LEN([ObjTitelOriginalS]) - 2), [ObjTitelOriginalS])

Neu in diesem Beispiel ist die Funktion CHR, welche als Ergebnis das Zeichen mit dem angegebenen ASCII-Zeichencode zurückliefert - in diesem Fall das Zeichen ". Und wenn das erste Zeichen des Feldes mit diesem Zeichen identisch ist, wird das Feld wie im vorigen Beispiel bereits gezeigt gekürzt, ansonsten wird es ungekürzt ausgegeben.

Mehr über den ASCII-Code und seine "Verwandten" kann man übrigens in diesem Wikipedia-Artikel nachlesen.