5. Сервисы

5.1. Горячие клавиши

5.1.1. Концепция

Горячие клавиши позволяют быстро вызывать наиболее часто используемые операции или действия.

В системе есть несколько типо глобальных клавиш:

  • Глобальные. Глобальные храняться в реестре в ветке COMMON^HOTKEYS. Данные клавиши уникальны в рамках базы. Используются они как правило в захаркоденных пункатх меню или других действиях которые могут вызываться в Global FrameWork. Пользователи повлиять на эти события/действия как правило не в силах, но предоставляется возможность изменить горячию клавишу с помощью которой можно быстро вызвать действие. Для редактирования этих горячих клавиш реализован интерфейс Главное меню -> Настройки -> Горячие клавиши
  • Горячие клавиши выборки. Реализуются через возможность добавить горячию клавишу на паскаль операцию.
  • Жеско прописаные к Global FrameWork.

Приоретет срабатывания обработчиков паскаль операций

  1. Горячие клавиши активного контрола выборки
  2. Горячие клавиши выборки, в т.ч. операций выборки
  3. Жеско прописаные к Global FrameWork.
  4. Глобальные

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 протокола, необходимо выполнить следующие действия:

  1. Установить Jabber - сервер
  2. Установить XMPP - клиент на сервер Oracle
  3. Добавить новые сущности на базу.
  4. Что делать если сервис оповещений не работает

После выполнения всех шагов можно будет переключить режим работы службы оповещения с использованием Oracle Alerts на использование XMPP сервера. Для этого надо открыть настроки службы оповещения Конфигуратор > Главное Меню > Настройки > Настройки службы оповещений (рис. 1) и выбрать в выпадающем списке “Режим работы службы сообщений” значение “XMPP”.

../../_images/MessegeServiceOptionFrame.png

рис.1. Настройки службы оповещений

Для правильной работы службы оповещений необходимо указатель актульную информацию об установленном сервере. По умолчанию, порт для не шифрованных соединений равен 5222, а имя сервера совпадает с IP адресом хоста на котором установлен jabber - сервер.

5.2.1.1.1. Работа с XMPP сервером на клиенте

Соединение с jabber - сервером устанавливается при загрузке приложения. Если пользователя с таким именем и паролем на jabber - сервере не существует, то происходит автоматическое добавление нового пользователя. При разрыве соединения, по причине потери TCP\IP соединения с хостом сервера или обрыве сессии со стороны jabber - сервера, будет производиться повторные циклические попытки подключения к jabber - серверу каждые 25 секунд.

Для отправки и получения сообщений как и в случае использования Oracle Alerts служит фрейм открывающийся по команде Конфигуратор > Главное Меню > Сервисы > Служба оповещения (рис.2).

../../_images/MessengerServiceFrame.png

рис.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).

../../_images/InstallXMPPServer_step1.png

Рис.1. Начала устаноки OpenFire

Нажимаем кнопку Next (рис.2).

../../_images/InstallXMPPServer_step2.png

Рис.2. Установка OpenFire. Лицензионное соглашение

Нажимаем кнопку Next (рис.3).

../../_images/InstallXMPPServer_step3.png

Рис.3.Установка OpenFire. Выбор каталога установки

Оставляем каталог по умолчанию и нажмем Next (рис.4).

../../_images/InstallXMPPServer_step4.png

Рис.4.Установка OpenFire.Опции создания ярлыков

Нажимаем кнопку Next (рис.5).

../../_images/InstallXMPPServer_step5.png

Рис.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).

../../_images/InstallXMPPServer_step6.png

Рис.6. Запуск OpenFire

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

../../_images/InstallXMPPServer_step7.jpg

Рис.7. Выбор языка интерфейса консоли администрирования

Выберем язык English и нажмем кнопку Continue (рис. 8).

../../_images/InstallXMPPServer_step8.jpg

Рис.8. Настройки сервера

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

../../_images/InstallXMPPServer_step9.jpg

Рис.9. Выбор вида используемой СУБД

Оставляем Standard Database Connection и нажимаем Continue (рис. 10).

../../_images/InstallXMPPServer_step10.jpg

Рис.10. Настройка подключения к БД

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

../../_images/InstallXMPPServer_step11.jpg

Рис.11. Настройка групп пользователей

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

../../_images/InstallXMPPServer_step12.png

Рис.12. Задание пароля администратора

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

../../_images/InstallXMPPServer_step13.png

Рис.13. Вход в консоль администрирования

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

../../_images/InstallXMPPServer_step14.jpg

Рис.14. Консоль администрирования

Если все сделано правильно, то откроется консоль администрирования. Процесс установки OpenFire завершен.

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

../../_images/InstallXMPPServer_step15.jpg

Рис.15. Добавление нового пользователя 1

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

../../_images/InstallXMPPServer_step16.jpg

Рис.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. Что делать если сервис оповещений не работает

Что делать если сервис оповещений не работает

  1. Убедится, что OpenFire сервер работает и есть соединение с базой данных - зайти в веб-администратор сервера;
  2. Убедится, что работает отправка сообщений с клиента. Для этого открыть фрейм оповещений (главное меню Сервис-> Оповещения), проверить состояние в поле подключение, должно быть “Подключен к серверу”. Если состояние другое, смотреть пункт
  3. Проверить отправку сообщений с сервера. Для проверки можно послать сообщение с сервера на клиент используя следующий код(все инструкции выполняются pl/sql developer):
declare
begin
  dbms_alert.signal('LoginName','Test message text', 1, 1);
end;

После выполнения кода, клиентское приложение подключенное под пользователем LoginName должно получить сообщение ‘Test message text’. Если сообщение не получено, то необходимо выполнить следующие проверки:

  1. Убедится, что пакеты btk_XMPP и dbms_alert скомпилировны. А в Java Sources скомпилирован пакет XMPPMessageSender. Если пакетов нет, или не удается скомпилировать следует обратиться к статье Установка клиента XMPP в Oracle;

  2. В списке сессий должно быть 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 Соединение оборвано

Прокомментируем приведенный лог:

  1. В начала программа делает выбор всех записей которые нужно отправить из таблицы XMPPMSGs при получении сигнала, что добавлено новое сообщение;
  2. Начинается цикл выбора всех сообщений, выбирается первое сообщение из таблицы(Получатель сообщения:LoginName Текст сообщения: Test message text);
  3. Проверяется соединение с сервером XMPP, соединение отсутствует: получаем настройки подключения к серверу XMPP и выполняют попытки подключения(Имя сервера и порт: b53:5222) ;
  4. Соединение с сервером установлено под пользователем btk;
  5. Создается объект сообщения;
  6. Выполняется посылка сообщений - сообщение послано успешно;
  7. Удаляется сообщение из таблицы сообщений XMPPMSGs;
  8. Прерываем процесс отправки. В лог могут выводится ошибки подключения, отправки сообщений, информация о том каких привилегий недостаточно для пользователя 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)
    1. Показывается форма системы оповещения
    2. В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
  • Нормальная(0)
    1. Показывается форма системы оповещения
    2. В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
  • Высокая(1)
    1. Показывается форма системы оповещения
    2. В зависимости от свойства “Отображать всплывающее окно” показывается сообщение в сплывающем окне внизу справа
  • Критичная(2)
    1. Показывается сообщение в сплывающем окне внизу справа
    2. Показывается модальное окно с текстом сообщения
    3. Форма приложения переноситься на передний план

Свойство “Отображать всплывающее окно” можно установить в через меню Сервис ->Оповещения->Параметры. Откроется карточка где можно в для свойства установить значение в редакторе 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-окон, и горячих клавиш.

В контестное меню добавлены следующие пункты:

  1. Копировать ссылку (Shift+Alt+1). Помещает в буфер обмена ссылку на активное окно.
  2. Копировать файл-ссылку (Shift+Alt+2). Создаёт во временной папке файл-ссылку и копирует файл в буфер обмена. Файл можно вставить (CTRL + V) в любую папку(например, рабочий стол) и двойным кликом перейти по ссылки. Файл можно передать по скайп или другими средства обмена сообщениями.
  3. Копировать полное имя файла-ссылки (Shift+Alt+3). Создаёт во временной папке файл-ссылку, и копирует полный путь файла в буфер обмена.
  4. Открыть ссылку из буфера обмена (Shift+Alt+4). Открывает ссылку из буфера обмена. Этот пункт меню доступен только если в буфере обмена содержится корректная URI-ссылка на выборку.
  5. Настройки копирования ссылки. Настройки определяют составные части, которые будут включены в созданную 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, если это возможно, или запускается новый клиент.

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) управление проверкой версий модулей приложения на соответствие

  • ex - exact - только точное совпадение версий. Когда приложение в случае не заданного параметра запускается не показывая никаких сообщений о версии. Если версия модуля не включена в список поддерживаемых - автоматически, не задавая вопросов, считается, что клиент и приложение не совместимы.
  • eg - ExactOrGreate - Не будет задаваться вопрос в случае когда версия превышает поддерживаемые.
  • any - не выполнять проверку совместимости версий.
/ld=value

=(std|tsd [/lcp=ProcName [/lcm=dll-name]] /lcip=StrParams) - задать используемый диалог авторизации клиентом (окно логина).

  • std - стандартный вариант диалогового окна, используется по умолчанию без указания параметра
  • tsd - диалог для Терминалов Сбора Данных
    • осуществляет ввод логина через Штрих-код.
    • если в параметрах командной строки была передана строка соединения клиента, то диалог не даст сменить сервер. Что бы просто заблокировать возможность изменения сервера - необходимо передать неполную строку соединения: “server#schem”.
    • ProcName - наименование метода преобразования “Штрих-кода” в “Стандартный логин системы”. Если параметр не задан - по умолчанию применяется метод поиска логина в БД Oracle (“OraLoginConverter”)
    • dll-name - библиотека в которой расположен ProcName, по умолчанию, если параметр не задан - метод ищется в самом клиенте Global.
    • StrParams - строка инициализации/настройки метода преобразования ШК-логин; для OraLoginConverter она имеет вид: “/lcip=stdConnectionString;oraMethod”
      1. stdConnectionString - стандартная строка подключения вида user/password@server#schem
      2. oraMethod - серверный метод который будет вызываться для преобразования: 1 входной параметр типа varchar и возвращаемый результат типа varchar. Имеет значение по умолчанию “ac_userapi.FindByBarcode”, в этом случае строка параметров будет иметь вид /lcip=user/password@server#schem.

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..endtry..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-сервера
Хорошим тоном обязательного завершения будет:
  try
    TestApp.Quit;
  except
    TestApp.Terminate;
  end;
5.7.3.1.1.3. Runned

InternalLibrary.TbtkScriptTesterObject.Runned - проверяет, активен ли в данный момент OLE-Сервер

5.7.3.1.1.4. Прочие
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
5.7.3.1.3. Методы управления тестируемым приложением.
5.7.3.1.3.1. Методы поддерживающие обработку ошибок Сервера
5.7.3.1.3.2. Локальные методы TestApp

Методы не использующие Сервер как таковой. Манипулируют непосредственно состоянием ОС.

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. Ручное управление
../../_images/ATRecirdingManualControl.png

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

Основная задача панели - дать пользователю выбрать интересующие атрибуты текущей активной выборки, в том числе и те, что не доступны для непосредственного пользовательского влияния, (отмечаются галочками) и дать возможность задать конкретное значение для указанных атрибутов. И применить к этим данным один из имеющихся паттернов формирования кода скрипта, в результате чего на Клиент отправится таким же образом как и при штатной автоматической записи некоторое количество строк.

Так же, кроме ручного проставления, имеется возможность просто “прокликать” интересующие поля в отображении - галочки выставляются в панели автоматически. Что бы в Клиент не уходили не нужные строки, такие как 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.7.4. Системная разработка

5.7.4.1. UML классов подсистемы

5.7.4.1.1. Схема классов воспроизведения скрипта Автоматического Тестирования
../../_images/BtkAutoTester_ClassDiagramm.gif

Диаграмма классов Автоматического Тестировщика.svd

5.7.4.1.2. Схема классов записи скрипта автомачического тестирования
../../_images/AutoTestRecorderUML.png

Диаграмма классов системы записи скрипта

5.7.4.2. Типы методов

../../_images/TestAppMethodsClassification.gif

Основание классификации методов.vsd

5.7.4.2.1. Методы интерфейса
5.7.4.2.1.1. Команды робота(TbtkAutoTestRobot)
../../_images/RobotsCommandExecute.gif

Выполнение Команды роботом.vsd

5.8. Активация базы

Для активации базы требуется ключ.

Note

Ключ представляет собой строку, в которой записано число в шестнадцатеричной системе счисления. Ключ должен быть сохранён в текстовый файл в кодировке ASCII-US. В файле должна содержаться только строка с ключом.

5.8.1. Процесс активации файлом

Этапы активации базы при наличии файла с ключом:

  1. Подключиться к неактивированной базе клиентом Global, при этом отобразится окно “Регистрации”.

  2. Выбрать пункт “Зарегистрировать из файла” и указать файл.

  3. Подтвердить выбор, нажав кнопку “OK”, запустится процесс активации.

    ../../_images/BaseActivation.png