Dynamic Lotusscript

Тема в разделе "Библиотеки скриптов", создана пользователем morpheus, 7 авг 2007.

  1. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Функция Execute шикарная вещь при правильном применении.
    Вы только вчитайтесь в описание
    компиляции и запуска и выгрузки целых динамических библиотек
    Синтаксис:
    Execute ( text )
    где text - собственно и есть запускаеммый скрипт

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

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

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

    Работа с динамическими классами
    В ниже приведённом примере некоторые переменные и процедуры загружены из другого модуля
    Код (Text):
     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 ). Этот метод хорошо использовать с точки зрения оптимизации - мы подгружаем только те модули которые будем использовать, ничего лишнего.
    Конечо же эта техника не новая. Я лично пользуюсь ею(поисковая система). Можете прочитать про эту технику тут

    Теперь я думаю пора привести более сложный пример
    Код (Text):
    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
    как видите
    - код который идет за End
    - или 0, если в код не был включен End, или End ничего не вернул.

    Пример
    Код (Text):
    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 выведет нам одну из надписей про позитив или негатив



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

    Mihal Гость

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

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    ВАЖНО что, не просто глобальными, а Public-декларациями. Т.е. strReturnVal должен быть Public.
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Как я ни бился End не возвращал мне значения, пришлось через внешнюю Public переменную.
    Код (LotusScript):
    res = Execute(scriptCode)
    res всегда был 0.
    Код (LotusScript):
    Sub Callme()
    if Stat != 0 then
    End -1
    else
    End 3
    End if
    End Sub
    call CallMe()
     
Загрузка...
Похожие Темы - Dynamic Lotusscript
  1. motogarri
    Ответов:
    16
    Просмотров:
    452
  2. SvetlanaL
    Ответов:
    0
    Просмотров:
    182
  3. tumanovalex
    Ответов:
    1
    Просмотров:
    829
  4. NickProstoNick
    Ответов:
    1
    Просмотров:
    820
  5. irishman
    Ответов:
    42
    Просмотров:
    9.355

Поделиться этой страницей