Autor Thema: [LotusScript]: Evaluate  (Gelesen 31523 mal)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
[LotusScript]: Evaluate
« am: 20.01.06 - 14:39:06 »
Autor(en):Axel
Stand:20.01.2006
Version:1.0
Domino-Versionen:5.x, 6.x, 7.x

Inhalt

1. Überblick
2. Zweck
3. Syntax
4. Anwendung
5. Anwendungsbeispiele
   5.1 Berechnung des Durchschnittes
   5.2 Ersetzen von Text
   5.3 Abfrage nach einer gesetzten Rollen
6. Beschränkungen
7. Quellen


1. Einführung

Mit 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. Zweck

Mit diesem Artikel soll anhand von einigen Beispielen gezeigt werden, wie einfach sich Formelfunktionen in LotusScript nutzen lassen.


3. Syntax

Die Syntax der Evaluate-Funktion sieht wie folgt aus.

Syntax
   
   Evaluate ( formula$ [ ,doc ])

Parameter

formula$ - Formelanweisung als String

doc         - Optional. Verweis auf ein Notesobjekt, welches die Formelfunktion benötigt. Ist in der Regel ein Notesdokument.

Rückgabe
Liefert die Formelfunktion einen Wert zurück, gibt Evaluate diesen als Variant-Datentyp zurück. Ansonsten wird kein Wert zurückgegeben.


4. Anwendung

Die 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. Anwendungsbeispiele

Anhand 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 Text

In 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 Rollen

Oftmals 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änkungen

Die 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


Ohne Computer wären wir noch lange nicht hinterm Mond!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz