Autor(en): | Axel |
Stand: | 20.01.2006 |
Version: | 1.0 |
Domino-Versionen: | 5.x, 6.x, 7.x |
Inhalt1. Überblick2. Zweck3. Syntax4. Anwendung5. Anwendungsbeispiele 5.1 Berechnung des Durchschnittes
5.2 Ersetzen von Text
5.3 Abfrage nach einer gesetzten Rollen
6. Beschränkungen7. Quellen1. EinführungMit der Evaluate-Anweisung wurde in LotusScript eine Möglichkeit geschaffen, Formelfunktionen in Script zu nutzen. Dadurch lassen sich oft mehrere Zeilen Script-Code durch eine Zeile ersetzen und Funktionen ausführen, die mit nativem Script nur sehr schwer oder aber auch gar nicht realisieren lassen. Dieses führt auch nicht selten zu einem effizienterem Code.
2. ZweckMit diesem Artikel soll anhand von einigen Beispielen gezeigt werden, wie einfach sich Formelfunktionen in LotusScript nutzen lassen.
3. SyntaxDie Syntax der Evaluate-Funktion sieht wie folgt aus.
Syntax Evaluate ( formula$ [ ,doc ]
)Parameterformula$ - Formelanweisung als String
doc - Optional. Verweis auf ein Notesobjekt, welches die Formelfunktion benötigt. Ist in der Regel ein Notesdokument.
RückgabeLiefert die Formelfunktion einen Wert zurück, gibt Evaluate diesen als Variant-Datentyp zurück. Ansonsten wird kein Wert zurückgegeben.
4. AnwendungDie Evaluate - Anweisung interpretiert alles, was im Parameter formula$ in Anführungszeichen übergeben wird als Formel. Wenn innerhalb der Formelfunktion Anführungszeichen benötigt werden, was sehr häufig der Fall ist, dann müssen diese als doppelte Anführungszeichen geschrieben werden.
Beispiel:
...
varRet = Evaluate("@Explode(""Das~ist~ein~Text""; ""~"")")
...
Bei komplexeren Formel kann das sehr schnell sehr unübersichtlich werden. Dehalb ist hier die Verwendung der alternativen String-Begrenzer {} oder | | (Pipe-Zeichen) dringend angeraten.
Beispiel:
...
varRet = Evaluate({@Explode("Das~ist~ein~Text"; "~")})
...
Die oben gezeigten Beispiele sind relativ statisch. Ab der Notes-Version 4.6.1 besteht die Möglichkeit die Formelanweisung flexibler (dynamischer) zu gestalten und den Aufruf der Formelfunktionen mit LotusScript - Variablen zu kombinieren.
Beispiel:
...
Dim strTemp As String
strTemp = "Das~ist~ein~Text"
varRet = Evaluate({@Explode("} & strTemp & {"; "~")})
...
Soll mit den Formelfunktionen, die Evaluate übergeben werden, auf Feldinhalte eines Dokumentes zugegriffen werden, kann mit dem zweiten Parameter festgelegt werden, ein Verweis auf das Notesdokument übergeben werden. Das bedeutet, dass die Formel im Dokumentkontext ausgeführt wird, was gleichbedeutend ist, als wenn die Formel direkt innerhalb des Dokumentes aufgerufen wird.
Beispiel:
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
varRet = Evaluate ( {@IsMember (Firma ; "Lotus" : "IBM" : "Microsoft")}, doc)
Msgbox varRet(0)
In diesem Beispiel wird 1 angezeigt, wenn im Feld Firma des Notesdokumentes Lotus, IBM oder Microsoft enthalten ist. Sonst wird 0 ausgegeben.
5. AnwendungsbeispieleAnhand einiger Beispiele soll die Verwendung der Evaluate-Anweisung nochmals verdeutlich werden.
5.1 Berechnung des DurchschnittesÜber einen Aktionsbutton in einer Maske soll der Durchschnittswertes einer Werteliste berechnet werden. Die Liste ist in einem Feld hinterlegt.
Sub Click(Source As Button)
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim varResult As Variant
'Formelanweisungen als Kontante festlegen
Const strFormula = "@Sum(WerteListe) / @Elements(WerteListe)"
'Zugriff auf Dokument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.Document
varResult = Evaluate(strFormula, doc)
Messagebox("Der Durchschnitt beträgt " & varResult(0))
End Sub
5.2 Ersetzen von TextIn einer Maske ist im Feld Bestelltext ein allgemeingültiger Text vorhanden. In diesem Text ist eine "Variable" <Name> enthalten. Diese soll beim Speichern des Dokumentes durch den, im Feld Bearbeiter eingetragenen Namen ersetzt werden.
Beispiel:
Text im Feld Bestelltext: "Die Bestellung wurde von <Name> bearbeitet"
Im Feld Bearbeiter wurde "Testus Testmann" eingetragen.
Beim Speichern wird der Text im Feld Bestelltext in "Die Bestellung wurde von Testus Testmann bearbeitet" geändert.
Sub Querysave(Source As Notesuidocument, Continue As Variant)
Dim doc As NotesDocument
Dim varResult As Variant
'Formelanweisungen als Kontante festlegen
Const strFormula = |@ReplaceSubstring( Bestelltext; "<Name>"; Bearbeiter)|
'Zugriff auf Dokument
Set doc = Source.Document
varResult = Evaluate(strFormula, doc)
doc.Bestelltext = varResult
End Sub
5.3 Abfrage nach einer gesetzten RollenOftmals muss in einem Script ermittelt werden ob für den aktuellen User eine bestimmte Role gesetzt wurde oder nicht. Inzwischen lässt sich das auch über die entsprechenden Script-Klassen NotesACL und NotesACLEntry realisieren. Doch diese Methode hat eine entscheidende Einschränkung. Wenn der User nicht explizit in der ACL enthalten ist, d.h. er ist nur über eine Gruppe in der ACL vorhanden, funktioniert die Sache nicht mehr. Hier hilft dann nur noch die Formelfunktion @UserRoles weiter. Zusammen mit @IsMember lässt sich @UserRoles sehr leicht über die Evaluate-Anweisung in eine Funktion verpacken.
Function RoleEnabled(sRole As String) As Integer
Dim vResult As Variant
vResult = Evaluate(|@IsMember("| & sRole & |"; @UserRoles)|)
If vResult(0) = 1 Then
RoleEnabled = 1
Else
RoleEnabled = 0
End If 'If vResult(0) = 1
End Function
Beispielaufruf:
...
If RoleEnabled("[Admin]") Then
Messagebox "Rolle Admin ist gesetzt"
Else
Messagebox "Rolle Admin ist nicht gesetzt"
End If
...
6. BeschränkungenDie Evaluate-Anweisung kann nur mit Formelfunktionen, die keine Benutzerschnittstelle besitzen, verwendet werden.
Formelbefehle, die mit @Command bzw. @PostedCommand aufgerufen werden, sind ebenfalls nicht zulässig.
- @Command (and @PostedCommands)
- @DDEInitiate
- @DDETerminate
- @DDEExecute
- @DDEPoke
- @Prompt
- @DialogBox
- @PickList
7. Quellen