5. Сервисы¶
5.1. Горячие клавиши¶
5.1.1. Концепция¶
Горячие клавиши позволяют быстро вызывать наиболее часто используемые операции или действия.
В системе есть несколько типо глобальных клавиш:
- Глобальные. Глобальные храняться в реестре в ветке COMMON^HOTKEYS. Данные клавиши уникальны в рамках базы. Используются они как правило в захаркоденных пункатх меню или других действиях которые могут вызываться в Global FrameWork. Пользователи повлиять на эти события/действия как правило не в силах, но предоставляется возможность изменить горячию клавишу с помощью которой можно быстро вызвать действие. Для редактирования этих горячих клавиш реализован интерфейс Главное меню -> Настройки -> Горячие клавиши
- Горячие клавиши выборки. Реализуются через возможность добавить горячию клавишу на паскаль операцию.
- Жеско прописаные к Global FrameWork.
Приоретет срабатывания обработчиков паскаль операций
- Горячие клавиши активного контрола выборки
- Горячие клавиши выборки, в т.ч. операций выборки
- Жеско прописаные к Global FrameWork.
- Глобальные
5.1.2. Список горячих клавиш клавиш¶
5.1.2.1. Глобальные¶
Для базы BitecDev (Выпускается с нее BTK )
5.1.2.2. Захаркоденные клавиши приложения и фреймов¶
- Esc - Отмена редактирования контрола выборки (захардкодено - изменению не подлежит). Если редактирования не было, или активный контрол не поддерживает возврат к предыдущему состоянию, показывается вопрос о закрытии текущей формы.
- Ctrl+End - Выделяет последнюю запись в гриде. Для выборки с режимом частичной прогрузки данных подтягивает очередной блок данных и выделяем в нем последнюю запись.
- Ctrl+Alt+End - Аналогично предыдущему, но для выборки с частичной прогрузки тянет все данные. При необходимости эту комбинацию горячих клавиш можно будет сделать настраиваемой через конфигуратор.
- LWIN+[действие вызывающее CreateForm()] - открытие формы в новом окне. Без ALT поиск такого же окна и его активация
- Shift+Alt+1 - копирование в буфер обмена ссылки на активное окно.
- Shift+Alt+2 - создание файла с расширением url, содержащего ссылку на активное окно, во временной папке, и копирование его в буфер обмена.
- Shift+Alt+3 - тоже самое что и выше, но в буфер обмена копируется полный путь с именем файла.
- Shift+Alt+4 - открытие ссылки из буфера обмена.
Редактор скриптов (ScriptEditor)
- Ctrl+Shift+S - Добавить SQL блок
- Ctrl+Shift+P - Добавить паскаль блок
5.1.3. Реализация¶
(Написано для системной разработки)
При нажимании горячих клавиш вызывается метод-обработчик. Далее от активного контрола вверх по иерархии (parent) идет запрос, обрабатывает ли этот контрол полученную комбинацию клавиш. (Для этого контрол должен реализовывать интерфейс IbtkShotCutCollection). Если да, иерархичный запрос прекращается.
5.2. Служба оповещений¶
Служба оповещения предназначена для обмена мгновенными текстовыми сообщения пользователями системы Global. Служба оповещения может работать либо на основе внутреннего механизма СУБД Oracle, Oracle Alerts, либо на основе выделенного XMPP (Jabber) - сервера. Каждое решение обладает своими достоинствами и недостатками. Главной причиной использование Jabber - сервера является снижение нагрузки на сервер Oracle при большом количестве подключенных пользователей.
5.2.1. Настройка XMPP сервера оповещений¶
5.2.1.1. Использование XMPP (jabber) сервера сообщений¶
Для использование службой оповещения в качестве транспорта XMPP протокола, необходимо выполнить следующие действия:
- Установить Jabber - сервер
- Установить XMPP - клиент на сервер Oracle
- Добавить новые сущности на базу.
- Что делать если сервис оповещений не работает
После выполнения всех шагов можно будет переключить режим работы службы оповещения с использованием Oracle Alerts на использование XMPP сервера. Для этого надо открыть настроки службы оповещения Конфигуратор > Главное Меню > Настройки > Настройки службы оповещений (рис. 1) и выбрать в выпадающем списке “Режим работы службы сообщений” значение “XMPP”.

рис.1. Настройки службы оповещений
Для правильной работы службы оповещений необходимо указатель актульную информацию об установленном сервере. По умолчанию, порт для не шифрованных соединений равен 5222, а имя сервера совпадает с IP адресом хоста на котором установлен jabber - сервер.
5.2.1.1.1. Работа с XMPP сервером на клиенте¶
Соединение с jabber - сервером устанавливается при загрузке приложения. Если пользователя с таким именем и паролем на jabber - сервере не существует, то происходит автоматическое добавление нового пользователя. При разрыве соединения, по причине потери TCP\IP соединения с хостом сервера или обрыве сессии со стороны jabber - сервера, будет производиться повторные циклические попытки подключения к jabber - серверу каждые 25 секунд.
Для отправки и получения сообщений как и в случае использования Oracle Alerts служит фрейм открывающийся по команде Конфигуратор > Главное Меню > Сервисы > Служба оповещения (рис.2).

рис.2. Фрейм службы оповещения
В левом нижнем углу отображается состояние соединения с сервером(подключен, подключение... , отключен). В правом нижнем углу, состояние отправки сообщений, где показанно количество оставшихся в очереде не отправленных на сервер сообщений. При закрытие приложения Global, надо убедится, что сообщения из очереди для всех адресатов отправлены. Очередь сообщений в клиенте на отсылку создается что бы минимизировать “замораживание” пользовательского интерфейса в момент отправки и выполняется в фоновом потоке. Нажатие на кнопку “Отправить” не приводит к моментальной отправке сообщения на сервер, а только к добавлению в очередь. Сообщение отправленное пользователю не подключенному к jabber - серверу, но зарегестрированному на нем, будет доставлено позже, при установки соединения jabber - сервером с данным пользователем. Для подключения пользователя к Jabber серверу используется пароль от сессии пользователя в Оракле. В случае, если не удается подключиться по причине того, что пароль сессии поменялся, то используется серверный метод для сброса пароля на Jabber сервере btk_Clientgate.ResetPassword;
5.2.1.1.2. Работа с XMPP сервером на стороне Oracle¶
Оболочкой для XMPPMessageSender Java Source пакета является пакет BTK_XMPP. Что бы начать работать с XMPP сервером необходимо запустить службу отправки сообщений методом StartSending. Остановить отправку можно методом StopSending. Остановка отправки приведет к выгрузке объекта XMPPMessageSender из памяти и разрыву соединения с XMPP(Jabber) сервером. После того, как служба запущена, сообщения можна отправлять методом:
PutMessage(sTo varchar2, sMsgText varchar2, bCriticalMessage number);
где:
- sTo - JID получателя или системное имя подписки;
- sMsgText - текст сообщения;
- bCriticalMessage – флаг критического сообщения, такое окно с полученным сообщенем на клиентском приложении Global будет мигать, либо будет показано в модальном режиме. Доступно три уровня критичности от 0 до 2 в порядке возрастания.
Сообщение с помощью метода PutMessage не отправляется мгновенно получателю, а добавляется в таблицу сообщений, из которой уже и будет отправлено выполняющемся в фоновом потоке Java методом.
В пакете dbms_alert внесены измененения, в результате которых при вызове метода Signal, анализируется транспорт, который использует служба оповещения. Если транспортом является XMPP протокол, то для отправки сообщения используется пакет BTK_XMPP. В противном случае, используется прежний механизм отправки сообщения.
Что бы воспользоватся методом Signal для отправки события через Oracle Alert не учитывая настройки транспорта в службе оповещения, необходимо третьим параметром в методе Signal передать значение 0. По умолчанию значение третьего параметра равно 1 учитываются настройки службы оповещения. Четвертый параметр - уровень критичности, по умолчанию 0.
dbms_alert.Signal('SubscribeName', 'MessageText',0,0);
Доступен отладочный режим, когда в стандартный лог (product/admin/DBName/bdump/, либо в DBMS OUTPUT, если выполнить dbms_java.SetOutput(1000000) ) выводится дополнительная информация о процессе отправки сообщений, в этом случае XMPP сервером необходимо запустить с помощью метода
StartSendingDebugMode;
Лог выводится в DBMS_OUTPUT после остановки отпраки сообшений методом btk_XMPP.stopsending. В логе содержаться информация об ошибках, этапы выполнения отправки сообщений, время выполнения атомарных операций при отсылки сообщений.
5.2.1.2. Необходимые сущности в БД для работы с XMPP сервером¶
Для работы Global клиента на БД должны присутствовать следующие элементы (Скрипты уже присутствуют в модуле BTK-Common начиная с версии 1.4.62.0 и если он у вас есть, то прогонять ничего дополнительно из этого раздела не нужно).
В версии BTK_COMMON 1.4.66.0. появилась возможность указывать критичность сообщений(-1 - по умолчанию, 0 - нормальная, 1 - высокая, 2 - очень высокая)
В версии 67 появился метод, сброс пароля.
В пакете BTK_ClientGate:
В заголовке пакета:
--======================================================================
-- Функция возвращает курсор со списком пользователей подписки
--======================================================================
Function GetUsersBySubscription (sSubscription in Varchar2) return TRef;
--======================================================================
-- Функция возвращает 1 sSubscription является системным именем подписки
--======================================================================
Function IsSubscription (sSubscription in Varchar2) return number;
--======================================================================
-- Функция возвращает сохранненый порт XMPP сервера
--======================================================================
Function XMPPPort return number;
--======================================================================
-- Функция возвращает сохранненое имя XMPP сервера
--======================================================================
Function XMPPServer return varchar2;
--======================================================================
-- Функция возвращает режим работы алертера:
-- 0 - Oracle Alert
-- 1 - XMPP сервер (Jabber)
--======================================================================
Function AlerterMode return number;
--======================================================================
-- Функция запускат ява метод выполняющий отсылку сообщений на джебер сервер
--======================================================================
procedure XMPPEnable;
--======================================================================
-- Функция выключает ява метод выполняющий отсылку сообщений на джебер сервер
--======================================================================
procedure XMPPDisable;
--======================================================================
-- Функция возвращает время отображения всплывающих окон с критическими
-- сообщениями
--======================================================================
Function MsgWindowLifeTime return number;
--======================================================================
-- Сбрасывает пароль у текущего пользователя сессии для сервера OpenFire,
-- пароль становится равный имени пользователя
--======================================================================
procedure ResetPassword;
В теле пакета:
--======================================================================
-- Функция возвращает курсор co списком пользователей подписки
--======================================================================
Function GetUsersBySubscription (sSubscription in Varchar2) return TRef
as
begin
return btk_xmpp.GetUsersBySubScription(sSubscription);
end;
--======================================================================
-- Функция возвращает 1, если sSubscription является системным именем подписки
--======================================================================
Function IsSubscription (sSubscription in Varchar2) return number
is
begin
return btk_xmpp.IsSubscription(sSubscription);
end;
--======================================================================
-- Функция возвращает сохранненый порт XMPP сервера
--======================================================================
Function XMPPPort return number
as
svClassName varchar2(30);
nRes varchar2(254);
begin
svClassName := 'SEL_Application';
nRes := nvl(BTK_Compile.GetClassProperty(svClassName, 'nXMPPPort'), '5222');
return nRes;
end;
--======================================================================
--Функция возвращает сохранненое имя XMPP сервера
--======================================================================
Function XMPPServer return varchar2
as
svClassName varchar2(30);
vRes varchar2(254);
begin
svClassName := 'SEL_Application';
vRes := nvl(BTK_Compile.GetClassProperty(svClassName, 'sXMPPServer'), '0');
return vRes;
end;
--======================================================================
-- Функция возвращает режим работы алертера:
-- 0 - Oracle Alert
-- 1 - XMPP сервер (Jabber)
--======================================================================
Function AlerterMode return number
as
svClassName varchar2(30);
svAM varchar2(254);
begin
svClassName := 'SEL_Application';
svAM := nvl(BTK_Compile.GetClassProperty(svClassName, 'nAlerterMode'), '0');
if svAM = '0' then
return 0;
else
return 1;
end if;
end;
--======================================================================
-- Функция запускат ява метод выполняющий отсылку сообщений на джабер сервер
--======================================================================
procedure XMPPEnable
as
l_job number;
begin
btk_xmpp.StopSending;
dbms_job.submit(job => l_job, what => 'BTK_XMPP.StartSending;',NEXT_DATE => trunc(sysdate)+30/86400,INTERVAL => null);
commit;
end;
--======================================================================
-- Функция выключает ява метод выполняющий отсылку сообщений на джабер сервер
--======================================================================
procedure XMPPDisable
as
begin
btk_xmpp.StopSending;
end;
--======================================================================
-- Функция возвращает время отображения всплывающих окон с критическими
-- сообщениями
--======================================================================
Function MsgWindowLifeTime return number
as
svClassName varchar2(30);
vRes varchar2(254);
begin
svClassName := 'SEL_Application';
vRes := nvl(BTK_Compile.GetClassProperty(svClassName, 'nMsgWindowLifeTime'), '10000');
return vRes;
end;
--======================================================================
--Сбрасывает пароль у текущего пользователя сессии для сервера OpenFire,
-- пароль становится равный имени пользователя
--======================================================================
procedure ResetPassword
as
begin
btk_xmpp.ResetPassword;
end;
Понятия AlertFrameCaption(на основе BTK 1.4.57.0).
Выборка Sel_AppTuningAlert(на основе BTK 1.4.57.0).
Пакет DBMS_ALERT в схеме BTK(на основе BTK 1.4.57.0) Параметр critically доступен с BTK_COMMON 1.4.66.0. В пакете изменен метод Signal:
procedure signal(name in varchar2, message in varchar2, except number DEFAULT 1, critically number DEFAULT -1)
as
begin
IF Btk_ClientGate.AlerterMode = 0 or except = 0
or Upper(message) = Upper('__ODAC_Terminate_Event__') or Upper(message) = Upper('__ODAC_Blank_Message__') then
sys.dbms_alert.signal(name, message);
ELSE
btk_XMPP.PutMessage(name, message, critically);
END IF;
end;
5.2.1.3. Установка XMPP клиента в Oracle¶
Что бы иметь возможность отправлять сообщения пользователем Global используя службу оповещений с сервера Oracle установим Java XMPP клиента на сервере БД.
Для этого необходимо выполнить следующие шаги (все операции выполняются под пользователем btk):
Скопировать файлы библиотек
Smack.jar
иSmackx.jar
в каталог “[каталог установки oracle]\product\10.2.0\db_1\LIB\smack\”. Загрузить библиотеки на рабочу базу, [SID] надо заменить на нужную БД:loadjava -u btk/btk@[SID] -r -v smack.jar loadjava -u btk/btk@[SID] -r -v smackx.jar
Скомпилировать XMPPMessageSender Java Source пакет. Перед компиляцией в тексте пакета необходимо найти строку “private static final String btk_URL = “jdbc:oracle:thin:@[YOUR_HOST]:1251:[YOUR_SID]”; ” и заменить [YOUR_HOST] на адрес узла где находится БД, [YOUR_SID] на SID базы на которую производится установка. Найти строки:
private static final String btk_usrname = "btk"; - имя пользователя базы private static final String btk_pswd = "btk"; - пароль пользователя BTK
и прописать пароль BTK.
Создать таблицу сообщений(Присутствует в BTK-COMMON с версии 1.4.62.0):
drop table XMPPMSGs; create table XMPPMSGs ( id number primary key NOT NULL, MsgText varchar(2000), sTo varchar(255) NOT NULL, bCriticalMessage NUMBER, dDATE DATE ); / create sequence seq_XMPPMSGs; /
Создать глобальный контекст среды выполнения(Включен в BTK-COMMON начиная с 1.4.67.0 ):
CREATE OR REPLACE CONTEXT GlobalXMPPContext USING btk_XMPP ACCESSED GLOBALLY; /
Создать и скомпилировать пакет BTK_XMPP(Присутствует в BTK-COMMON с версии 1.4.62.0) С версии 1.4.66.0 появилась в методе возможность PutMessage указывать критичность сообщений
- -1 - по умолчанию, если это подписка, то будет использована критичность указанная для подписки
- 0 - нормальная критичность
- 1 - высокая критичность
- 2 - очень высокая критичность
Создать триггер на старт базы, который однократно запускает Job, в котором будет выполняться цикл JAVA метода, ожидающий поступления новых сообщений в таблицу XMPPMSGs(Присутствует в BTK-COMMON с версии 1.4.62.0):
create or replace trigger btk_TrgStartupDB after startup on database declare l_job number; begin if Btk_ClientGate.AlerterMode = 1 then dbms_job.submit(job => l_job, what => 'BTK_XMPP.StartSending;'); end if; end;/
Выполнить под пользователем sys (указать ваш NETWORKNAME - имя компьютера в сети; XMPPServerNETWORKNAME - имя хоста на котором установлен XMPP сервер; вместо ‘D:\ORACLE\PRODUCT\10.2.0\DB_2\JAVAVM\lib\security\cacerts’ указать свой путь к JAVAVM\lib\security\cacerts’ в папке базы ORACLE):
begin dbms_java.grant_permission( 'BTK', 'SYS:java.lang.RuntimePermission', 'getClassLoader', '' );'' dbms_java.grant_permission( 'BTK', 'SYS:java.net.SocketPermission', NETWORKNAME, 'connect, resolve' ); dbms_java.grant_permission( 'BTK', 'SYS:java.net.SocketPermission', XMPPServerNETWORKNAME, 'connect, resolve' ); dbms_java.grant_permission( 'BTK', 'SYS:java.io.FilePermission', 'D:\ORACLE\PRODUCT\10.2.0\DB_2\JAVAVM\lib\security\cacerts', 'read' ); end; /
5.2.1.4. Установка и настройка XMPP сервера¶
В качестве сервера сообщений можно использовать любой XMPP сервер, но рекомендуется использовать OpenFire бесплатный сервер с открытыми исходными текстами. Последнию версию с JRE можно скачать c сайта Igniterealtime. В приведенной ниже инструкции по установке использовалась версия OpenFire 3.6.3 для Windows и Oracle 10.2.0.4.0 в Windows XP SP3.
Для начала установки необходимо запустить скаченный файл openfire_3_6_3.exe (рис.1).

Рис.1. Начала устаноки OpenFire
Нажимаем кнопку Next (рис.2).

Рис.2. Установка OpenFire. Лицензионное соглашение
Нажимаем кнопку Next (рис.3).

Рис.3.Установка OpenFire. Выбор каталога установки
Оставляем каталог по умолчанию и нажмем Next (рис.4).

Рис.4.Установка OpenFire.Опции создания ярлыков
Нажимаем кнопку Next (рис.5).

Рис.5. Завершение установки OpenFire
Перед запуском OpenFire потребуется выполнить еще несколько действий, потому необходимо снять флаг с “Run Openfire” и нажать кнопку Finish. Теперь сервер Openfire установлен и осталось задать основные настройки.
Для хранения настроек, сообщений и информации о пользователях серверу Openfire необходимо хранилище данных. Под такое хранилище мы будем использовать рабочую БД Oracle, на которой установлены приложения Global. Для этого необходимо:
Выполнить SQL скрипт [Каталог установки Openfire]\resources\database\openfire_oracle.sql под пользователем “btk”. Используем утилиту SQLPlus из командной строки >sqlplus btk/btk@DBName @c:\Program Files\Openfire\resources\database\openfire_oracle.sql.
Для доступа к БД Oracle серверу Openfire необходим oracle thin jdbc driver. Его можно либо скачать с официального сайта oracle, либо скопировать “ojdbc14.jar” из каталога [каталог установки oracle]\product\10.2.0\db_1\jdbc\lib\ и поместить в каталог [Каталог установки Openfire]\lib\.
Теперь можно переходить к настройке Openfire сервера. Запустим [Каталог установки Openfire]\bin\openfire.exe (рис. 6).

Рис.6. Запуск OpenFire
Ввойдем в консоль администрирования введя в интернет браузере в строке адреса http://127.0.0.1:9090 (рис.7).

Рис.7. Выбор языка интерфейса консоли администрирования
Выберем язык English и нажмем кнопку Continue (рис. 8).

Рис.8. Настройки сервера
Введем в поле Domain текущий сетевой IP адрес вашего компьютера. Порты оставим без изменений. Кнопка Continue (рис.9).

Рис.9. Выбор вида используемой СУБД
Оставляем Standard Database Connection и нажимаем Continue (рис. 10).

Рис.10. Настройка подключения к БД
В Database Driver Presets выбираем шаблон Oracle. В поле Database URL вставляем адрес компьютера, где находится СУБД Oracle и SID базы (В нашем случае это b14 и GreenDB соответственно). Указываем UserName/пароль: btk/btk. Нажимаем Continue (рис.11).

Рис.11. Настройка групп пользователей
Оставляем Default. Означает, что пользователи и группы будут храниться на сервере БД. Нажимаем Continue (рис.12).

Рис.12. Задание пароля администратора
Задаем пароль администратора, e-mail можно не вводить. Нажимаем Continue (рис.13). В случае если были введены не правильные настройки при установки, в файле bin\openfire.xml нужно стереть блок <setup> ... </setup> и снова задать настройки через http://127.0.0.1:9090. Для полной переустановки Openfire на прежнию базу необходимо удалить все таблицы созданный при установки OpenFire (именя таблиц начинаются на “OF..”).

Рис.13. Вход в консоль администрирования
Вводим логин admin и пароль для входа в консоль администрирования (http://127.0.0.1:9090). Нажимаем Login (рис.14).

Рис.14. Консоль администрирования
Если все сделано правильно, то откроется консоль администрирования. Процесс установки OpenFire завершен.
Далее необходимо добавить пользователя btk. Для этого перейдем на вкладку Users/Groups и на жем на Create New User (рис.15).

Рис.15. Добавление нового пользователя 1
Заполняем поля данными о пользователе btk, в качестве пароля указываем btk, нажимаем Create User(рис. 16).

Рис.16. Добавление нового пользователя 2
Теперь на вкладке Server -> Server Manager -> System Properties сохранить(добавить) свойство xmpp.client.idle со значением -1.
Из консоли администрирования теперь можно выйти.
Для запуска сервера OpenFire вместе со стартом операционной системы установим приложение OpenFire как службу. В командной строке из каталога [Каталог установки Openfire]\bin выполнить
openfire-service /install
openfire-service /start
По умолчанию виртуальной машиной Java выделяется под Openfire 64 mb виртуальной памяти, что безусловно мало, и при даже не большой нагрузке сервер будет падать с ошибкой не хватки памяти. Для увеличения количества выделяемой памяти необходимо создать текстовый файл “bin\openfire-service.vmoptions” и прописать верхнию и нижнию границу памяти которую необходимо выделять. Мы пропишем 512 mb, но можно и больше, если будет не хватать:
-Xms512m
-Xmx512m
Ошибки можно посмотреть в лог файлах: каталог “\logs”.
5.2.1.5. Что делать если сервис оповещений не работает¶
Что делать если сервис оповещений не работает
- Убедится, что OpenFire сервер работает и есть соединение с базой данных - зайти в веб-администратор сервера;
- Убедится, что работает отправка сообщений с клиента. Для этого открыть фрейм оповещений (главное меню Сервис-> Оповещения), проверить состояние в поле подключение, должно быть “Подключен к серверу”. Если состояние другое, смотреть пункт
- Проверить отправку сообщений с сервера. Для проверки можно послать сообщение с сервера на клиент используя следующий код(все инструкции выполняются pl/sql developer):
declare
begin
dbms_alert.signal('LoginName','Test message text', 1, 1);
end;
После выполнения кода, клиентское приложение подключенное под пользователем LoginName должно получить сообщение ‘Test message text’. Если сообщение не получено, то необходимо выполнить следующие проверки:
Убедится, что пакеты btk_XMPP и dbms_alert скомпилировны. А в Java Sources скомпилирован пакет XMPPMessageSender. Если пакетов нет, или не удается скомпилировать следует обратиться к статье Установка клиента XMPP в Oracle;
В списке сессий должно быть N соединений “JDBC Thine Client”(количество соединений задается в свойствах соединения XMPP сервера, по умолчанию от 5 до 25) от сервера XMPP. Работающий сервер XMPP должен иметь соединения с БД; В списке сессий должна быть системная сесcия от ORACLE.EXE(J000). Сессия запускается работающей JAVA-программной рассылки сообщений. Отсутствие сессии говорить о том, что либо служба не запущена, либо остановилась по причине внутренней ошибки. Сервис рассылки запускается при старте базы. Можно запустить и вручную выполнив:
declare l_job number; begin if Btk_ClientGate.AlerterMode = 1 then dbms_job.submit(job => l_job, what => 'BTK_XMPP.StartSending;'); end if;
Если после выполнения кода сессия от программы ORACLE.EXE(J000) не появилась, либо сессия есть, но сообщения не отправляются, необходимо перейти к следующему пункту. Если не удается запустить службу оповещения (ORACLE.EXE(J000) нет в списке сессий), либо отправка сообщений не приводит к положительному результату, можно использовать запуск службы в отладочном режиме с выводом текстового лога работы службы оповещения. В пакете BTK_XMPP наравне с методом StartSending, есть метод StartSendingDebugMode запускающий службу оповещения в режиме отладки.
Перед стартом отладки выполнить:
declare begin btk_xmpp.StopSending; end;
и убедится в отсутствие в списке сессий соединения от программы ORACLE.EXE(J000) для предотвращения возможных блокировок.
Теперь можно запустить службу оповещения:
declare begin dbms_java.set_output(10000000); btk_Xmpp.StartSendingDebugMode; end;
Отправка будет выполняться в текущем потоке, потому будет наблюдаться эффект “зависания”. Дальше пытаемся отправить тестовое сообщение:
declare begin dbms_alert.signal('LoginName','Test message text', 1, 1); end;
и остановить службу:
declare begin btk_xmpp.StopSending; end;
После остановки службы лог можно посмотреть на вкладке DBMS_Output в окне в котором был выполнен вызов StartSendingDebugMode. Лог успешной отправки будет похож на следующий:
2009-11-09 16:48:11.234 Выбор записей
2009-11-09 16:48:11.297 Конец Выбора записей
2009-11-09 16:48:11.312 Ожидание сигнала
2009-11-09 16:48:20.219 Сигнал. Значение флага:1
2009-11-09 16:48:20.219 Выбор записей
2009-11-09 16:48:20.219 Конец Выбора записей
2009-11-09 16:48:20.219 Начало нового цикла
2009-11-09 16:48:20.219 Прочитано из таблицы STO:LoginName MSG:Test message text ID:4026
Получение настроек XMPP сервера
ServerName:b53:5222
MessageSender Create
Keep AliveInterval = 30000
Create ConnectionConfiguration
Create XMPPConnection
MessageSender Create, Login by btk/btk
2009-11-09 16:48:34.078 Ошибка отправки No response from the server.:
Повторная попытка подключения
MessageSender Create
Keep AliveInterval = 30000
Create ConnectionConfiguration
Create XMPPConnection
MessageSender Create, Login bybtk/btk
2009-11-09 16:48:39.875 Проверка подключения
2009-11-09 16:48:39.875 ВСЕ ОК!!!
2009-11-09 16:48:39.875 Создан объект Message
2009-11-09 16:48:39.875 Перед отправкой сообщений
2009-11-09 16:48:39.875 После отправки сообщения
2009-11-09 16:48:39.891 Сообщениее послано TO:LoginName@b53 MSG:Test message text
Удалено сообщение ID 4026
2009-11-09 16:48:39.891 Проверка на выход
Выход
2009-11-09 16:48:39.891 << Выход >>
2009-11-09 16:48:39.891 Соединение оборвано
Прокомментируем приведенный лог:
- В начала программа делает выбор всех записей которые нужно отправить из таблицы XMPPMSGs при получении сигнала, что добавлено новое сообщение;
- Начинается цикл выбора всех сообщений, выбирается первое сообщение из таблицы(Получатель сообщения:LoginName Текст сообщения: Test message text);
- Проверяется соединение с сервером XMPP, соединение отсутствует: получаем настройки подключения к серверу XMPP и выполняют попытки подключения(Имя сервера и порт: b53:5222) ;
- Соединение с сервером установлено под пользователем btk;
- Создается объект сообщения;
- Выполняется посылка сообщений - сообщение послано успешно;
- Удаляется сообщение из таблицы сообщений XMPPMSGs;
- Прерываем процесс отправки. В лог могут выводится ошибки подключения, отправки сообщений, информация о том каких привилегий недостаточно для пользователя BTK. При анализе лога следует уделить внимание следующим вещам: сообщение из таблицы считывается(обратить внимание на получателя сообщения), подключение к серверу XMPP выполняется(обратить внимание на настройки сервера), сообщение успешно отправляется. Что делать, если не работает отправка сообщений с клиента на клиент(пункт находится на стадии написания).
5.2.2. Критичность сообщений системы оповещения¶
Критичность сообщения задается параметром critically методе Dbms_Alert.signal(name in varchar2, message in varchar2, except number DEFAULT 1, critically number DEFAULT -1,bpCommit in number default 1); или в интерфейсе отправке сообщения на клиенте.
Поведение клиента при получение сообщения:
- По умолчниаю(-1)
- Показывается форма системы оповещения
- В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
- Нормальная(0)
- Показывается форма системы оповещения
- В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
- Высокая(1)
- Показывается форма системы оповещения
- В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
- Критичная(2)
- Показывается сообщение в сплывающем окне внизу справа
- Показывается модальное окно с текстом сообщения
- Форма приложения переноситься на передний план
Свойство “Отображать всплывающее окно” можно установить в через меню Сервис ->Оповещения->Параметры. Откроется карточка где можно в для свойства установить значение в редакторе CheckBox.
5.2.3. Служебные сообщения¶
- IMMEDIATE_HALT_APPLICATION - пользователь может отменить закрытие
- IMMEDIATE_HALT_APPLICATION_NO_WAIT - пользователь не может отменить закрытие
- IMMEDIATE_HALT_APPLICATION_DISCONNECT_WITHOUT_SAVE
- IMMEDIATE_HALT_APPLICATION_DISCONNECT_TRY_SAVE не реализованно
5.3. URI ссылки на выборки¶
Реализована возможность получить ссылку в виде URI на открытую выборку. Ссылку можно передать по сети и использовать для быстрого запуска клиента и открытия нужной выборки.
5.3.1. Регистрация протокола gs-global в Windows¶
Автоматическая регистрация URI схемы gs-global производится при старте клиента. Как результат ОС Windows сможет запускать клиента Global при обработки гипертекстовых ссылок вида “gs-global:\\”. Например, клик на ссылку в браузере. Другим вариантом открыть ссылку находящиюся в буфере обмена, будет вставить содержимое в окно “Выполнить” (WIN + R) и нажать OK.
Схема регистрируется под текущего пользователя, т.е. у каждого из пользователей машины может быть зарегистрирована своя версия(путь к клиенту) клиента отзывающегося на ссылки. Если за обработку ссылок предполагается отвечать какому-то конкретному из возможно запускаемых на машине клиентов (если на машине постоянно запускается различные версии клиентов имеющие существенные отличия друг от друга, разница не безразлична пользователю), то можно выставить флаг в реестре, в ветке URI схемы, запрещающий изменение параметров (автоматически перезаписывать значения клиенту на старте): HKEY_CLASSES_ROOT\gs-global\, readonly (тип DWORD) = 1.
5.3.2. Получение URI ссылки на выборку¶
Реализована возможность формирования и копирования URI ссылок в буфер обмена, а также возможность создания файла-ссылки. Файл-ссылка, это файл с расширением .gsc.
Работа с URI-ссылками осуществляется при помощи пунктов контекстного меню закладок MDI-окон, и горячих клавиш.
В контестное меню добавлены следующие пункты:
- Копировать ссылку (Shift+Alt+1). Помещает в буфер обмена ссылку на активное окно.
- Копировать файл-ссылку (Shift+Alt+2). Создаёт во временной папке файл-ссылку и копирует файл в буфер обмена. Файл можно вставить (CTRL + V) в любую папку(например, рабочий стол) и двойным кликом перейти по ссылки. Файл можно передать по скайп или другими средства обмена сообщениями.
- Копировать полное имя файла-ссылки (Shift+Alt+3). Создаёт во временной папке файл-ссылку, и копирует полный путь файла в буфер обмена.
- Открыть ссылку из буфера обмена (Shift+Alt+4). Открывает ссылку из буфера обмена. Этот пункт меню доступен только если в буфере обмена содержится корректная URI-ссылка на выборку.
- Настройки копирования ссылки. Настройки определяют составные части,
которые будут включены в созданную URI-ссылку.
- Копировать имя пользователя и пароль.
- Копировать имя базы.
- Копировать имя приложения.
- Копировать значения фильтров.
Открытие ссылки в уже открытом клиенте
Реализован функционал открытия выборки по URI-ссылке, использующий следующую логику работы: если в выборке указаны имена базы и/или приложения, производится поиск уже запущенного клиента Global с соответствующим(и) именами. В случае успеха, выборка URI-ссылки открывается на нем. В противном случае, для открытия выборки запускается новое клиентское приложение.
5.3.3. Формат URI ссылки¶
Протокол Global URI:
SCHEME://[USERINFO@]BASE/[APPNAME/]SELECTION/?EXPARAMS
SCHEME == gs-global
USERINFO == login:password
BASE == TNSNAME
APPNAME == Имя приложения Секция может отсутствовать
SELECTION == EntityName.Representation
EXPARAMS == EXPARAM[&EXPARAMS]
EXPARAM ==[ex;]ИмяПараметра=Значение
Пример:
gs-global://DEVBTK/SEL_CONFIGURATORMAINMENU/SEL_MYSELECTION/?ex;idItem#=254352&ex;filter$idStatus=45352;filter$idCaption=Синий
все не разрешенные символы внутри имен параметров и значений должы кодироваться через %
5.4. Командный файл (*.gsc
)¶
GSC - Global System Command
Приложение Global может открывать файлы с расширением .gsc. С помощью данных файлов возможно создавать ссылки на документы системы Глобал. Если файлы с расширением .gsc. будут ассоциированы с приложением Global, то при двойном щелчке мышью в проводнике на имени файла, будет запущено приложение Global, которому в качестве параметра командной строки будет передано имя файла. Если же приложение Global уже было запущено, и текущее приложение совпадает с приложением, указанным в файле, то нового приложения запущено не будет, и файл будет открыт существующим приложением.
Командой в данном случае называется одна из операций главной выборки приложения. Выполнить команду можно
читать как выполнить операцию. Плюсом GSC-файла является тот факт что в нём уже описаны все параметры и
его можно просто “сбросить” любому пользователю. Также к плюсам можно отнести и способность клиента Глобал
выполнять команду из файла в уже запущенном приложении не плодя множество запущенных копий Global.exe
.
5.4.1. Структура¶
Файл gsc является текстовым Ini-файлом, содержащим параметры запуска приложения Global, и параметры поиска запущенного клиента.
- Секция
EXECPARAMS
Содержит параметры команды. Командой в данном случае называется одна из операций главной выборки приложения. Выполнить команду можно читать как выполнить операцию.
- Параметры:
CONNECTSTRING
- строка подключенияAPPLICATION
- Имя главной выборки приложения.OPERATION
- Имя операции главной выборки приложения, которая должна быть выполнена после запуска приложенияPARAMS
- Параметры и значения параметров, которые должны быть доступны при выполнении операции главной выборки приложения.NOSPLASH
- Ключ, позволяющий скрыть окно приветствия.URI
- текст URI-ссылки. Встроенный механизм клиента для открытия документов. Подробнее.
- Секция
[APPLICATIONS]
В секции можно перечислить приложения совместимые с описанной командой. Чаще всего это приложения-наследники общего предка в котором и реализована сама команда. Такой функционал позволяет не плодить запущенные копии клиента на отдельно взятом рабочем месте, если на проекте используется несколько АРМ - можно описать общий командный файл для всех, перечислив все приложения способные обеспечить работу команды.
Приложения перечисляются как параметры секции
APPLICATIONS
в порядке понижения приоритетности сверху-вниз. Самым приоритетным приложением является то, которое указано в секции[EXECPARAMS]
, параметрAPPLICATION
.Note
Поскольку приложения описываются как параметры секции - они обязаны заканчиваться символом
=
, в противном случае такое приложение, без=
будет проигнорировано.Эта особенность считается зарезервированной возможностью, если потребуется задавать дополнительные параметры для каждого совместимого приложения отдельно. Сейчас же эта возможность никак не используется.
Пример файла¶[EXECPARAMS] APPLICATION=SEL_TESTAPPLICATION CONNECTSTRING=preDefinedUser1@ OPERATION=ShowMDIForm PARAMS='FileName=C:\ffff\anyfilename.ext';'SelectionName=SEL_ANY_Selection';'RepName=AnyRep' NOSPLASH=1 [APPLICATIONS] SEL_TESTAPPLICATION_ARM1= SEL_TESTAPPLICATION_ARM2= SEL_TESTAPPLICATION_ARM3=
5.4.2. Где будет выполнен файл¶
GSC-файл может быть выполнен в уже открытом клиентском приложении, или в новом. Это зависит от того имеются ли среди запущенных клиентов приложения совместимые с командой описанной в файле.
- Посик осуществляется по следующим параметрам:
- TNS БД запущенного приложения
- Пользователь под которым выполнен вход в БД
- Наименование главной выборки открытого приложения
Если какой-то параметр из перечисленных не задан в файле - любое значение считается подходящим.
Note
Пропущен может быть любой из параметров поиска, но не все.
БД и Пользователь задаются с помощью параметра
CONNECTSTRING
.В качестве Приложения поочерёдно используются: значение параметра
APPLICATION
и имена всех параметров из секции[APPLICATIONS]
.Если среди запущенных клиентских приложений не нашлось подходящего - запускается новое. При запуске нового приложения используются все указанные в файле параметры, как если бы они были просто переданы через командную строку.
5.4.3. FAQ¶
5.4.3.1. Как проассоциировать файлы *.gsc с Global.exe?¶
- щёлкните правой кнопкой мыши на файле с расширением .gsc в появившемся контекстном меню выберите “Открыть с помощью ...”
- в диалоге выберите приложение Global в качестве редактора файлов данного типа
Note
Для ассоциации расширения файла с программой можно воспользоваться функцией командной строки Assoc
5.4.3.2. Как изменить связь между типом файла и приложением?¶
В качестве инструмента предлагается использовать утилиту командной строки - assoc
.
Запущенная без параметров команда assoc выводит список текущих связей между расширениями имени и типами файлов.
- Синтаксис:
- assoc [
.ext
[=[тип_файла
]]]- Параметры:
.ext
- Задание расширения имени файла.тип_файла
- Задание типа файла, с которым сопоставляется указанное расширение имени файла./?
- Отображение справки в командной строке.Note
- Чтобы удалить связь между расширением имени и типом файла, введите пробел после знака равенства
- Чтобы просмотреть текущие типы файлов, выполните команду
ftype
без параметров- Чтобы направить вывод команды assoc в текстовый файл, воспользуйтесь оператором перенаправления
Примеры:
Вывести текущий тип файла, соответствующий расширению имени файла .txt.¶assoc .txtУдалить тип файла, соответствующий расширению имени файла .txt.¶assoc .txt=Просмотреть текущие сопоставления типов файлов.¶assoc | moreОтправить результаты выполнения команды assoc в файл Assoc.cfg.¶assoc>assoc.cfg
5.5. Внешний вид пользовательского интерфейса. Стили оформления¶
5.5.1. Стили оформления¶
5.5.2. Темы интерфейса¶
Клиент поддерживает использование тем интерфейса (иначе говоря скинов) в формате DevExpress. В теме интерфейса содержится полное описание настраиваемых элементов внешнего вида интерфейса. Сейчас с помощью тем настраивается цветовая схема, заливка, границы и внешний вид элементов пользовательского интерфейса. Настройки текста, кроме цвета фона и букв (шрифт, размер, подчёркивание и т.д.), не настраиваются.
5.5.2.1. Создание и применение собственной темы интерфейса¶
Для создания темы интерфейса необходимо воспользоваться утилитой dxSkinEditor. Тему интерфейса можно либо включить в исполняемый файл, либо загрузить динамически. Динамически загружаться может только одна тему интерфейса. Для динамической загрузки, необходимо файл с темой интерфейса разместить рядом с исполняемым файлом Global с тем же самым именем, но расширением *.skinres (Например global.skinres). Что бы применить динамически подгружаемую тему интерфейса, необходимо в паскаль скрипте выполнить:
<pascal>
Application.SkinName := 'UserSkin';
</pascal>
5.5.2.2. Пользовательские свойства загружаемые из тем интерфейса¶
При использовании не стандартных цветовых и шрифтовых настроек в отображении атрибутов и элементов выборки необходимо использовать внутренние стили Global из справочника стилей. Если вам необходим атрибут с красным фоном, то вместо прямого задания цвета в свойстве атрибута “Стиль раскраски”, лучше указать название стиля из справочника стилей.
В файл темы интерфейса выносятся все свойства влияющие на стиль отображения интерфейса глобальные для всего приложения.
Типы свойств используемые в темах:
- Boolean;
- TColor;
- Integer;
- TRect;
- TSize;
- String.
На данный момент все свойства темы интерфейса типа TColor попадают в репозиторий стилей. К этим свойствам можно обращаться напрямую (средствами DevExpress), или через репозиторий стилей.
Attention
Если не предполагается настройка цвета какого либо графического элемента из btk, следует получать значение цвета не используя репозиторий стилей. Если же наоборот элемент должен настраиваться из btk - нужно использовать именно репозиторий стилей. При этом использование репозитория стилей для получения цвета элемента и использование прямого доступа для получения значений других его свойств сейчас является нормальной практикой.
5.5.2.2.1. Общие свойства¶
- Grid.FilteredHeaderStyle - стиль заголовка фильтра
- Editors.BackgroundColor- задний фон редакторов
- TextReadOnlyColor - цвет текста атрибутов только на чтение
- Editors.BackgroundReadOnlyColor - задний фон атрибутов только на чтение
- SelectionColor - цвет выделений
- SelectionTextColor - цвет текста выделения
5.5.2.2.2. Свойства Диаграммы Ганта¶
- Common.Gantt.VerticalLineMainLevelColor - цвет вертикальных линий главного уровня шкалы.
- Common.Gantt.VerticalLineDetailLevelColor - цвет вертикальных линий детального уровня шкалы.
- Common.TimeLine.VerticalLineMainLevelColor - цвет вертикальных линий главного уровня шкалы таймлайна.
- Common.TimeLine.VerticalLineMainLevelTextColor - цвет подписей вертикальных линий главного уровня шкалы таймлайна.
- Common.TimeLine.VerticalLineDetailLevelColor - цвет вертикальных линий детального уровня шкалы таймлайна.
- Common.TimeLine.VerticalLineDetailLevelTextColor - цвет подписей вертикальных линий детального уровня таймлайна.
- Common.TimeLineScaleGraph.BordersColor - цвет границ шкалы масштабирования таймлайна.
- Common.TimeLineScaleGraph.SliderColor - цвет ползунка шкалы масштабирования таймлайна.
- Common.TimeLineButtonLeft.Glyph - изображение отображающееся на кнопке “Влево” таймлайна.
- Common.TimeLineButtonLeft.Glyph - изображение отображающееся на кнопке “Вправо” таймлайна.
5.5.2.2.3. Добавление новых свойств¶
Как правило добавление новых свойств осуществляется только в наши стили (GlobalWhiteBlue2015, GlobalWhiteYellow2015 и GlobalClassic). При этом необходимо обеспечивать корректный внешний вид и в других темах, в том числе в темах которые пользователь может создать и добавить самостоятельно. Чтобы обеспечивать корректный вид в “чужих” темах, при отсутствии нужных свойств используются альтернативные, присутствующие во всех темах по умолчанию, так же используются цвета “по умолчанию” которые просто хардкодятся.
Новые свойства могут быть добавлены непосредственно в тему интерфейса, в качестве глобальных цветов или свойств. Следует учитывать что в DevEpress цвет темы интерфейса и свойство типа TColor темы интерфейса - две разные сущности, даже если имеют одинаковые имена. При этом обращение из приложения к цвету и свойству типа TColor осуществляется разными методами. Цвета и свойства добавленные непосредственно в тему интерфейса являются глобальными для всего приложения, и при необходимости должны использоваться всеми стилизуемыми компонентами. Пример таких свойств - фон редактора и цвет выделения.
Так же свойства можно добавлять в группы и элементы темы интерфейса. У них нет разделения между свойством и цветом, в них могут находится только свойства, в том числе и свойства типа TColor. В группы добавляются свойства общие для элементов которые в ней содержаться, в элементы - свойства относящиеся только непосредственно к ним.
Если необходимо добавить в тему цвет используемый компонентом для которого нету соответствующего элемента, нужно создать этот элемент. Сейчас DevExpress не поддерживает возможность создания собственных групп элементов, поэтому все новые элементы добавляются в стандартную группу Common.
5.5.2.3. Предустановленные темы интерфейса в Global¶
Предустановленные темы можно выбрать в меню “Вид -> Тема интерфейса...”(Перед этим, необходимо переключить “Вид -> Стиль интерфейса->” в любой стиль кроме, “Стиль ОС”). Список предустановленных тем:
- GlobalClassic
- GlobalWhiteBlue2015
- GlobalWhiteYellow2015
5.6. Параметры командной строки¶
Параметры командной строки - параметры передаваемые клиенту Global.exe
при запуске. Параметры
регламентируют режим работы в котором клиент будет запущен или уточняет параметры запуска которые штатно при
запуске запрашиваются диалогами (диалог входа, выбора приложения).
- Пример:
Global.exe dbUser/Password1@DataBase#btk SEL_ConfiguratorMainMenu /nosplash /home=D:\Oracle11
5.6.1. Строка подключения¶
Задаёт значения необходимые для подключения к серверу. Если строка подключения не задана, то все те же значения будут запрошены у пользователя через диалог. Строка задаёт:
server
- БД (TNS) к которой следует подключиться.login
- логин.password
- пароль.schema
- схема подключения.
- Синтаксис:
- [login[/password]@][server[#schema]]
Hint
Передавая строку подключения в параметрах командной строки нельзя указать в качестве
строки подключения
один только сервер. Для этого следует писать:@server
или/@server
.Причина в том, что в качестве параметра командной строки
server
не будет распознан как строка подключения.Если заданы
login
,password
иserver
, то при старте Global подключение к базе будет устанавливаться без диалога. Диалог будет показан только в случае неудачной попытки подключения.Если схема подключения не указана, то по умолчанию используется схема
btk
- Примеры:
Global.exe dbUser/Password1@DataBase#btk
- сразу будет выполнен вход в базу данных DataBase, под пользователем dbUser с паролем Password1.Global.exe dbUser@DataBase
- При запуске клиента будет показан диалог входа, где требуется указать пароль.Global.exe @DataBase
,Global.exe /@DataBase
- будет показан диалог входа с заполненным полем “База данных”. Поле “Пользователь” будет заполнено сохранённым значением из реестра - логин последнего удачного входа.Global.exe dbUser@
- будет показан диалог входа с заполненным полем “Пользователь”. Поле “База данных” будет заполнено сохранённым значением из реестра - БД последнего удачного входа.
5.6.2. Приложение¶
Первый не системный параметр командной строки, и не строка подключения, трактуется как указание приложения которое следует загрузить. Если приложение задано, то список приложений при загрузке показываться не будет.
- Пример:
Global.exe SEL_ConfiguratorMainMenu
5.6.3. Командный файл¶
Тип файла *.gsc должен быть проассоциирован в ОС с приложением Global.exe
, тогда двойной клик будет
автоматически выполнять команду описанную в файле - запускать приложение Global с указанием этого файла.
Путь к существующему файлу с расширением *.gsc. Этот файл будет прочитан и выполнен. Выполняется по возможности в одном из уже запущенных клиентов Global
, если это возможно, или запускается новый клиент.
See also
5.6.4. Системные параметры¶
- Синтаксис:
(/|-)param[=value]
Note
Исключением является префикс
/@
. Он служит для указания строки подключения.
/SingleSession | все формы будут открываться в сессии приложения |
/nosplash | не показывать окно приветствия во время загрузки клиента |
/home=value | явно указывает с каким OracleHome работать, в случае если установлено несколько Oracle. |
/eo=value | Системное имя операции основной главной выборки, операция будет выполнена после загрузки проложения. |
/uri=value | Подробнее об URI ссылках |
/pv=value | =(Param1Name=Param1Value)[;Param2Name=Param2Value] Параметры операции, которые будут добавлены в главную выборку приложения. Параметр актуален, только если задан параметр /eo. Можно получить командой GetVar('ParamName');
|
/ver=value | =(ex|eg|any) управление проверкой версий модулей приложения на соответствие
|
/ld=value | =(std|tsd [/lcp=ProcName [/lcm=dll-name]] /lcip=StrParams) - задать используемый диалог авторизации клиентом (окно логина).
|
5.7. Автоматическое тестирование¶
5.7.1. Global как COM-Сервер¶
Клиентское приложение Global является COM-сервером, с которым возожно взаимодействовать из любого языка программирования, поддерживающего вызовы методов COM-объектов. Для регистрации приложения Global как COM-сервера необходимо через командную строку запустить приложение Global с ключом /regserver: Global.exe /regserver
Для взаимодействия с приложением Global средствами COM, необходимо запустить свой экземпляр приложения Global, подключиться к ранее запущенному экземпляру нельзя. Данное ограничение сделано в целях безопасности, что бы стороннее приложении не смогло получить долтупа к системе Global без ввода имени пользователя и пароля.
5.7.2. Основные понятия¶
Сервер/OLE-сервер - клиент Global.exe запущенный в режиме OLE-Сервера, созданный при помощи методов CreateObject/CreateOleObject(в зависимости от конкретного языка) - запускается самой ОС, где он и должен быть прописан - возвращает интерфейс-наследник от IDispatch. Большинство исполнителей способны возвращаемое значение принимать как тип данных Variant. Обращение к методам реализованным в интерфейсе сервера происходит просто через точку:
fooVariantVariable := CreateOleObject('btkRuntime.GlobalApplication'); fooVariantVariable.FooServerMethod(some_params);
Клиент - тот кто запустил OLE-сервер. Приложения Global так же способны быть клиентом, с той лишь разницей, что им нет необходимости выполнять CreateObject/CreateOleObject и обращаться к методам непосредственно: для этого в Scripter-е определён специальный объект “TestApp” у которого описаны все необходимые методы для взаимодействия с Сервером - укрупнённые относительно методов непосредственно OLE интерфейса.
Исключительная ситуация - это все “ошибки” выплывающие на поверхность приложения: как системные, так и пользовательские- от ошибки “деление на ноль” до сообщений в духе “Требуется значение атрибута “Код” для класса “Читатели”.
command_lines
5.7.2.1. Синхронизация выполнения методов¶
Большинство методов реализуемых интерфейсом OLE-Сервера работают асинхронно, т.е.: во время вызова просто ложится пометка о неоходимости выполнить то или иное действие в очередь выполнения, сама же полезная нагрузка будет выполнена позже. Это сделано для того что бы поведение сервера минимально сказывалось на работоспособности клиента, например: если при синхронном выполнении метод сервера будет остановлен по каким-либо причинам(включается ожидание некоторого события или открывается модальное окно, выплывает какой-либо диалог) - остановится и выполнение клиентского метода(скрипта) и повлиять на сложившуюся ситуацию будет никак невозможно в рамках однопоточного выполнения, кроме личного вмешательства пользователя - напрмер: нажать “ок” во всплывшем диалоговом окне. Однако, вместе с асинхронностью приходят другие трудности эксплуатации:
- Возникает необходимость в методах позволяющих дождаться управляемого объекта на стороне сервера, в методах синхронизации выполнения скрипта, например, дождаться непосредственного открытия выборки после команды её открытия: WaitSelection, и прочие методы вида TestApp.Wait*
- Исключительные ситуации возникающие на сервере при асинхронном выполнении метода не смогут автоматически попасть на клиент, в связи с чем невозможно их обработать и учесть в логике эксплуатирующей сервер программы (в скрипте Автоматического Тестировщика).
Ситуацию отчасти спасает возможность оставаясь в асинхронном режиме выполнения дождаться окончания выполнения метода: в подсистему Автоматического Тестирования внедрён объект ожидания Event, при запуске очередного метода он сбрасывается, а когда метод завершился (штатно или с ошибкой) - выставляется, что позволяет клиенту вслед за запуском асинхронного метода встать в ожидание его завершения и при этом не при каких условиях не оказаться заблокированным навсегда, т.к. ожидание выполняется по таймауту (если сервер не сигнализировал об окончании выполнения метода своевременно- ожидание будет прекращено). Объект ожидания создаётся по запросу клиента: параметр метода Run указывает на необходимость его создания/”Синхронизации выполнения методов”.
Примечания:
Если заведомо известно, что метод (например, Выполнение Операции) вызывает блокировку исполняющего потока - можно просто принудительно задать ему время ожидания “0”, что бы скрипт зря не тормозил.
Пример: операция открытия выборки в карточном представлении - карточка открывается как модальное окно и, соответственно, фактический метод завершит свою работу только после её закрытия.
5.7.2.2. Проброс исключительных ситуаций сервера¶
- когда на Сервере происходит какая-либо исключительная ситуация, то в случае, если включен режим синхронизации выполнения методов - текст этого исключения сохраняется в очередь возврата результатов выполнения, соответственно и уведомляющее окно на стороне Серверного приложения не всплывает. В интерфейсе же реализован метод их извлечения: PopExecResults(aCount: Integer): WideString. В очереди находятся все исключительные ситуации: как сгенерированные непосредственно в теле асинхронного метода, так и в любом другом потоке Сервера, упоминания об исключениях ложатся и извлекаются в хронологиеском порядке.
Примечания:
- Если ожидание какого-либо метода было прекращено по истечении заданного времени, но после того он вызвал ошибку - эта ошибка будет извлечена следующим методом поддерживающим проброс/”обработку ошибок сервера”.
- В некоторых ситуациях выполняемый метод может инициировать асинхронное выполнение другого кода (например, выполнение асинхронных SQL-Операций), тогда исключительная ситуация сгенерированная этим кодом не попадёт в результат выполнения данного метода, вместо того она будет извлечена другим методом, на чьё время исполнения придётся её(исключительной ситуации) возникновение.
5.7.2.3. Методы поддерживающие обработку ошибок/”исключительных ситуаций” Сервера¶
- методы Объекта TestApp(
InternalLibrary.TbtkScriptTesterObject
), в конце своего выполнения проверяют состояние очереди и если она не пуста - возвращают ошибку с соответствующим извлечённым текстом . Эти методы имеют три параметра позволяющих управлять возникновением/перенаправлением ошибки, параметры всегда идут последними и в указанном порядке. Параметры не перечислены в методов описании, т.к. одинаковы для всех методов этой группы.
- Timeout: Integer - Время отведённое на ожидание выполнения метода, по его истечении может быть сгенерирована исключительная ситуация. Если задать значение “-1”, то значение будет проигнорированно - подставлено значени по-умолчанию; значене “0” - метод не будет ничего ждать, и, соответственно, ругаться.
- DoRise: Boolean - генерировать исключительную ситуацию, если в очереди возврата результатов всё-таки было обнаружено упоминание об ошибке.
- RaiseOnTimeout: Boolean - генерировать исключительную ситацию, если метод завершил ожидание по истечении времени.
Если исключительная ситуация/ошибка будет выброшена(raise) из метода - она должна быть обработана в блоке try..except..end / try..finally..end , в противном случае выполнение кода/скрипта будет завершено с соответствующим сообщением, с текстом исключительной ситуации. Если метод сгенерировал исключительную ситуацию, но значение параметра DoRise или RaiseOnTimeout (или, если не указаны - их значение по-умолчанию) равно False - текст исключения будет направлен в операцию выборки скрипта чьё имя задаётся методом SetRaiseOperationName, однако, если имя операции не задано, то вне зависимости от значения соответствующих параметров исключения будут выброшены.
5.7.3. Прикладная разработка¶
5.7.3.1. Доступные команды¶
5.7.3.1.1. Инициализация и завершение работы¶
5.7.3.1.1.1. Инициализация¶
InternalLibrary.TbtkScriptTesterObject.Run
- Метод запускает экземпляр тестируемого приложения.
5.7.3.1.1.2. Завершение работы OLE-сервера¶
InternalLibrary.TbtkScriptTesterObject.Quit
- запрос на добровольное, “хорошее”, завершение.InternalLibrary.TbtkScriptTesterObject.Terminate
- принудительное закрытие процесса.
try
TestApp.Quit;
except
TestApp.Terminate;
end;
5.7.3.1.1.3. Runned¶
InternalLibrary.TbtkScriptTesterObject.Runned
- проверяет, активен ли в данный момент OLE-Сервер
5.7.3.1.1.4. Прочие¶
InternalLibrary.TbtkScriptTesterObject.RunAsCurrent
- запускает экземпляр тестируемого приложения, используя имя пользователя и пароль текущего пользователя. В качестве параметра может быть передано системное имя главной выборки приложения.InternalLibrary.TbtkScriptTesterObject.CmdLine
InternalLibrary.TbtkScriptTesterObject.EnableScriptRecording
- включает в рестируемом приложении режим записи тестового скрипта.InternalLibrary.TbtkScriptTesterObject.DisableScriptRecording
- выключает в тестируемом приложении режим записи тестового скрипта.InternalLibrary.TbtkScriptTesterObject.ScriptRecording
- свойство указывает, что тестируемое приложение работает в режиме записи тестового скрипта.
5.7.3.1.2. Настройка обработки ошибок Сервера¶
Любая ошибка/”Исключительная ситуация” Сервера попадает в скрипт
тестирования исключительно с исполнением метода этого Сервера, т.е.
метода объекта InternalLibrary.TbtkScriptTesterObject
, за исключением методов реализованных
локально. Сами эти методы можно разделить на две большие и принципиально
разные категории: синхронные и асинхронные. Любая ошибка проявившаяся в
синхронном методе просто всплывает на стороне исполнителя(скрипта) и
может быть отловлена и обработана штатными средствами- блоком try
except. Если же ошибка проявляется
в методе асинхронном, то ничего такого не происходит - её необходимо
специально пробрасывать с Сервера на Клиент, для чего на стороне Сервера
реализована очередь ошибок. В эту очередь складываются текстовые
сообщения исключений- как непосредственно выполняемого метода(если
говорить о TestApp)/команды(если говорить о TbtkAutoTestRobot), так и
приложения в целом. Интерфейс Сервера реализует метод умеющий забирать
порцию сообщений/проверять очередь - PopExecResults (ACount :
Integer): WideString; Методы TestApp общающиеся непосредственно с
интерфейсом Сервера вызывают PopExecResults сами внутри себя,
никаких дополнительных действий не требуется. Если была возвращена
несуптая строка - за время прошедшее с прошлого извлечения ошибок что-то
произошло - на клиенте необходимо об этом рапортовать, варианты:
- Вызвать операцию и передать ей текст исключения. Настраивается
свойством
InternalLibrary.TbtkScriptTesterObject.RaiseOperationName
. - Выбросить исключительную ситуацию непосредственно из самого метода,
что можно обработать тем же способом как и исключения синхронных
методов. В противном случае выполнение скрипта будет прервано с
соответствующим исключением. Поведение управляется
параметром DoRaise методов TestApp поддерживающих
обработку ошибок сервера. Параметр не обязательно задавать для
каждого отдельного вызова - он имеет значение по-умолчанию,
задаваемое свойством
InternalLibrary.TbtkScriptTesterObject.DefaultDoRaise
,- использовать следует только в тех случаях, когда необходимо изменить общую логику обработки ошибок для конкретного вызова.
Так же методы реализующие асинхронные команды могут генерировать исключение по истечению времени ожидания, за что отвечает, как и в случае c DoRaise, дефолтный параметр RaiseOnTime.
5.7.3.1.2.1. Соответствующие свойства объекта TestApp¶
- свойство
InternalLibrary.TbtkScriptTesterObject.RaiseOperationName
- задаёт системное имя Pascal-операции, обрабатывающей невыброшенные скриптовыми методам исключительные ситуации - свойство
InternalLibrary.TbtkScriptTesterObject.DefaultWaitExecTimeout
- задаёт значение подставляемое по-умочанию в дефолтный параметр Timeout ф-й поддерживающих обработку ошибок сервера - свойство
InternalLibrary.TbtkScriptTesterObject.DefaultDoRaise
- задаёт значение подставляемое по-умочанию в дефолтный параметр DoRaise ф-й поддерживающих обработку ошибок сервера - свойство
InternalLibrary.TbtkScriptTesterObject.DefualtRaiseOnTimeout
- задаёт значение подставляемое по-умочанию в дефолтный параметр RaiseOnTimeout ф-й поддерживающих обработку ошибок сервера
5.7.3.1.3. Методы управления тестируемым приложением.¶
5.7.3.1.3.1. Методы поддерживающие обработку ошибок Сервера¶
InternalLibrary.TbtkScriptTesterObject.ExecuteOperation
- выполняет операцию, принадлежащую выборке с указанным именем и отображением.InternalLibrary.TbtkScriptTesterObject.ExecuteOperationEx
- выполняет операцию, принадлежащую выборке с указанным именем и отображением. В метод возможно передать параметры, управляющие режимом выполнения операции.InternalLibrary.TbtkScriptTesterObject.SelectionLocate
- выполняет позиционирование на запись в указанной выборке по ключевому полю.Пример¶TestApp.SelectionLocate('FooSelection', 'ROLIST', 'FooID_Attr', 'ID_Value');
TestApp.SelectionLocate('FooSelection', 'ROLIST', ['FooID_Attr1', 'FooID_Attr2'], ['ID1_Value', 'ID1_Value']);
InternalLibrary.TbtkScriptTesterObject.IsSelectionActive
- проверяет существование и активность выборки с указанным именем и отображением на текущей форме тестируемого приложенияInternalLibrary.TbtkScriptTesterObject.WaitSelection
- ожидает создания и открытия выборки с указанным именем. Если выборка не будет создана и открыта в течении указанного интервала времени, будет сгенерирована ошибка.InternalLibrary.TbtkScriptTesterObject.SelectionSetVar
- устанавливает значение параметру в указанной выборкеInternalLibrary.TbtkScriptTesterObject.SelectionGetVar
- возвращает значение атрибута (параметра) указанной выборкиInternalLibrary.TbtkScriptTesterObject.CloseActiveModalForm
- закрывает текущую активную модальную форму тестового приложения установкой форме соответствующего значения ModalResult.InternalLibrary.TbtkScriptTesterObject.CloseActiveForm
- закрывает текущую активную форму тестового приложенияInternalLibrary.TbtkScriptTesterObject.WaitDialog
- ожидает отображения диалога в тестируемом приложенииInternalLibrary.TbtkScriptTesterObject.CloseActiveModalWindow
устаревший - Закрывает модальное окноInternalLibrary.TbtkScriptTesterObject.CloseActiveWindow
- закрвыает окноInternalLibrary.TbtkScriptTesterObject.FocusOnFieldByName
- перемещает фокус ввода на контрол, являющийся редактором для указанного атрибута выборки
5.7.3.1.3.2. Локальные методы TestApp¶
Методы не использующие Сервер как таковой. Манипулируют непосредственно состоянием ОС.
InternalLibrary.TbtkScriptTesterObject.WaitWindow
- ожидает отображения в тестируемом приложении окна указанного класса и с указанным текстом в загноловкеInternalLibrary.TbtkScriptTesterObject.WaitDialogA
- ожидает отображения диалога в тестируемом приложенииInternalLibrary.TbtkScriptTesterObject.InputText
- эмулирует клавиатурный ввод текста в текущий контролInternalLibrary.TbtkScriptTesterObject.KeyPress
- эмулирует нажатие клавиши с указанным кодомInternalLibrary.TbtkScriptTesterObject.KeyPressA
- эмулирует нажатие комбинации клавиш
5.7.3.1.3.3. Методы и свойства записи скрипта¶
Свойство InternalLibrary.TbtkScriptTesterObject.RecordingOperationName
- Имя операции куда будут отправляться новые сгенерированные строки скрипта и результаты выполнения операций отправленных методом InternalLibrary.TbtkScriptTesterObject.AddRecorderManualOperation
Метод InternalLibrary.TbtkScriptTesterObject.AddRecorderManualOperation
TestApp.AddManCtrlOperation('ScriptIfVarNotEqual', 'Проверка значения', 144,
'<PASCAL>'#13+
' ShowMessage(''Будет отправлен текст скрипта.'')'#13+
' Result := '''';'#13+
' Selection.First;'#13+
' while not Selection.Eof do'#13+
' begin'#13+
' if GetVar(''Checked'') then'#13+
' begin'#13+
' Result := Result + '' if TestApp.SelectionGetVar('' +'#13+
' QuotedStr(Selection.Master.EntityName) + '', ''+'#13+
' QuotedStr(Selection.Master.Representation) + '', ''+'#13+
' QuotedStr(GetVar(''Name'')) + '') <> ''+'#13+
' QuotedStr(GetVar(''Value'')) + '' then ''#10+'#13+
' '' Raise(''''Значение атрибута '' +GetVar(''Name'')+ '' не соответствует'''');''#10;'#13+
' end;'#13+
' Selection.Next;'#13+
' end;'#13+
'</PASCAL>');
5.7.3.2. Запись макроса/скрипта¶
5.7.3.2.1. Автоматическая¶
5.7.3.2.2. Ручное управление¶

Некоторые операции невозможно записать автоматически, т.к. они выполняются умозрительно, без совершения каких-либо действий в программе. Для их записи применяется панель ручного управления - даёт возможность формализовать действия пользователя направленные на проверку корректности данных.
Основная задача панели - дать пользователю выбрать интересующие атрибуты текущей активной выборки, в том числе и те, что не доступны для непосредственного пользовательского влияния, (отмечаются галочками) и дать возможность задать конкретное значение для указанных атрибутов. И применить к этим данным один из имеющихся паттернов формирования кода скрипта, в результате чего на Клиент отправится таким же образом как и при штатной автоматической записи некоторое количество строк.
Так же, кроме ручного проставления, имеется возможность просто
“прокликать” интересующие поля в отображении - галочки выставляются в
панели автоматически. Что бы в Клиент не уходили не нужные строки, такие
как InternalLibrary.TbtkScriptTesterObject.SelectionLocate
и InternalLibrary.TbtkScriptTesterObject.FocusOnFieldByName
, которые бы возникали
как побочный эффект “прокликивания”,- включается “режим сбора данных” -
первая кнопка на тулбаре, она существует всегда и не зависит от
добавления операций из клиента тестирования.
В приложении “Автоматический Тестировщик” на базе BTKDEV реализованы пользовательские операции записи скриптов:
проверка группы значений на соответствие ожидаемым
if TestApp.SelectionGetVar('SEL_LB4_PERSON', 'ROLIST', 'SBIRTHDATE') <> '11.07.1985' then Raise('Значение не соответствует!'); if TestApp.SelectionGetVar('SEL_LB4_PERSON', 'ROLIST', 'IDCLASS') <> '' then Raise('Значение не соответствует!');
позиционирование курсора по значениям произвольного набора атрибутов выборки
TestApp.SelectionLocate('SEL_LB4_PERSON', 'ROLIST', ['SSECONDNAME', 'SFIRSTNME', 'SMIDDLENAME'], ['Трактор', 'Филипов', 'иванович']);
5.8. Активация базы¶
Для активации базы требуется ключ.
Note
Ключ представляет собой строку, в которой записано число в шестнадцатеричной системе счисления. Ключ должен быть сохранён в текстовый файл в кодировке ASCII-US. В файле должна содержаться только строка с ключом.
5.8.1. Процесс активации файлом¶
Этапы активации базы при наличии файла с ключом:
Подключиться к неактивированной базе клиентом Global, при этом отобразится окно “Регистрации”.
Выбрать пункт “Зарегистрировать из файла” и указать файл.
Подтвердить выбор, нажав кнопку “OK”, запустится процесс активации.