Объявление глобальных переменной в нескольких библеотеках

Тема в разделе "Lotus - Программирование", создана пользователем mmm, 10 мар 2010.

  1. mmm

    mmm Гость

    Доброго времени суток

    Имеется БД с несколькими библиотеками в которых много функций. Появилась потребность создать глобальную переменную, что бы ее можно было изменять в любой функции и передавать далее в любую вызваную. Описывать в каждой функции передаваемых переменных не хочется, поскольку надо перелапачивать очень много кода и обязательно забуду где-нибудь в какой-нибудь кнопке исправить вызываемую функцию.

    Попытался пойти следующим путем:

    Library L1
    Options
    Option Public
    Declarations
    Public AAA as string ' та самая глобальная переменная - AAA

    Library L2
    Options
    use "L1"
    function L2_F1
    print AAA
    end

    Library L3
    Options
    use "L1"
    use "L2"
    function L3_F1
    AAA = "123"
    call L2_F1
    end

    По логике вроде должно напечататься "123", но печатается пустышка.
    Подскажите плз где зарыта собака???
     
  2. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    mmm
    Глобальными переменными лучше не пользоваться — косяков не оберёшься. По крайней мере нужно иметь ввиду, что "глобальной" такая переменная будет только в рамках формы, представления и т.д., где включается библиотека. Т.е. если включить билиотеку в форму, то при открытии двух документов для каждого из них будет своя "глобальная" переменная. В рамках сессии Лотуса глобальными могут быть поля профильного документа, переменные окружения, сообщения в очередях. Поищите по форуму, инфа есть. Что касается Вашего кода, то use "L1" в Library L3 — лишнее.
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    mmm
    Были тут темы по глобальным объектам во время всей лотусной сессии, можно туда посмотреть.
    Но в твоём случае я передавал бы новую переменную именно как параметр, т.е. изменил бы число параметров ф-ий и их вызовы.
    Что бы не "обязательно забуду где-нибудь в какой-нибудь кнопке исправить вызываемую функцию" можно попользоваться Teamstudio configurator + стандартный RALS (recompile all...).
     
  4. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
  5. mmm

    mmm Гость

    На сервере есть БД с неким агентом обработчиком запросов который обрабатывает документы. Агент вызывает функции из большого количества библиотек, вложенность вызываемых функций может достигать 4 уровней. К сожалению бывают и ошибки в коде, :bequiet: , знание номера ошибки и ее строчки не всегда спасает, хотелось бы понять как туда пришли. Хотел для этого агента создать текстовую глобальную переменную в которую бы записывал имя каждой вызванной функции, значении которой записывал бы в лог при ошибке.

    Пробывал создавать глобальную переменную в агенте, она существует только на одну вложенность. Т.е. если из агента вызывается функция, а из этой функции друга, то в последней этой глобальной переменно уже не наблюдается.

    На кой черт нужны тогда глобальные переменные
     
  6. Klido

    Klido Гость

    mmm
    включить в обработчик передачу ошибок в стек и смотреть...
    например, не далее как вчера смотрел
    http://www.openntf.org/Projects/pmt.nsf/Ho...20?OpenDocument
    берите оттуда AddToStackTrace и используйте

    между прочим OpenLog на http://www-10.lotus.com/ldd/bpmpblog.nsf/ назвали "the gold standard for error logging in LotusScript", хотя там уже и Java&Javascript обработчики есть...
     
  7. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В обработчик ошибок пишем что-то вроде:
    Код (Text):
      Error Err, Error + chr&(10) + <ModuleName> + Getthreadinfo(1) + " line: " + Cstr(Erl)
    и получаем историю вызовов функций, приведших к ошибке. Можно также добавить информацию о юнидах документов, приведших к ошибке, и т.п., но это уже зависит от специфики функций.

    p.s. Подробнее тут: http://www.ferdychristant.com/blog//articles/DOMM-6BPT8R
     
  8. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    mmm

    1. Косяк в Library L3: use "L1" уже есть в Library L2. Из Library L3 его нужно убрать!

    2. Косяк-2: Option Public отсутствует в Library L2 и Library L3.

    3. В 8.5.х переделали библы на, типа, эклипс, и видимо что-то задели. Иногда, когда в скомпиленном проекте меняешь Library L2, то появляются симптомы, показаные Вами. RALS здесь не помогает... в этом и заключается трабл.
    Нужно вручную открыть самую нижнюю библиотеку, перекомпилить её, потом вызывающую и т.д...
    Если это напрягает, то можно написать код, который будет вычищать айтемы всех элементов дизайна, заканчивающиеся на "_O". Потом нужно будет 2 раза перекомпилить базу RALS'ом. Все проблемы подобного рода уйдут. Я такую операцию делаю над дизайном как минимум раз в год.

    Добавлено: кстати в 8.5.х можно быстро проверить откуда переменная (глобальная или локальная), т.е. правильно ли организованы/скомпилены библиотеки, - всплывёт окошко, в котором покажется имя библиотеки, в которой она объявлена, и её тип. Исли тип Variant, а переменная у вас не Variant, то значит что-то здесь не так... :)

    4. Прямое изменение глобальной переменной в других (дочерних) модулях считается дурным тоном (вспоминаем Страуструпа).
    Чтобы уменьшить негативное влияние глобальных переменных, а также исключить случаи ошибок, лучше для изменения значения гл.пер. использовать процедуры (+ использование процедур/функций лучше для компиляции).
    А ещё лучше объединять гл.пер. по функциональному признаку и создавать классы (держать одну гл.пер. собственного класса, чем кучу "россыпью"); менять значение "поля" класса с помощью Property Set или методов.
     
  9. Klido

    Klido Гость

    угу, вот прямо сейчас вручную нижние переоткрываю :)
     
  10. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Я тоже так делаю.
    Правда, при сложной структуре (63 биб-ки) 2-х раз не хватает, но 4 - вполне :)
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    У меня только в базовом шаблоне 78 :) , мне 2-х раз хватает))) Хотя не буду спорить - нужно делать столько, сколько требуется ;)

    P.S. Кстати, если при этом удалять и айтем $Signature, то при рекомпиляции каждой библиотеки вылетает сообщение, что подписи нет. Никто не знает (может настройки какие есть?), как подавить эти сообщения?
     
  12. mmm

    mmm Гость

    Подскажите плз где можно качнуть Teamstudio configurator. Про него слышал, но найти дистрибутив, что бы попробовать не получалось
     
  13. mmm

    mmm Гость

    косяк из-за которого не работает??? :) Лучше когда вызывается функция из библиотеки, а какой никто не знает. Я всегда объявляю все библиотеки из которых вызываются текущие функции. И работал с чужим кодом где этого не делали 30 библиотек в каждой по 40 функций, и ищи свищи нужную функцию которую надо поправить, а та вызывает другую такую же и т.д.

    по умолчанию оно прописано, пардон забыл показать в примере, кстати в Library3 public как раз не обязателен

    работаю я 7 версии

    Если писать о хороших манерах тогда как уважаемый выходит на отладчик ошибок, потому как он не может использовать метки - это как раз более отвратительная манера должна быть у Страуструла
    Глобальна переменная мне нужна как раз, для отслеживания ошибок пути вложенного вызова функции которое может доходить до 4 уровней. И использоваться как раз во всех функциях. Лучше плакать и есть кактус, чем пользоваться удобной вещью которая не влияет на логику в целом. Другое дело что оказалось это вещь криво реализована. Злоупотр*цензура*ть такими вещами нельзя, но крайне редко это можно как в случаем с меткой на выход при ошибке.
     
  14. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    К сожалению, это замедляет загрузку форм/кнопок и т.д.
     
  15. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Тут ответ на Ваш вопрос http://codeby.net/ipb.html?s=&sh...st&p=162657. Хоть двадцать уровней вложенности
     
  16. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    То просто ещё красных окон не ловили из-за таких переподключений.
    У меня правило: вызывать функцию только тогда, когда знаешь откуда она :)
    В идеале надо наизусть знать всю иерархию библиотек и какая функция в какой находится.
    Для чужих проектов можно пользоваться:
    - Design Synipsis;
    - ScriptBrowser (бесплатна);
    - Configurator (платна).

    Но вообще - Ваш выбор ;)
    Не понял.
    Обработка ошибок в LotusScript реализована на метках, от этого никуда не уйдёшь, - особенность среды; Страуструп тут не при чём.
    Ни плакать, ни есть кактус не надо. Задача элементарная, решена уже сотни раз; в инете есть куча различных реализаций.
     
Загрузка...
Похожие Темы - Объявление глобальных переменной
  1. AlexandrJava
    Ответов:
    0
    Просмотров:
    184
  2. bobo
    Ответов:
    1
    Просмотров:
    2.952
  3. sum44
    Ответов:
    2
    Просмотров:
    2.401

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