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

  • Автор темы mmm
  • Дата начала
M
#1
Доброго времени суток

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

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

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", но печатается пустышка.
Подскажите плз где зарыта собака???
 

nvyush

Lotus team
22.04.2009
2 317
0
#2
mmm
Глобальными переменными лучше не пользоваться — косяков не оберёшься. По крайней мере нужно иметь ввиду, что "глобальной" такая переменная будет только в рамках формы, представления и т.д., где включается библиотека. Т.е. если включить билиотеку в форму, то при открытии двух документов для каждого из них будет своя "глобальная" переменная. В рамках сессии Лотуса глобальными могут быть поля профильного документа, переменные окружения, сообщения в очередях. Поищите по форуму, инфа есть. Что касается Вашего кода, то use "L1" в Library L3 — лишнее.
 

Omh

Lotus team
04.07.2007
2 210
1
#3
mmm
Были тут темы по глобальным объектам во время всей лотусной сессии, можно туда посмотреть.
Но в твоём случае я передавал бы новую переменную именно как параметр, т.е. изменил бы число параметров ф-ий и их вызовы.
Что бы не "обязательно забуду где-нибудь в какой-нибудь кнопке исправить вызываемую функцию" можно попользоваться Teamstudio configurator + стандартный RALS (recompile all...).
 
M
#5
На сервере есть БД с неким агентом обработчиком запросов который обрабатывает документы. Агент вызывает функции из большого количества библиотек, вложенность вызываемых функций может достигать 4 уровней. К сожалению бывают и ошибки в коде, :bequiet: , знание номера ошибки и ее строчки не всегда спасает, хотелось бы понять как туда пришли. Хотел для этого агента создать текстовую глобальную переменную в которую бы записывал имя каждой вызванной функции, значении которой записывал бы в лог при ошибке.

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

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

Klido

#6
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 обработчики есть...
 

nvyush

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

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

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

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

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#8
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 или методов.
 

Omh

Lotus team
04.07.2007
2 210
1
#10
будет вычищать айтемы всех элементов дизайна, заканчивающиеся на "_O". Потом нужно будет 2 раза перекомпилить базу RALS'ом.
Я тоже так делаю.
Правда, при сложной структуре (63 биб-ки) 2-х раз не хватает, но 4 - вполне :)
 

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#11
Я тоже так делаю.
Правда, при сложной структуре (63 биб-ки) 2-х раз не хватает, но 4 - вполне :)
У меня только в базовом шаблоне 78 :) , мне 2-х раз хватает))) Хотя не буду спорить - нужно делать столько, сколько требуется ;)

P.S. Кстати, если при этом удалять и айтем $Signature, то при рекомпиляции каждой библиотеки вылетает сообщение, что подписи нет. Никто не знает (может настройки какие есть?), как подавить эти сообщения?
 
M
#12
mmm
Были тут темы по глобальным объектам во время всей лотусной сессии, можно туда посмотреть.
Но в твоём случае я передавал бы новую переменную именно как параметр, т.е. изменил бы число параметров ф-ий и их вызовы.
Что бы не "обязательно забуду где-нибудь в какой-нибудь кнопке исправить вызываемую функцию" можно попользоваться Teamstudio configurator + стандартный RALS (recompile all...).
Подскажите плз где можно качнуть Teamstudio configurator. Про него слышал, но найти дистрибутив, что бы попробовать не получалось
 
M
#13
mmm

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

mmm
2. Косяк-2: Option Public отсутствует в Library L2 и Library L3.
по умолчанию оно прописано, пардон забыл показать в примере, кстати в Library3 public как раз не обязателен

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

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

mmm
4. Прямое изменение глобальной переменной в других (дочерних) модулях считается дурным тоном (вспоминаем Страуструпа).
Чтобы уменьшить негативное влияние глобальных переменных, а также исключить случаи ошибок, лучше для изменения значения гл.пер. использовать процедуры (+ использование процедур/функций лучше для компиляции).
А ещё лучше объединять гл.пер. по функциональному признаку и создавать классы (держать одну гл.пер. собственного класса, чем кучу "россыпью"); менять значение "поля" класса с помощью Property Set или методов.
Если писать о хороших манерах тогда как уважаемый выходит на отладчик ошибок, потому как он не может использовать метки - это как раз более отвратительная манера должна быть у Страуструла
Глобальна переменная мне нужна как раз, для отслеживания ошибок пути вложенного вызова функции которое может доходить до 4 уровней. И использоваться как раз во всех функциях. Лучше плакать и есть кактус, чем пользоваться удобной вещью которая не влияет на логику в целом. Другое дело что оказалось это вещь криво реализована. Злоупотр*цензура*ть такими вещами нельзя, но крайне редко это можно как в случаем с меткой на выход при ошибке.
 

nvyush

Lotus team
22.04.2009
2 317
0
#15

VladSh

начинающий
Lotus team
11.12.2009
1 260
5
#16
косяк из-за которого не работает??? :whoareyou?: Лучше когда вызывается функция из библиотеки, а какой никто не знает. Я всегда объявляю все библиотеки из которых вызываются текущие функции. И работал с чужим кодом где этого не делали 30 библиотек в каждой по 40 функций, и ищи свищи нужную функцию которую надо поправить, а та вызывает другую такую же и т.д.
То просто ещё красных окон не ловили из-за таких переподключений.
У меня правило: вызывать функцию только тогда, когда знаешь откуда она :)
В идеале надо наизусть знать всю иерархию библиотек и какая функция в какой находится.
Для чужих проектов можно пользоваться:
- Design Synipsis;
- ScriptBrowser (бесплатна);
- Configurator (платна).

Но вообще - Ваш выбор ;)
Если писать о хороших манерах тогда как уважаемый выходит на отладчик ошибок, потому как он не может использовать метки - это как раз более отвратительная манера должна быть у Страуструла
Не понял.
Обработка ошибок в LotusScript реализована на метках, от этого никуда не уйдёшь, - особенность среды; Страуструп тут не при чём.
Глобальна переменная мне нужна как раз, для отслеживания ошибок пути вложенного вызова функции которое может доходить до 4 уровней. И использоваться как раз во всех функциях. Лучше плакать и есть кактус, чем пользоваться удобной вещью которая не влияет на логику в целом.
Ни плакать, ни есть кактус не надо. Задача элементарная, решена уже сотни раз; в инете есть куча различных реализаций.