FSS.social
23Apr 120

XPages: runWithDocumentContext – wie man Lotus Script Funktionen in XPages nutzen kann

am Montag, den 23. April 2012

Wenn eine Lotus Notes Datenbank webfähig gemacht werden soll,
stellt sich die Frage, ob sich nicht zumindest ein Teil der Lotus Script-Codes weiter verwenden lässt.

Bzw. ob wirklich alles noch einmal in Java Script programmiert werden muss.

Ab 8.5.2 gibt es die Möglichkeit einem Agenten das aktuelle Dokument im Speicher zu übergeben.
Der Agent kann dann seinerseits Felder in dem aktuellen Dokument verändern und an den Aufrufer zurückgeben.

Ein Beispiel:
In einer XPage liegt hinter einem Weiterleiten-Button folgender Code:

(serverseitiger Javascript-Code, antragDoc ist hier der Name der aktuellen Dokument-Resource)


var agent:NotesAgent = database.getAgent("(weiterleiten)");


agent.runWithDocumentContext(antragDoc.getDocument());

antragDoc.save();
Dem Agent wird das aktuelle Dokument übergeben. Sobald der Agent mit dem Dokument fertig ist, wird dieses gespeichert.

Beim Agent "(weiterleiten)" wurde unter Security "Run as Webuser" eingestellt.
Der Code des Agenten ist in Lotus Script geschrieben und könnte wie folgt aussehen.


Sub Initialize


Dim db As NotesDatabase

Dim agent As NotesAgent

Dim session As New NotesSession

Dim actDoc As NotesDocument

Set db = session.CurrentDatabase
Set agent = session.CurrentAgent
Set actDoc = session.DocumentContext

Call Weiterleiten(actDoc)
End Sub

Call Weiterleiten() ist eine Funktion in der nun beliebig Felder des Dokumentes gesetzt werden können.

Um die Veränderungen zu übergeben muss das Dokument NICHT gespeichert werden.

Sobald der Agent fertig ist, übergibt er dem Aufrufer das veränderte Dokument.

22Aug 110

Verändern der Schablonennamen via Lotus Script

am Montag, den 22. August 2011

Mehrere Datenbanken sollen das Design von einer Schablone erben?
Kein Problem mit wenigen Handgriffen ist eine derartige Aufgabe gewöhnlich gemeistert.

Wesentlich komplizierter wird es jedoch, wenn das Design einer Schablone verborgen werden soll.
Mit Hilfe einer zweiten Datenbank, einem Replace Design und einem Kreuz beim Design verstecken ist der Inhalt des Designs verborgen.

Doch die Schablone kann dann nur noch Designelemente erben, aber selbst nichts mehr vererben.

Eilt man zu den Eigenschaften der Datenbank, - wo man dies normalerweise ändern kann - stellt man schnell fest, dass diese Eigenschaften nicht mehr zur Verfügung stehen.

Nach einer ganzen Weile des Suchens fand ich eine Routine mit dem man die Schablonennamen per Lotus-Script anpassen kann:
(Wert der Konstanten entsprechend setzen und den Code in einen Agenten kopieren)



Sub
Initialize
Const dbserver = "" ' Server auf dem die Datenbank liegt
Const dbpath = "" ' Pfadname zur Datenbank
Const inheritedTemplate = "" ' Name der Schablone von dem das Design geerbt werden soll
Const masterTemplate = "" ' Name der Masterschablone

Dim session As New NotesSession
Dim db As NotesDatabase
Dim iconDoc As NotesDocument
Dim curTitle As string

Set db = New NotesDatabase(dbserver,dbpath)
curTitle = db.Title

Set iconDoc = db.GetDocumentByID("FFFF0010")
iconDoc.~$Title = curTitle

Call iconDoc.Save(True,True)

db.title = curTitle & Chr$(10)

db.title = curTitle & Chr$(10) & "#1" & masterTemplate & Chr$(10) & "#2" & inheritedTemplate
End
Sub
>

9Mrz 100

8.5.1 Probleme mit Collections

am Dienstag, den 9. März 2010

Wie Erik Brooks kürzlich in seinem Blogeintrag ausführlich beschreibt, wurde die Behandlung von Collections geändert. Dies kann zu dem Fehler "The collection has become invalid" führen.

Bisher war es so, dass bei jedem Lookup in eine Collection, also beispielsweise per "GetDocumentByKey", geprüft wurde, ob ein Dokument der Collection seit dem letzten Update geändert wurde. War dies der Fall, so wurde der Index neu aufgebaut.


Diese Aktualisierung der Collection ist in der aktuellen Notesversion offenbar auf 10 begrenzt. Anschließend wird der oben genannte Fehler "The collection has become invalid" generiert. Anders formuliert, die Einstellung "NotesView.AutoUpdate=True" in der notes.ini hat keine Wirkung mehr. Bei stark belasteten Datenbanken tritt dieses Problem wohl leicht auf.


Der von IBM empfohlene Workaround beinhaltet das Abfangen dieses Fehlers und anschließendes Ausführen eines "NotesView.Refresh()". Da Funktionen wie "GetDocumentByKey" aber sehr häufig verwendet werden, ist das keine praktikable Lösung. Dieser Workaround sollte nur auf die aktuellen Problemfälle beschränkt bleiben und die Zeit bis zum nächsten Fix überbrücken.

14Jan 100

Lotus Symphony per Lotus Script ansteuern – erste Erfahrungen

am Donnerstag, den 14. Januar 2010

Wir hatten uns vorgenommen, Symphony Document für die Druckaufbereitung von Notesdokumenten zu verwenden. Das ist ans sich nichts Besonderes, ist mit Microsoft-Produkten ja auch schon hinlänglich gelungen. Ziel war zunächst ein einfaches Script, welches Daten aus einem bestimmten Notesdokument an ein neues Symphonydokument, welches anhand eines Templates generiert wird, zu übergeben. Da es offenbar in der Designer-Hilfe keine Beispiele gibt, haben wir uns die notwendigen Strukturen im Web zusammengesucht - Dank an alle, die hierzu etwas eingestellt haben! - also in etwa so:

Dim application As SymphonyApplication
Dim document As SymphonyDocument
Dim documents As SymphonyDocuments

Dim txtField As SymphonyTextField
Dim strTemplateName As String

strTemplateName="C:TempTemplate1.ott"

'Das Symphony-Template hatten wir zuvor erstellt. Für jeden zu übergebenden Wert, haben wird dort ein Feld angelegt, welches denselben Namen hatte, wie das interne Notesfeld.

Set application = New SymphonyApplication
Set documents = application.Documents
Set document = documents.AddDocument(strTemplateName,True,True)


For i=1 To document.Fields.Count
Set txtField=document.Fields.Item(i)

If txtField.Name <> "" Then

If doc.HasItem(txtField.Name) Then

Set itm = doc.GetFirstItem(txtField.Name)

strValue=""

Forall v In itm.Values
strValue=strValue+v+Chr(13)+Chr(10)

End Forall

If strValue <> "" Then

document.Fields.Item(i).content=strValue

End If

End If

End If

Next


Das hat soweit auch funktioniert, aber leider nur an dem Client, der das Script erstellt hat. An allen anderen Clients kam die Fehlermeldung ""4000: Unknown Exception". Nach einigen "Verrenkungen" (Speichern des Scripts am jeweiligen Client, Neustarten etc.) haben wir es schließlich auch an den anderen Clients zu laufen bekommen, aber bei allen kam zu nächst mal die Fehlermeldung - schade eigentlich. Da wir das aber als absolut "basic" betrachten, haben wir erstmal von weitergehenden Versuchen abgesehen.

3Jul 090

Anleitung zur Erstellung einer XPage-basierten Anwendung

am Freitag, den 3. Juli 2009

Hier eine sehr schöne Seite für den Einstieg ins Thema "Xpages".
Learning XPages by Declan Lynch

16Apr 090

Nettes Feature im Domino Designer: Tabellenzeile/n verschieben

am Donnerstag, den 16. April 2009

Der Domino Designer hält ein - unseres Wissens undokumentiertes - Feature bereit. Wenn man eine oder mehrere Tabellenzeile/n markiert, kann man anschließend bei gedrückter STRG-Taste die Tabellenzeile/n per Pfeiltasten rauf und runter verschieben. Das erspart einem doch so einige lästige Cut&Paste-Operationen. Das funktioniert natürlich nur bei gleichmäßig geformter Tabelle, aber immerhin. Getestet haben wir es bisher unter R7.0.3 und 8.5, also auch in der Eclipse-Version des Clients.

8Apr 090

@WORD in Lotus Script nachbilden

am Mittwoch, den 8. April 2009

Mit dem nachfolgenden Script kann die Funktion "@WORD" nachgebildet werden:

Function functWord(Byval s As String,Byval c As String,Byval n As Integer) As String

'Word aus String bilden
' = @Word(Zeichenfolge,Delimiter,Position)

Dim x As String
Dim i As Integer

For i = 1 To n
If Instr(s, c) > 0 Then

x = Left(s, Instr(s, c) - 1)

s = Mid(s, Instr(s, c) + Len(c))

Else

x = s

s=""

End If

Next

functWord = x

End Function

25Mrz 090

Problem bei Datenbanken vom Typ „DB-übergreifende Suche“ – GetAllDocumentsByKey liefert keine Dokumente

am Mittwoch, den 25. März 2009

Es gibt offensichtlich ein Problem mit der Methode "NotesView.GetAllDocumentsByKey(strKey)" in LotusScript. Wenn diese in einer Datenbank vom Typ "DB-übergreifende Suche" ausgeführt wird, liefert Notes zwar die versprochene "NotesDocumentCollection", es wird aber bei dem Versuch, aus dieser Collection ein Dokumentobjekt zu instanziieren ( z. B. mit "Set Document = NotesDocumentCollection.GetFirstDocument"), kein solches Objekt zurückgegeben. Wird der Datenbanktyp auf "Standard" geändert funktioniert es auf Anhieb.
Einen Workarround stellt die Verwendung der "NotesViewEntryCollection" dar. Diese liefert auch Dokumente. Trotzdem ist uns der Fehler etwas suspekt...

19Mrz 090

Neues Entwicklerbuch für Notes/Domino 8

am Donnerstag, den 19. März 2009

Bei Addison-Wesley ist ein neues Entwicklerbuch für Notes/Domino 8 erschienen: "Das LotusScript Entwicklerbuch für Notes/Domino 8" (26. Februar 2009 - 1212 Seiten, keine CD).
Das Buch beschäftigt sich intensiv mit den noteseigenen Objekt- und Datenstrukturen, liefert eine Übersicht der Sprachbefehle sowie eine Detailbetrachtung der Klassen (rund 500 Seiten!). Java bzw. Javascript sind hier (tatsächlich) kein Thema. Ein Thema sind allerdings die "Verbundanwendungen" (Composite Applications), die aber auf 22 Seiten eher spärlich betrachtet werden, wobei zu sagen ist, das die Betrachtung von Webaspekten offensichtlich bewußt vermieden wurde.

Fazit: Das Buch richtet sich sowohl an Einsteiger als auch an langjährige Notes-Entwickler. Für den Einsteiger dürfte es jedoch schwierig sein, sich anhand dieses Buches in der Notes-Welt "einzuleben", dafür sind die Themen schon zu speziell. Für den fortgeschritten Entwickler stellt es auf den ersten Blick aber ein sehr ordentliches Nachschlagewerk dar.

Das Buch: Das LotusScript-Entwicklerbuch für Notes/Domino 8

2Feb 090

Dokumente kopieren ohne das Erstellungsdatum zu ändern

am Montag, den 2. Februar 2009

Wenn in Lotus Notes Dokumente per Copy & Paste kopiert werden, wird das Erstelldatum auf das Datum während des Kopiervorganges geändert. Dieses Problem kann nur mit Hilfe von Lotus Script umgangen werden.

Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim archiv As NotesDatabase
Dim collection As NotesDocumentCollection
Dim doc As NotesDocument
Set db = session.CurrentDatabase
Set collection = db.AllDocuments
Set archiv = session.GetDatabase( db.Server, "PfadDatenbank.nsf" )
For i = 1 To collection.Count
Set doc = collection.GetNthDocument( i )
Call doc.CopyToDatabase( archiv )
' Wenn die Dokumente in der Originaldatenbank
' geloescht werden sollen:
Call doc.remove( True )
Next
End
Sub

Quelle: