Dynamic LotusScript

  • Автор темы morpheus
  • Дата начала
M

morpheus

Функция 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 выведет нам одну из надписей про позитив или негатив



 
  • Нравится
Реакции: Tungan
M

Mihal

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

TIA

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

ВАЖНО что, не просто глобальными, а Public-декларациями. Т.е. strReturnVal должен быть Public.
 

savl

Lotus Team
28.10.2011
2 624
314
BIT
518
Как я ни бился End не возвращал мне значения, пришлось через внешнюю Public переменную.
Код:
res = Execute(scriptCode)
res всегда был 0.
Код:
Sub Callme()
if Stat != 0 then 
End -1
else
End 3
End if
End Sub
call CallMe()
 
  • Нравится
Реакции: VladSh

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Как я ни бился End не возвращал мне значения, пришлось через внешнюю Public переменную.
Поддержу коллегу.

Visual Basic:
(Declarations)
'Ошибка при Execute
Const ERR_COMPILE = 156

'Используется в скриптах, исполняемых через Execute для возврата описания ошибки
Public glbErrorText As String
'Используется в скриптах, исполняемых через Execute для возврата кода ошибки
Public glbErrCode As Integer


%REM
    Sub ExecuteEx
    Description: обёртка, генерирующая реальную ошибку, которая возникла в коде, исполняемом с помощью Execute;
    обрабатываются глобальные переменные glbErrCode и glbErrorText.
    Написана потому, что в передаваемых скриптах почему-то End 1 перестала работать, а также для унификации обработки.
%END REM
Sub ExecuteEx(sLSCode As String)
    On Error GoTo ErrH
  
    glbErrCode = 0
    glbErrorText = ""
    Dim nRet As Integer
    nRet = Execute(sLSCode)
    If glbErrCode <> 0 Then
        Error glbErrCode, glbErrorText
    Else
        If nRet <> 0 Then Error ERR_COMPILE, ""
    End If
    Exit Sub
  
ErrH:
    Dim sErrText As String
    If Len(glbErrorText) <> 0 Then
        sErrText = glbErrorText
    ElseIf Len(Error$) <> 0 Then
        sErrText = Error$
    Else
        sErrText = "Ошибка при выполнении временно-скомпилированного модуля"
    End If
    If glbErrCode <> 0 Then
        nRet = glbErrCode
    Else
        nRet = Err
    End If
    Error nRet, GetThreadInfo(1) & " (" & Erl & ") -> " & sErrText
End Sub
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!