Autor Thema: Statischer Code in LS Execute()  (Gelesen 749 mal)

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Statischer Code in LS Execute()
« am: 29.09.23 - 11:45:30 »
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)
[...]

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?

Gruß,
  __________
  _/_
  /lachmann

Offline Tode

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Antw:Statischer Code in LS Execute()
« Antwort #1 am: 02.10.23 - 08:32:59 »
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.
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Antw:Statischer Code in LS Execute()
« Antwort #2 am: 02.10.23 - 09:20:07 »
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
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline Riccardo Virzi

  • Junior Mitglied
  • **
  • Beiträge: 70
Antw:Statischer Code in LS Execute()
« Antwort #3 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.

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()

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

Offline Flachmann

  • Senior Mitglied
  • ****
  • Beiträge: 284
  • Geschlecht: Männlich
  • Mal wieder: Flachmann ist Schuld!
Antw:Statischer Code in LS Execute()
« Antwort #4 am: 02.10.23 - 19:10:22 »
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.
Ok, ich dachte schon ich würde etwas übersehen.

Eventuell liegt es am folgenden Aufruf von uiDoc.DeleteSignature - der hier im Ausschnitt nicht zu sehen ist ::)
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.

Die statischen Skripte kann ich auch nicht verstehen, aber Execute kann zum Beispiel genutzt werden, um dynamisch Skript Bibliotheken zu laden.
Sehr coole Idee!  :D

Gruß,
  __________
  _/_
  /lachmann

Offline Tode

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 6.885
  • Geschlecht: Männlich
  • Geht nicht, gibt's (fast) nicht... *g*
Antw:Statischer Code in LS Execute()
« Antwort #5 am: 04.10.23 - 08:23:41 »
Ich verwende das in der N4Y Toolbar, um dynamisch eine globale Variable mit der richtigen Klasse zu initialisieren. Daruch kann ich immer weitere Funktionen hinzufügen und muss über den jeweiligen Symbolleisten- Button nur den Klassennamen mitgeben:

Code
	actionClass = g_ctx.ses.Getenvironmentstring("N4Y_Toolbar_Action_Name")
	Call g_ctx.ses.Setenvironmentvar("N4Y_Toolbar_Action_Name", "")
	
	classBuilder = |
	Use "N4Y.ToolbarActionLib"
	Sub Initialize
		Set g_toolbarAction = New TA_| & actionClass & |
	End Sub
	|
	On Error Goto ErrorExecute
	Execute classBuilder
	On Error Goto ErrorRoutine

Und der ErrorHandler fängt gleich noch ab, wenn es die Klasse gar nicht gibt und gibt eine entsprechende Meldung aus
Gruss
Torsten (Tode)

P.S.: Da mein Nickname immer mal wieder für Verwirrung sorgt: Tode hat NICHTS mit Tod zu tun. So klingt es einfach, wenn ein 2- Jähriger versucht "Torsten" zu sagen... das klingt dann so: "Tooode" (langes O, das r, s und n werden verschluckt, das t wird zum badischen d)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz