1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программирован. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление
  2. Чат codeby в telegram перезагрузка. Обсуждаем вопросы информационной безопасности и методы защиты информации, программирование. Задавайте свои вопросы и комментируйте чужие. Подробнее ...

    Скрыть объявление

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

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

  1. mmm

    mmm Гость

    Репутация:
    0
    Доброго времени суток

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

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

    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 Well-Known Member
    Lotus team

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

    Omh Well-Known Member
    Lotus team

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

    nvyush Well-Known Member
    Lotus team

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

    mmm Гость

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

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

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

    Klido Гость

    Репутация:
    0
    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 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В обработчик ошибок пишем что-то вроде:
    Код:
      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

    Репутация:
    0
    Регистрация:
    11 дек 2009
    Сообщения:
    1.248
    Симпатии:
    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 Гость

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

    Omh Well-Known Member
    Lotus team

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

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

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

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

    mmm Гость

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

    mmm Гость

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

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

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

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

    Omh Well-Known Member
    Lotus team

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

    nvyush Well-Known Member
    Lotus team

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

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

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

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

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