HCL Notes / Domino / Diverses > Entwicklung

Statischer Code in LS Execute()

(1/2) > >>

Flachmann:
Hi,

ich habe mich gerade mit dem LotusScript-Befehl Execute() beschäftigt. Den hatte ich noch nie verwendet. So wie ich das verstehe kann man halt dynamisch Code erzeugen und ausführen. Könnte praktisch sein.

Dann habe ich mal geschaut, wo HCL den nutzt. Z.B. im v12-Mailtemplate, irgendwo bei den Signaturen. Dort nutzt HCL das aber für statischen Code.

D.h. sie setzen eine Variable 'script', die dann ausgeführt wird:

--- Code: ---script = |Dim wksp As New NotesUIWorkspace
Dim uiDoc As NotesUIDocument
Set uiDoc = wksp.CurrentDocument
If Not(lcase(uiDoc.Currentfield) = "body") Then
Call uiDoc.GotoField("Body")
End If
[...]
|

[...]
Execute(script)
[...]

--- Ende Code ---

Warum macht man das? Man könnte doch auch einfach an dieser Stelle den Code direkt ausführen, da er ja immer identisch ist. HCL nutzt diese Technik - immer mit statischem Code - an mehreren Stellen. Nur, was erreicht man damit im Gegensatz zum direkt eingefügtem, "echten" Code?

Tode:
Ich kann an dieser Stelle nur Vermutungen anstellen: Möglicherweise wird die Script- Library auch im "Backend" verwendet, also in einem Agenten, oder im Web. Dann reichte früher (ob das heute noch so ist, weiss ich gar nicht) alleine die Verwendung von "Dim ws as New NotesUIWorkspace" aus, dass der Code nicht ausgeführt wurde, selbst wenn sich die Deklaration in einem Abschnitt befand, den man nie aufgerufen hat.

Ich vermute, dass der Code aus diesem Grund in ein Execute ausgelagert wurde, weil wie Du schon richtig schreibst: So wie das umgesetzt wurde, ergibt sich für mich kein anderer Sinn, weil der Code ja gar nicht dynamisch gebildet wird.

jBubbleBoy:
Eventuell liegt es am folgenden Aufruf von uiDoc.DeleteSignature - der hier im Ausschnitt nicht zu sehen ist ::)
DeleteSignature ist nämlich keine offiziell beschriebene Funktion in LotusScript.

Wer sich den Code anschauen möchte, findet ihn hier: CoreEmailClasses_de/UIMemoDocument/RemoveSignature

Riccardo Virzi:
Die statischen Skripte kann ich auch nicht verstehen, aber Execute kann zum Beispiel genutzt werden, um dynamisch Skript Bibliotheken zu laden.

Beispiel Code (der funktioniert nicht, nur um das Prinzip zu zeigen):

--- Code: ---Dim lib as Variant

If Typ = "A" Then
    script = {Use "Lib-Typ-A"
                  Set lib = New Lib-Typ()}
Elseif Typ = "B" Then
    script = {Use "Lib-Typ-B"
                  set lib = New Lib-Typ()}
Else
    script = {Use "Lib-Typ-Sonstige"
                  set lib = New Lib-Typ()}
End If

Execute script

Call lib.macheWas()
--- Ende Code ---

Je nach Inhalt der Variable Typ wird eine andere Skript Bibliothek geladen und das Objekt lib als Klasse Lib-Typ initialisiert. Nach dem Execute ist die Variant Variable lib mit der Klasse Lib-Typ initialisiert und die Methoden/Eigenschaften können verwendet werden.

Zweite Möglichkeit, die ich selber bereits mehrfach verwendet habe: ich habe Standard Skript Bibliotheken, die durch Kunden erweitert werden können. Die Kunden können direkt die Skript Bibliothek ändern, dann gibt es ein Problem beim nächsten Update. Oder der Kunde schreibt seinen Skript Code im Designer und testet das. Sobald der Code funktioniert, per Copy&Paste in ein Notes Dokument einfügen. In meiner Skript Bibliothek lese ich den Code aus dem Notes Dokument aus und nutze Execute, um den Kunden Code auszuführen.

Dadurch kann ich jederzeit ein Update meiner Standard Skript Bibliothek machen, ohne die Funktionen des Kunden zu überschreiben.
Weiterer Vorteil: die Skript Bibliotheken müssen nicht mehr neu kompiliert werden nach jedem Update

Flachmann:

--- Zitat von: Tode am 02.10.23 - 08:32:59 ---Ich vermute, dass der Code aus diesem Grund in ein Execute ausgelagert wurde, weil wie Du schon richtig schreibst: So wie das umgesetzt wurde, ergibt sich für mich kein anderer Sinn, weil der Code ja gar nicht dynamisch gebildet wird.
--- Ende Zitat ---
Ok, ich dachte schon ich würde etwas übersehen.


--- Zitat von: jBubbleBoy am 02.10.23 - 09:20:07 ---Eventuell liegt es am folgenden Aufruf von uiDoc.DeleteSignature - der hier im Ausschnitt nicht zu sehen ist ::)

--- Ende Zitat ---
Man weiß ja nicht, was diese undokumentierte Funktion eigentlich macht. Klar, sie löscht die Signatur, aber es ist nicht zu erkennen woran die Routine die Signatur überhaupt erkennt. Der Execute()-Code setzt aber eigentlich auch keinen erkennbaren Merker.

Beim Signatur einfügen ist ein weiteres Beispiel. :-:  Das sind wohl die höheren LotusScript-Coding-Weihen, die ich nie erreichen werden... Da kann alter Datenmüll sein, oder ergibt unter diesen Umständen Sinn.


--- Zitat von: Riccardo Virzi am 02.10.23 - 10:48:12 ---Die statischen Skripte kann ich auch nicht verstehen, aber Execute kann zum Beispiel genutzt werden, um dynamisch Skript Bibliotheken zu laden.
--- Ende Zitat ---
Sehr coole Idee!  :D

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln