Gestaltungselemente importieren

01.05.2006 von Elmar Fuchs
Gestaltungselemente können über ein DXL-Tool des Domino Designer exportiert werden, der Import wird jedoch nicht unterstützt. Der Artikel zeigt eine Möglichkeit, in Form von DXLDateien vorliegende Gestaltungselemente in beliebige Datenbanken zu importieren – entweder über einen LotusScript-Agent oder mit Hilfe eines kleinen Visual Basic-Tools.

Seit dem Releasewechsel von 5 auf 6 unterstützt der Domino Designer verstärkt die Arbeit im Team. Eine Reihe von Möglichkeiten hilft Ihnen, die Zusammenarbeit von mehreren Entwicklern zu verbessern:

Der letztgenannte Punkt birgt jedoch ein Problem. Während der Export über den Menüpunkt Werkzeuge/DXL-Hilfsprogramme/Exporter problemlos möglich ist, steht für den Import kein gleichwertiges Werkzeug zur Verfügung. Hier sind Sie als Entwickler gefragt.>

LotusScript-Agent

Seit der Version 5 unterstützt Lotus Notes/Domino XML (Extended Markup Language). In der Version 6 wurde diese Unterstützung stark erweitert. Seit dieser Version stehen Ihnen als Entwickler eine Vielzahl von Klassen in LotusScript und Java zum Umgang mit XML-Daten zur Verfügung. Dazu kommen einige Werkzeuge wie zum Beispiel der bereits angesprochene DXL Exporter des Designers. Bild 1 zeigt den Ausschnitt aus einer DXL-Datei für eine exportierte Maske mit dem Namen Artikel.

Bild 1: Ein Auszug aus einer DXL-Datei des Exporters.

Die Grundlagen von XML in Verbindung mit Domino, die Möglichkeiten des Im- und Exports von Daten sowie deren Umwandlung und Darstellung wurden in mehreren Artikel in dieser Zeitschrift ausführlich behandelt.

Für die Lösung unseres Importproblems können wir einen LotusScript-Agenten erstellen, welcher hauptsächlich zwei Klassen verwendet:

Listing 1 enthält den Programmcode für einen Importagenten.

Sub Initialize
Dim ws As New NotesUIWorkspace
Dim se As New NotesSession
Dim db As NotesDatabase
Dim stream As NotesStream
Dim im As NotesDXLImporter
Dim datName As Variant
Set db = se.CurrentDatabase
'Datenstrom erzeugen
Set stream = se.CreateStream()
datName = ws.OpenFileDialog(False, _
"Zu importierendes Gestaltungselement wählen",,"c:\temp")
If (Isempty(datName)) Then
Exit Sub
End If
'Quelldatei für Datenstrom festlegen
Call stream.Open(datName(0))
'DXLImporterobjekt unter Angabe der Quelle und des Ziels erzeugen
Set im = se.CreateDXLImporter(stream, db)
'Import von Designdokumenten aktivieren
im.DesignImportOption = 2
'Importprozess ausführen
Call im.Process()
Call stream.Close()
End Sub

Nachdem die benötigten Variablen deklariert und das Datenstromobjekt erstellt wurde, wird vom Anwender die zu importierende DXL-Datei erfragt. Dazu öffnet die Methode OpenFileDialog der Klasse NotesUIWorkspace ein Dialogfenster. Ist der Zugriff auf die gewünschte Datei möglich, wird sie als Quelle des Datenstroms bestimmt. Das Objekt der Klasse NotesDXLImporter, das den Importvorgang realisiert, wird anschließend unter Angabe der Quelle und der aktuellen Datenbank als Ziel erzeugt.

Der Import von Gestaltungsdokumenten muss gesondert aktiviert werden. Über die Eigenschaft DesignImportOption wird der Umgang mit Gestaltungselementenbeim Import einer DXL-Datei in eine Notes-Datenbank gesteuert. Per Standard, die Eigenschaft besitzt in diesem Fall den Wert 1, werden die Gestaltungselemente beimmImport ignoriert. Weisen Sie der Eigenschaft den Wert 2 zu, um Gestaltungselemente beim Import einer DXL-Datei zu übernehmen und dabei in der Datenbank bereits vorhandene Gestaltungselemente bestehen zu lassen. Einen Überblick über die möglichen Wertes der Eigenschaft DesignImportOption finden Sie in Tabelle 1.

Tabelle 1: Die Optionen für den DXL-Import.

Konstante

Wert

Bedeutung

DXLIMPORTOPTION_IGNORE

1

Die Standardeinstellung. Beim Import einer DXL-Dateiin eine Notes-Datenbank werden Gestaltungselemente ignoriert. Vorhandene Gestaltungselemente bleiben erhalten.

DXLIMPORTOPTION_CREATE

2

Dieser Wert bewirkt den Import von Gestaltungselementen. Auch hier bleiben vorhandene Gestaltungselemente erhalten.

DXLIMPORTOPTION_REPLACE_ELSE_IGNORE

3

Übereinstimmende Gestaltungselemente in der Zieldatenbank werden durch die der DXL-Datei ersetzt. Alle anderen bleiben in der Datenbank erhalten.

DXLIMPORTOPTION_REPLACE_ELSE_CREATE

4

Übereinstimmende Gestaltungselemente in der Zieldatenbank werden durch die DXL-Datei ersetzt. Neue Gestaltungselemente werden aus der DXL-Datei übernommen. Übereinstimmende Gestaltungselemente in der Zieldatenbank werden durch die der DXL-Datei ersetzt. Neue Gestaltungselemente werden aus der DXLDatei übernommen.

Schließlich wird im Agent der Importvorgang durch die Methode Process ausgeführt. Die letzte Zeile des Programmcodes schließt den Datenstrom.

Externes Programm

Der Import über einen LotusScript-Agenten funktioniert. Er ist jedoch mit einem Nachteil verbunden: Um ein Gestaltungselement in eine Datenbank zu importieren, wird in dieser der Importagent benötigt. Eine Möglichkeit zur Behebung dieses Problem wäre, den Agenten so umzuschreiben, dass er das Gestaltungselement nicht einfach in die aktuelle Datenbank einfügt, sondern die Zieldatenbank im Dialog mit dem Anwender erfragt und verwendet. Offen bleibt bei dieser Lösung jedoch die Frage, wo man diesen universalen Agenten einbindet, damit er jederzeit zur Verfügung steht.

Als Lösung des Problems bietet es sich an, ein externes Programm zu erstellen, welches den Import ausführt. Es soll die Zieldatenbank und das zu importierende Gestaltungselement (die DXLDatei) vom Anwender erfragen und den Import danach bewerkstelligen.

Als Programmiersprache für ein solches externes Programm stehen Ihnen verschiedene Alternativen zur Auswahl, von Visual Basic über Delphi und Java bis hin zu C++ und C.

Wir wollen uns die Umsetzung mit Visual Basic ansehen. In der Ausgabe 11/2002 von Expert's Inside Lotus Domino wurden im Artikel „Domino Objects und COM“ die Grundlagen für den Dort wurde auch bereits darauf hingewiesen, dass für Lotus Notes-Entwickler die Basic-Programmierung keine allzu große Herausforderung ist – LotusScript ist schließlich ein Basic-Derivat. Die Ähnlichkeit zwischen den beiden Sprachen ist sehr groß. Zu beachten ist die Einschränkung, dass über die COM-Schnittstellenur die Backend-Klassen verfügbar sind. Weitere Unterschiede bestehen neben anderen im Umgang mit Objekten der Klasse Item und bei der Erstellung von Objekten. Hinter letztgenanntem verbirgt sich die Tatsache, dass lediglich Objekte der Klasse NotesSession mit New erstellt werden können. Alle anderen Objekte müssen Sie über Methoden und Eigenschaften des Objekts Session erstellen.

Die COM-Schnittstelle ist automatisch mit der Installation von Lotus Notes auf einem Computer vorhanden. Es ist nicht notwendig, dass Notes ausgeführt wird, um mit ihr zu arbeiten. Eine grundlegende Voraussetzung ist jedoch, dass die Domino COM-Objekte Zugriff auf die notes.ini haben. Die dort unter KeyFileName angegebene User-ID wird für den programmtechnischen Zugriff genutzt. Des Weiteren muss bei Visual Basic- Programmen ein Verweis auf die Komponenten der Lotus Domino Objects in dem Projekt eingebunden werden. Die Komponenten befinden sich in der Datei domobj.tlb.

Das Beispiel in Listing 2 wurde mit Microsoft Visual Studio .Net 2003 erstellt. Das Formular enthält lediglich eine Schaltfläche, bei deren Betätigung der Importvorgang gestartet wird. Nach der Aufforderung zur Eingabe des Passworts für die gefundene ID kann der Anwender zuerst die Zieldatenbank und anschließend das zu importierende Gestaltungselement in Form einer DXLDatei bestimmen (Bild 2). Die Angabe des zu verwendenden Benutzers samt dessen Kennwort kann auch direkt im Quelltext erfolgen. Vom Standpunkt der Sicherheit aus sollte man sich eine derartige Vorgehensweise jedoch gut überlegen.

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim se As New Domino.NotesSession
Dim db As Domino.NotesDatabase
Dim stream As Domino.NotesStream
Dim dbName As Object
Dim datName As Object
Dim im As Domino.NotesDXLImporter
Dim ofd1 As New OpenFileDialog
Dim ofd2 As New OpenFileDialog
'Session initialisieren
Call se.Initialize()
'Einstellungen für Dialogfenster Datenbank auswählen
ofd1.InitialDirectory = "c:otus\notes\data"
ofd1.Filter = "Notes Datenbanken (*.nsf)|*.nsf|Alle Dateien (*.*)|*.*"
ofd1.FilterIndex = 1
ofd1.Title = "Auswahl der Zieldatenbank"
If ofd1.ShowDialog() = Windows.Forms.DialogResult.OK Then
dbName = ofd1.FileName
If dbName Is Nothing Then
MsgBox("Fehler beim Öffnen der Datei", , "Error")
Exit Sub
Else
db = se.GetDatabase("", dbName)
End If
End If
'Datenstrom erzeugen
stream = se.CreateStream
'Einstellungen für Dialogfenster DXL Datei auswählen
ofd2.InitialDirectory = "c:\temp"
ofd2.Filter = "DXL Dateien (*.dxl)|*.dxl|Alle Dateien (*.*)|*.*"
ofd2.FilterIndex = 1
ofd2.Title = "Auswahl der DXL Datei des zu importierenden _
Gestaltungselements"
If ofd2.ShowDialog() = Windows.Forms.DialogResult.OK Then
datName = ofd2.FileName
'Quelldatei für Datenstrom festlegen
If Not stream.Open(datName) Then
MsgBox("Fehler beim Öffnen der Datei", , "Error")
Exit Sub
Else
'DXLImporterobjekt erzeugen
im = se.CreateDXLImporter()
'Import von Designdokumenten aktivieren
im.DesignImportOption = 2
'Import vom Datenstrom unter Angabe von Zieldatei ausführen
Call im.Import(stream, db)
Call stream.Close()
End If
End If
End
End Sub

Im Vergleich zu früheren Versionen von Visual Basic ist zu beachten, dass alle Notes-Objekte in VB.Net mit dem Präfix Domino angesprochen werden müssen.

Betrachten Sie die beiden Programmlistings, werden Sie eine Reihe weiterer Unterschiede bemerken. Zuerst fällt auf, dass im Gegensatz zu LotusScript in Visual Basic eine separate Initialisierung der Sitzung erforderlich ist.

Call se.Initialize()

Dieser Methode kann auch optional ein Passwort mit übergeben werden.

Ein wesentlicher Unterschied besteht in der Erzeugung des Objekts der Klasse NotesDXLImporter und der Art und Weise, in welcher der Importvorgang gestartet wird. In LotusScript werden bereits bei der Erzeugung des NotesDXLimporter- Objekts mit der Methode CreateDXLImporter des NotesSession-Objekts die Datenquelle und die Zieldatenbank angegeben.

Set im = se.CreateDXLImporter(stream, db)

Der Import wird danach mit der Methode Process gestartet.

Call im.Process()

Im Unterschied dazu erfolgt in Visual Basic die Objekterzeugung des Objekts der Klasse Notes DXLImporter ohne Übergabe der Parameter

im = se.CreateDXLImporter()

Diese werden erst beim Importvorgang, der bei der Verwendung der COM-Objekte mit der Methode
mport erfolgen muss, festgelegt.

Call im.Import(stream, db)

Beachten Sie, dass das Programm in der vorliegenden Form aus Gründen der Übersichtlichkeit keine Fehlerprüfung hat. Potenzielle Probleme wegen der Angabe eines falschen Passworts, fehlender Zugriffsrechte oder sonstiger möglicher Stolpersteine werden ebenfalls nicht abgefangen. Dies kann zur Erzeugung eines Notes-Fehlers beim Import führen.

Programm in den Domino Designereinbinden

Der separate Aufruf des Programms über eine Verknüpfung im Startmenü oder auf dem Desktop ist recht mühsam. Eleganter ist es, wenn der Import direkt im Domino Designer gestartet wird. Seit Version 6 besteht die Möglichkeit, die Menüstruktur des Domino Designer zum Aufruf häufig benötigter Werkzeuge zu erweitern. Diese lassen sich unterhalb des Menüpunkts Werkzeuge anordnen. Über den Aufruf des Menüs
Werkzeuge/Werkzeug hinzufügen öffnet sich ein Dialogfenster, in welchem Sie den Namen und die auszuführende Aktion des neuen Menüpunkts angegeben. Als Aktionen stehen der Start eines Programms oder das Ausführen einer @Formel zur Auswahl. Erstellen Sie hier die Verknüpfung auf das Importprogramm (Bild 3), steht es Ihnen immer sofort aus dem Menü des Domino Designer zur Verfügung.

Bild 3: Das Dialogfeld für das Hinzufügen eines Werkzeugs.

Der Import eines Gestaltungselements in eine Datenbank ist somit jederzeit nur noch zwei Mausklicks entfernt.