Datenbanken und Formelsprache

15.12.2006 von Elmar Fuchs
Für den Zugriff auf relationale Daten sind unter Lotus Notes Domino verschiedene Vorgehensweisen möglich. Bereits mit Funktionen der Formelsprache lassen sich Anwendungen für einfache Zwecke realisieren.

Der Zugriff auf relationale Daten ist eine immer wieder anstehende Aufgabe für den Notes Domino- Entwickler. Die Struktur der Datenspeicherung in Notes und in relationalen Datenbanken ist grundlegend verschieden. Ein einfaches Einbinden relationaler Tabellen in eine Notes- Datenbank ist nicht möglich (auf die Neuerungen in der Version 7 im Zusammenhang mit der Datenspeicherung in DB2 Tabellen wird in einem gesonderten Artikel dieser Ausgabe von Expert's inside Lotus Notes Domino eingegangen).

Sollen relationale Daten in einer Notes-Anwendung einbezogen werden ist immer programmtechnischer Aufwand zu betreiben. Neben der Programmierung in LotusScript und Java, der Verwendung der „Bordmittel Domino Enterprise Connection Service (DECS) und Data Connection Resources (DCR) sowie dem Lotus Enterprise Integrator (LEI) verfügt auch die Formelsprache über Möglichkeiten zur Lösung dieser Aufgabe. Sie stellt drei Funktionen bereit, um externe Daten zu nutzen bzw. zu bearbeiten:

Während die beiden ersten nur lesend auf die Daten zugreifen, ist es mit der dritten möglich, die Daten in den externen Tabellen zu verändern. Voraussetzung für die Verwendung dieser Funktionen in Verbindung mit externen Daten ist die Einrichtung von ODBC.

Die Funktionen @DBColumn und @DBLookup können auch für das Auslesen von Daten aus einer Notes-Datenbank verwendet werden und sind in diesem Zusammenhang sicher einer Vielzahl von Notes-Entwicklern bekannt. Der folgende Artikel beschränkt sich auf den Einsatz der Funktionen zur Abfrage externer Daten im Zusammenhang mit ODBC.

ODBC

Open Database Connectivity (ODBC) wurde als einheitliche Schnittstelle auf Datenbankmanagementsysteme (DBMS) von der Firma Microsoft entwickelt. Über das damit zur Verfügung gestellte Application Programming Interface (API) können Anwendungen mit Befehlen der Structured Query Language (SQL) auf verschiedenartigste Datenbestände zugreifen, da diese von allen wichtigen DBMS unterstützt wird. In der Ausgabe 08/2002 von Expert´s inside Lotus Notes/ Domino wurden die Grundlagen von ODBC bereits in einem gleichnamigen Artikel behandelt.

Die Einrichtung einer ODBC-Verbindung erfolgt unter Windows XP im Bereich Verwaltung der Systemsteuerung (Bild 1). Wollen Sie die über die ODBC-Schnittstelle ausgeführten SQL-Anfragen überwachen, bietet der ODBC-Datenquellen- Administrator dafür eine Ablaufverfolgung. Nach dem Festlegen der Protokolldatei wird diese auf dem gleichnamigen Register gestartet. Zugriffsfehler werden in der Logdatei unter Angabe einer Fehlermeldung aufgeführt (Bild 2).

Bild 1: Die Einstellungen für die Konfiguration einer ODBC-Verbindung über eine System-DSN.
Bild 2: Ein Ausschnitt aus der Logdatei mit Zugriffsfehlern.
Bild 3: Mit der Anwendung ndctest kann die Verbindung zu einer Datenbank analysiert werden.

Zum Test einer konfigurierten Verbindung liefert Notes Domino für die Windows-Umgebung das Programm ndctest.exe mit. Es befindet sich jeweils im Notes- und im Domino-Programmverzeichnis. Das Programm testet den Verbindungsaufbau zur definierten Datenquelle (Bild 3).

Daten lesen

Die Verwendung der beiden Funktionen @DBColumn und @DBLookup entspricht im Kontext von ODBC dem in Lotus Notes-Datenbanken. Während @DBColumn die Werte einer Spalte aus einer Tabelle ausliest, können Sie mit @DBLookup unter Angabe eines Schlüsselwertes nach den entsprechenden Daten suchen.

Die allgemeine Syntax der Funktion @DBColumn lautet

@DbColumn("ODBC" : <Cache>; <Quelle>; <Benutzer1> :
<Benutzer2>; <Kennwort1> : <Kennwort2>; <Tabelle>;
<Spalte> : <Nullwerte>; "Distinct" : <Sort>)

Die Angabe eines oder mehrerer Benutzer und der zugehörigen Kennwörter ist nur erforderlich, wenn sie vom verwendeten DBMS verlangt werden. Beim Auslesen der Werte können doppelte Datensätze mit der Angabe des Parameters Distinct unterdrückt werden. Bei dessen Verwendung können zusätzlich die Datensätze aufsteigend (Angabe von Ascending für den Parameter <Sort>) oder absteigend (Descending) sortiert werden.

Eine Erläuterung der einzelnen Parameter enthält Tabelle 1. Die Funktion @DBLookup verfügt über eine ähnliche Syntax:

@DbColumn("ODBC" : <Cache>; <Quelle>; <Benutzer1> :
<Benutzer2>; <Kennwort1> : <Kennwort2>; <Tabelle>;
<Spalte> : <Nullwerte>; <Keyspalte>; <Key>; "Distinct"
: <Sort>)

Tabelle 1: Die Parameter der @DB-Formeln im Überblick.

Parameter

@DB-
Column

@DB-
Lookup

@DB-
Command

Beschreibung

"Distinct"

X

X

Der Parameter löscht doppelte Werte vor der Rückgabe an Lotus Notes Domino.

"ODBC"

X

X

X

Mit dieser Zeichenfolge wird festgelegt, dass der Zugriff auf eine ODBC Datenquelle erfolgen soll.

<Benutzer1> :
<Benutzer2>

X

X

X

Verlangt die externe Datenquelle einen autorisierten <Benutzer2> Zugriff, können Sie bis zu zwei Benutzer-IDs in Listenform angeben. Sollen diese nicht in der Formel gespeichert werden, verwenden Sie einen bzw. zwei Leerstrings "". Die Benutzernamen werden dann beim Zugriff abgefragt. Dies ist allerdings nur möglich, wenn der Befehl nicht im
Rahmen eines automatisch ausgeführten Agenten verwendet wird.

<Cache>

X

X

X

Zur Zwischenspeicherung der vom Server abgefragten Daten kann ein Cache verwendet werden. Zu diesem Zweck wird als Parameter ein Leerstring "" übergeben. Zur Aktualisierung des Caches verwenden Sie Recache (neu in Version 6). Soll bei jeder Ausführung eine Abfrage der externen Datenquelle ohne Verwendung eines Caches erfolgen, geben Sie NoCache an.

<Kennwörter1>
:<Kennwörter2>

X

X

X

Falls Benutzer-IDs angegeben werden, erfolgt die Angabe
der Kennwörter ebenfalls in Listenform.

<Key>

X

Der Parameter enthält einen einzelnen Wert oder eine Liste von Werten der Typen Text, Zahl, Datum oder Zeit, nach dem in der <Keyspalte> gesucht wird.

<Keyspalte>

X

Die Spalte, in der die bei <Key> übergebenen Werte gesucht werden.

<Nullwerte>

X

X

X

Steuert die Behandlung der Nullwerte. Standard ist hier das Löschen der Werte und die Ausgabe der Meldung Warnung: Null-Werte von @DB-Liste entfernt. Dies ent spricht der Angabe des Parameters Discard. Alternativ kann über Fail die Abfrage abgebrochen oder in Hoch kommata "" eine Ersatzzeichenkette angegeben werden.

<Quelle>

X

X

X

Der Name der definierten ODBC-Datenquelle.

<Sort>

X

Bestimmt die Sortierreihenfolge.

<Spalte>

X

X

Der Parameter bestimmt die Spalte, aus welcher die Daten ausgelesen werden sollen.

<SQL-Befehlsfolge>

X

Der Parameter enthält die vom DBMS auszuführende folge> Befehlsfolge.

<Tabelle>

X

X

Angabe der Tabelle oder Ansicht, aus der die Daten bezogen werden sollen. Durch das Voranstellen des Besitzers können Sie – so dies vom verwendeten DBMS unterstützt wird – die Eindeutigkeit des Zugriffs gewährleisten. Verwenden Sie dafür die Punktnotation. Für eine Tabelle adressen, die dem Besitzer gast gehört, lautet der Zugriff beispielsweise: gast.adressen.

Angabe eines Schlüßels

Die beiden zusätzlichen Parameter <Key> und <Keyspalte> ermöglichen die Angabe eines Schlüssels <Key>, zu dem in der Spalte <Keyspalte> der zugehörige Wert ermittelt und zurückgegeben wird. Bei der Angabe der Werte für diese beiden Parameter müssen Sie einige Punkte beachten:

In einigen Situationen empfiehlt sich die Verwendung der Funktion @DBLookup nicht, da sie Beschränkungen unterliegt. So ist es nicht möglich, auf Ungleichheit zu prüfen oder eine Und- Abfrage zu erstellen. Auch bei der Verwendung eines Datum/Zeit-Feldes als Schlüssel <Key> kann es zu Problemen kommen, da die Konvertierung in das Format des DBMS nicht immer korrekt funktioniert. Eine mögliche Alternative ist in diesen Fällen die Verwendung der Funktion @DBCommand.

Komplexe Aktionen

Die @Funktion @DBCommand ermöglicht die Ausführung komplexer Aktionen durch die Übergabe von SQL-Befehlen an eine externe Datenquelle. Dabei ist die Funktion in erster Linie zur Lösung der oben genannten Einschränkungen gedacht. Die Ausführung anderer SQL-Befehle als Select ist möglich. Diese werden jedoch nur an das DBMS weitergeleitet, eine Überwachung oder gar Rückmeldung zur korrekten Ausführung erfolgt nicht. Insofern empfiehlt sich für derartige Anwendungen die Verwendung der ODBCFunktionen von LotusScript.

Generell können Sie jedoch @DBCommand auch für das Einfügen, Verändern und Löschen von Datensätzen in einer Tabelle oder weitergehende Aktionen, wie das Anlegen oder Löschen einer Tabelle verwenden – wenn Sie sich der Risiken bewusst sind und diese akzeptieren. Die Syntax der Funktion lautet

@DbCommand( "ODBC" : <Cache>; <Quelle>; <Benutzer1> :
<Benutzer2>; <Kennwort1> : <Kennwort2>; <SQL-Befehlsfolge>
: <Nullwerte>)

Bis auf <SQL-Befehlsfolge> sind die Parameter mit denen der anderen beiden Funktionen identisch. <SQL-Befehlsfolge> enthält die vom DBMS auszuführende Befehlsfolge. Dabei kann es sich um eine SQL-Anweisung, einen Befehl oder eine gespeicherte Prozedur (Stored Procedure) handeln. Sie müssen in jedem Fall die korrekte Verwendung der Syntax des DBMS beachten.

Einschränkungen

Beim Einsatz der drei Funktionen müssen Sie folgende Einschränkungen beachten:

@DBCommand("Domino"; "ViewPrevious- Page")

bzw.

@DBCommand("Domino"; "ViewNextPage")

verwenden. Erstellen Sie dazu in einer Maske oder Seite eine eingebettete Ansicht, und ordnen Sie den Befehl einer Aktion zu, um diese zu steuern.

Beispiele

Im Folgenden noch einige Beispiele für mögliche Anwendungen der Funktionen. Es wird jeweils eine ODBC-Verbindung ODBCTest für den Zugriff auf eine Datenbank verwendet. Eine Besitzerangabe erfolgt nicht.

@DBColumn:

Die folgende Funktion liest aus der Tabelle adresse alle Werte der Spalte ort aus. Die Rückgabe der Werte erfolgt in aufsteigend sortierter Reihenfolge. Vorhandene Nullwerte werden gelöscht.

@DbColumn("ODBC"; "ODBCTest"; ""; ""; "adresse";"ort":"Discard"; "Ascending")

@DBLookup:

Die Funktion gibt für alle Datensätze der Tabelle adresse, welche in der Spalte ort den Wert Berlin enthalten, den im Feld name gespeicherten Wert zurück. Die Ergebnisliste ist wiederum aufsteigend sortiert und enthält keine Nullwerte.

@DbLookup("ODBC"; "ODBCTest" ;"" ;""; "adresse"; "name":"Discard"; "ort"; "Berlin"; "Ascending")

@DBCommand:

Die folgende Formel greift auf die Tabelle adresse zu. Es werden alle Daten der Spalten name, vorname und tel geladen, welche in der Spalte ort den Wert Berlin und in der Spalte prio den Wert 1 besitzen. Die Klammerung der Zeichenfolge Berlin in Apostrophe erfolgt, da der gesamte Ausdruck in Hochkommata eingeschlossen ist.

@DbCommand("ODBC";"ODBCTest";"";""; "SELECT name, vorname, tel FROM adresse WHERE ort ='Berlin' AND prio = 1 ")

Zusammenfassung

Die Formelsprache bietet mit den drei besprochenen Funktionen einen einfachen Zugriff auf externe Daten. Sollen diese nur gelesen werden und die genannten Einschränkungen spielen keine Rolle, ist der Einsatz der Funktionen durchaus eine Überlegung wert. Für komplexere Anwendungen oder falls eine bessere Steuerung der Anwendung verlangt wird, sind jedoch schnell die Grenzen erreicht, sodass Alternativen nötig sind. Diese werden in den weiteren Artikeln der Ausgabe vorgestellt.