Das LC LSX stellt eine sehr weitreichende Funktionalität für die Entwicklung von Anwendungen bereit, die über die Lotus Connectors (LC) auf andere Datenquellen zugreifen. Da es sehr unterschiedliche Arten von Connectoren gibt, sind auch bei der Anwendungsentwicklung einige wichtige Unterschiede zu vermerken – nicht immer stehen alle Funktionen zur Verfügung, und manches Mal können nur bestimme Funktionen genutzt werden. Es gibt aber auch ein gemeinsames Raster für alle Anwendungen als Basis in der einen oder anderen Form.
Dieser Artikel gibt zunächst einen Überblick über die grundsätzliche Struktur von Anwendungen, die mit dem LC LSX entwickelt werden, und geht näher auf die Klassen ein, die in solchen Anwendungen benötigt werden.
Die Grundstruktur von LC LSX-Anwendungen
Im Artikel „LotusScript und Datenbanken“ in der Ausgabe SPEZIAL Nr. 13/2006 wurde bereits in Grundzügen auf die Entwicklung von Anwendungen mit dem LC LSX eingegangen. Dabei wurden die verschiedenen Klassen kurz erläutert und an einem Beispiel gezeigt, wie die Struktur typischer Anwendungen aussieht. In dieser Struktur wird eine Verbindung aufgebaut, eine Abfrage durchgeführt, dann werden die Ergebnisse Schritt für Schritt durchlaufen.
Über die minimalistische Struktur der Beispielanwendung hinaus gibt es aber noch einige weitere wichtige Punkte zu beachten:
-
Man muss überlegen, in welcher Form die Abfragen konstruiert werden. Der typische Fall ist, dass man eine vorgegebene Abfrage hat, in der einzelne Elemente dynamisch erzeugt werden. Ein gutes Beispiel sind Abfragen, die alle Datensätze auslesen, die ab einem bestimmten Datum erstellt wurden. In diesem Fall ist das SQL-Statement bis auf das Datum immer gleich. Der dynamische Teil der Informationen kann in der Anwendung beispielsweise aufgrund fester Parameter wie dem aktuellen Datum, durch Vergleich mit Informationen in Notes-Dokumenten oder durch eine Eingabe eines Benutzers ermittelt werden. Die Ermittlung der Informationen, die für die Konstruktion der Abfrage verwendet werden, sollte immer zu Beginn des Codes erfolgen.
-
Die Auswertung der Informationen kann deutlich komplexer werden als im Beispiel des genannten Artikels. Für die Verarbeitung gibt es wenige typische Ansätze. Dazu gehört das Erzeugen oder Verändern von bestehenden Dokumenten, wobei in diesem Fall meist ein Dokument pro Datensatz verwendet wird. Ein anderer ist das Aggregieren von Informationen aus mehreren Datensätzen, um nur eine zusammenfassende Information in ein Dokument zu schreiben. Bei dieser Variante muss man allerdings prüfen, ob man die Aggregation nicht auch über SQL-Statements erreichen kann. Das ist in aller Regel sehr viel effizienter als das wiederholte Durchlaufen einer Schleife für unter Umständen sehr viele Datensätze. Die SQL-Anweisungen arbeiten bei den meisten Datenquellen sehr effizient, auch wenn Informationen aus vielen Datensätzen zusammengefasst werden müssen.
-
Für die Auswertung wurden eine beachtliche Menge von Optionen bereitgestellt, um beispielsweise mehrere Zeilen in einem Schritt verarbeiten zu können.
-
Generell gilt auch, dass man die Anzahl der verwendeten Verbindungen minimieren sollte. Über eine Verbindung lassen sich mehrere Abfragen durchführen. Da der Aufbau von Verbindungen relativ zeitintensiv ist, sollte man Situationen vermeiden, in denen beispielsweise innerhalb einer Schleife immer wieder Verbindungen aufgebaut werden. Solange nichts Besonderes vorliegt, wird innerhalb eines Agents für den Zugriff auf eine Datenquelle auch nur eine Verbindung benötigt.
Methoden
Interessant ist auch ein Blick auf die verschiedenen Methoden, die bei einer Verbindung angewendet werden können.
Die bekannteste ist Execute, also die Ausführung eines Statements, mit dem ein Ergebnissatz ermittelt wird. Das setzt voraus, dass man weiß, in welcher Form auf den Connector zugegriffen werden muss. Die Methode Select ist dagegen Connectorunabhängig. Sie verwendet unterschiedliche Eingabeparameter, um die Ergebnisse zu ermitteln. Die Methode Call wird verwendet, um eine Prozedur oder Funktion auf dem Backend-System aufzurufen. In diesem Fall werden Parameter für diese Prozedur übermittelt. Schließlich gibt es noch die Methode Catalog, mit der sich Metadaten über ein externes System ermitteln lassen. Damit können beispielsweise die Tabellen und Spalten einer Datenbank erfragt werden.
Das kann wiederum interessant sein, um komplexere Anwendungen zu erstellen, in denen die Abfragen in Abhängigkeit von den Datenstrukturen dynamisch generiert werden. Das ist aber eher die Ausnahme. In der Regel ist von vornherein klar, wie die Datenbank aussieht, auf die zugegriffen wird.
Alle diese spezifischen Punkte werden aber in der Grundstruktur umgesetzt, die in dem zu Beginn genannten Artikel erläutert wurde. Wie das im Einzelfall konkret aussehen kann, wird in den folgenden Teilen der Serie erläutert.
Wie geht es weiter?
Der zweite Teil der Serie stellt zwei Beispiele für einfachere Anwendungen dar, über die auf Informationen aus einer relationalen Datenbank zugegriffen wird. Dabei werden einfachere SQLStatements und Analysefunktionen für die Daten verwendet. Die Anwendungen beschränken sich auf die Auswertung einfacher Feldtypen und gehen nicht auf spezielle Anforderungen anderer Felder ein. In den Beispielen wird auch auf die Nutzung sowohl von Execute als auch Select eingegangen, um die spezifischen Unterschiede zwischen diesen Methoden herauszuarbeiten.