Dynamic Lotusscript

morpheus

скриптописец
07.08.2006
3 915
1
#1
Функция Execute шикарная вещь при правильном применении.
Вы только вчитайтесь в описание
LotusScript considers text a separate script, compiling and executing it as a temporary module that's unloaded as soon as execution finishes.
компиляции и запуска и выгрузки целых динамических библиотек
Синтаксис:
Execute ( text )
где text - собственно и есть запускаеммый скрипт

Код:
Sub Initialize
Dim strCode As String
strCode = { MsgBox "Это динамическая библиотека" }
Execute( strCode )
End Sub
попробуйте запустить этот код :)

Ну чтож теперь попробуем более сложный код, в котором сдержиться более одной строки
Код:
Sub Initialize
Dim strCode As String
strCode = { 
Dim strMessage as String
strMessage = "Это динамическая библиотека"
msgbox strMessage
}
Execute( strCode )
End Sub
Имейте в виду что символы перехода строки используються для разделения строк в переменной strCode
Как видите оба примера делают одно и тоже - показывают окно с соощением "Это динамическая библиотека".

Я думаю теперь суть функции Execute должна быть Вам ясна. Далее попытаемся продемонстрировать Вам возможность использования этой функции в приложениях

Работа с динамическими классами
В ниже приведённом примере некоторые переменные и процедуры загружены из другого модуля
Код:
 Sub Initialize
Dim strCode as String
strCode = {
Use "libArrayManager"
Dim AM as ArrayManager
Set AM = new ArrayManager()
}
Execute strCode
End Sub
Этот динамический код загружает библиотеку ArrayManager и экземпляр класса ArrayManager. Фишка в том что в 4й строке мы динамически подгружаем модуль. Таким образом в режиме runtime мы можем программно решать - подгружать модули или нет. Эта техника называеться Динамическая загрузка классов ( Dynamic Class Loading ). Этот метод хорошо использовать с точки зрения оптимизации - мы подгружаем только те модули которые будем использовать, ничего лишнего.
Конечо же эта техника не новая. Я лично пользуюсь ею(поисковая система). Можете прочитать про эту технику тут

Теперь я думаю пора привести более сложный пример
Код:
Declarations
Dim strReturnVal as String
Sub Initialize
Dim strCode as String
Dim strModule as String
Dim strFunction as String
Dim strParam as String

strModule = "libUser"
strFunction = "getCountry"
strParam = "Orky Dorky"

strCode = |
Use | & strModule & |
strReturnVal = | & strFunction & |(| & strParam & |)|
Execute strCode
Msgbox strReturnVal
End Sub
Теперь как Вы видите - все динамическое: подгружаеммый модуль, имя запускаеммой функции, параметр для функции. Прошу обратить внимание на две верхние строки. они позволяют нам обьединять переменные для статического и динамического кода. ВАЖНО это будет работать только с глобальными декларациями, имено потому strReturnVal задекларированно в самом верху!

Канечно, приведённые выше примеры слишком просты, но я думаю суть фунции Execute у меня получилось Вам передать.

от себя отмечу что интересным есть то что возвратит нам фунция Execute
Return value
The Execute function returns one of the following values:
The return code of an End statement, if one was executed.
Zero (0), if no End statement was executed, or if the executed End statement had no return value.
как видите
- код который идет за End
- или 0, если в код не был включен End, или End ничего не вернул.

Пример
Код:
Sub ComputeInterest
Dim script As String, calc As String, retcode As Integer
calc$ = InputBox("Compute loan interest (charge/loan)")
script$ = _
|Option Declare
Sub Initialize
Dim pct As Single  
pct! = | & calc$ & | 
If pct! < 0 Then
End -2				  ' -2 is a status code.
ElseIf pct! > 1 Then
End -3				  ' -3 is a status code.
End If
MessageBox("Interest is " & Format(pct!,"percent"))
End Sub|
retcode% = Execute (script$)
If retcode% = -2 Then
MessageBox("You computed a negative interest rate!")
ElseIf retcode% = -3 Then
MessageBox("You computed an excessive interest rate!")
End If
End Sub
Как видим в данном динамическом коде присутствуют End -2 и End -3. В зависимости от значения retcode наш MessageBox выведет нам одну из надписей про позитив или негатив



Вольный перевод отсюда
 
M

Mihal

#2
Мало того, на Execute можно построить настраиваемое "слабое" взаимодействие между двумя базами. База А шлёт базе Б письмо с кодом, который надо выполнить в базе Б. В базе Б агент отлавливает пришедшее письмо и выполняет пришедший код. всё красиво, естественно и прозрачно.
 

TIA

:-)
Lotus team
15.05.2009
790
3
#3
Теперь как Вы видите - все динамическое: подгружаеммый модуль, имя запускаеммой функции, параметр для функции. Прошу обратить внимание на две верхние строки. они позволяют нам обьединять переменные для статического и динамического кода. ВАЖНО это будет работать только с глобальными декларациями, имено потому strReturnVal задекларированно в самом верху!
ВАЖНО что, не просто глобальными, а Public-декларациями. Т.е. strReturnVal должен быть Public.
 

savl

Lotus team
28.10.2011
2 136
105
#4
Как я ни бился End не возвращал мне значения, пришлось через внешнюю Public переменную.
Код:
res = Execute(scriptCode)
res всегда был 0.
Код:
Sub Callme()
if Stat != 0 then 
End -1
else
End 3
End if
End Sub
call CallMe()