1. Общие сведения
Данный модуль лицензируется по количеству запущенных экземпляров программы.
1.1. Назначение
Программа предназначена для визуализации информации из базы данных (например, поэтажного плана, списка находящихся клиентов и др.) и должна быть отображена на отдельном дисплее в удобном для посетителей месте, например в холе заведения. Устанавливается на рабочий компьютер администратора, при наличии второго монитора или на отдельный компьютер. В случае размещения в зале, за телевизором устанавливаем компьютер типа NetTop.

Внешний вид модуля
1.2. Целевая аудитория программного продукта
- Посетители - могут наблюдать информацию в режиме реального времени: поэтажный план, данные о доступных системах, свободных местах и прочую информацию из базы данных Абонемент.
- Операторы (пользователи системы) – в зависимости от настроек, имеют возможность отслеживать служебную информацию для осуществления рабочего процесса, например, такую как время начала и окончания мероприятия, размещение клиентов и др.
2. Настройка программы
Для настройки программы используется файл monitor.ini - в данном файле, в разделе [Settings], указывается путь до файла с настройками MonitorSettings.xml и путь до базы данных
MonitorSettings=D:\Monitor\MonitorSettings.xml dbname=127.0.0.1/3080:D:\MyDB\IBData\fitness.FDB ;Программа защищена ключом, поэтому необходимо прописать путь к серверу блокировок: [LOCK.SERVER] TCPPort=1111 TCPHost=127.0.0.1
Далее, существует 2 варианта настройки выводимых данных и интерфейса:
2.1. С помощью встроенного редактора в abonementmanager
Для упрощенного вывода отображения поэтажного плана используется настройка в редакторе abonementmanager.
Преимуществo данного способа – простота редактирования выводимой формы
Недостаток данного способа – негибкость настроек отображаемых данных, ограниченный набор способов вывода данных.
В случае, если abonementmanager.ini и monitor.ini настроены на одну базу, Этажный план, создаваемый с помощью abonementmanager, будет дублироваться в форме Monitor.
Для внесения изменений в форму Монитора, можно зайти в раздел Абонемента, щелкнув по иконке (см. рис.1).

Рис.1. Настройка поэтажного плана в abonementmanager
Далее, сохраняем внесённые изменения и наблюдаем изменения в форме Монитора.
2.2. С помощью настройки файлов преобразований и запросов
В результате настройки, выводимая информация представляет собой специфический динамически изменяемый отчет, отражающий, например, текущее состояние работы заведения.
Преимущества данного способа – возможность вывода любых данных из БД в удобной форме, в зависимости от настроек.
Недостаток данного способа – сложность настроек файлов, необходимость знать наименования полей БД.
2.2.1. Структура программы Monitor
В состав программного продукта входят следующие основные модули (типы файлов):
- Файлы настроек: *. ini
- Файлы библиотек: *.dll
- Файлы запуска программ .exe (Для запуска Монитора - Monitor.exe)
- Файлы .xml — файлы в текстовом формате, предназначенные для хранения структурированных данных и для обмена информацией между программами.
MonitorSettings.xml
В данном файле определяются параметры выводимой формы, такие как: высота, ширина, заголовок, позиционирование на экране.
Кроме этого, из SQL-запроса, указанного здесь, возвращается набор данных, которые могут быть выведены на форму.
Атрибуты формы (Form)
|
left |
Отступ слева (в пикселях) |
|
top |
Отступ |
|
Width |
Ширина формы (окна) |
|
Height |
Высота формы (окна) |
|
Caption |
Выводимое наименование окна (заголовок) |
|
BorderStyle |
задает толщину рамки вокруг элемента в пикселях |
С частотой, указанной в теге <Periodicity>2</Periodicity> (в данном случае – 2 секунды), данные, полученные из запроса, будут обновляться на выводимой форме Monitora.
2.2.2. Алгоритм работы программы
Результат выполнения запроса, указанного в MonitorSettings.xml формируется в виде xml-данных, на которые накладывается шаблон преобразования (*.xls) (см. рис.2).
Путь к данному шаблону и его имя указываются в файле MonitorSettings.xml, в разделе
<XSLT>floorplan.xsl</XSLT> (в данном случае, файл floorplan.xsl располагается в том же каталоге, что и Monitor.exe, MonitorSettings.xml).
В шаблоне преобразования (floorplan.xsl) описаны правила преобразования xml документа в другой внешний вид, в данном случае в HTML страницу. Путь и наименование новой html-страницы указываются в MonitorSettings.xml в разделе
<HTML>cache\floorplan.html</HTML> (в данном случае, будет создана страница floorplan.html в папке cache).

Рис.2. Схема работы программы Монитор
2.2.3. Шаблон преобразования документа
Шаблон преобразования написан на XSL (язык преобразований XML-документов). С помощью него XML-документ трансформируется в HTML вид.
Структура документа
<header> </header>
здесь указываются метаданные, например, кодировка.
<body></body>
«тело документа». В атрибутах тега <body> можно указать, например, style="background-image:url(floorplan.gif);"
При этом, картинка floorplan.gif должна находиться в папке Monitor\cache\
Атрибуты тега <body> влияют на внешний вид всего документа целиком:
|
Атрибут |
Описание |
Пример |
|
bgcolor |
Цвет фона |
<body bgcolor="#C9CDED"> |
|
background |
Фоновая картинка |
<body background="images/tile.jpg"> |
|
text |
Цвет текста |
<body text="#000067"> |
|
link |
Цвет ссылок |
<body link="#457BAF"> |
|
vlink |
Цвет посещённых ссылок |
<body vlink="#9C7B92"> |
|
alink |
Цвет активных ссылок |
<body alink="#434343"> |
Таким образом, результаты запроса можно представить в виде html-документа
Каждая строчка в выводимом наборе данных представлена в теге <RecordSet>, каждое поле в теге <Record>.
Схематично это можно проиллюстрировать примером:
Запрос «select ID, Name from Rooms».
В результате выполнения запроса будут получены следующие данные:
|
ID |
Name |
|
1 |
Бассейн |
|
2 |
Зал |
<RecordSet>
<Record> ID=”1” Name= “Бассейн” </Record>
<Record> ID=”2” Name= “Зал” </Record>
</RecordSet>
Данные выводятся в табличном виде. Схема простой таблицы (с 1 строкой и 2 колонками) представлена ниже:
<table> <tr> <td>Ячейка 1</td> <td>Ячейка 2</td> </tr> </table>
В ячейках можно выводить данные, полученные в результате выполнения запроса из MonitorSettings.xml.
Например, выводим номер <xsl:value-of select="NUMBER"/>
Примечание! Наименование полей указывается прописными буквами
2.2.4. Примеры
Пример 1
Создадим одну форму, которая будет выводиться поверх всех окон, в этой форме в табличном режиме будут выводиться данные с номером и наименованием комнат.
1) Настраиваем MonitorSettings.xml
|
<Form left="500" top="5" Width="200" Height="400" |
Размеры и расположение формы на мониторе |
|
Caption="Данные по комнатам" |
Заголовок окна |
|
ID="2" |
Номер формы (ее идентификатор) |
|
BorderStyle="2" WindowState="0"> |
Стиль окна: ширина рамки 2 пикселя |
|
<ZOrder>-1</ZOrder> |
Z-последовательность (Z order) окна обозначает позицию окна в стеке перекрывающихся окон. Окно наверху Z-последовательности перекрывает все другие окна. Окно внизу Z-последовательности перекрыто всеми другими окнами. |
|
<ShowPanel>0</ShowPanel> |
Не отображать панель настроек браузера |
|
<Periodicity>2</Periodicity> |
Период обновления – 2 секунды |
|
<SQLText> select r.number number, r.name from rooms r </SQLText> |
SQL запрос. Выводятся следующие поля таблицы rooms базы данных: number (номер) комнаты и name (имя) комнаты |
|
<XSLT>rooms.xsl</XSLT> |
Применяемый файл преобразования, в данном случае: rooms.xsl |
|
<HTML>cache\rooms.html</HTML> |
В результате преобразования в папке /cache будет сформирована html-страница rooms.html |
|
<HIDECURSOR>0</HIDECURSOR> |
Не показывать курсор мыши в пределах окна формы |
|
<FormID>2</FormID> </Form> |
Команда на создание формы |
2) Создадим файл преобразования rooms.xsl
Приведем часть кода
<body> <table border="1" > <tr> <th >Номер комнаты </th> ;Заголовки колонок таблицы <th >Наименование комнаты </th> ;Заголовки колонок таблицы </tr> <xsl:for-each select="RecordSet/Record"> <tr> <td> <xsl:value-of select="NUMBER"/> ;Выводимые значения полей БД </td> <td> <xsl:value-of select="NAME"/> ;Выводимые значения полей БД </td> </tr> </xsl:for-each> </table> </body>
То есть данные должны быть выведены в подобном виде:
|
Номер комнаты |
Наименование комнаты |
<--- Заголовок колонок таблицы |
|
Значение 1 |
Наименование 1 |
<--- Выводимые значения полей БД |
|
… |
.. |
|
|
… |
… |
|
|
… |
.. |
В результате выполнения преобразования будет создана rooms.html страница в папке cache. И при запуске исполняемого файла Monitor.exe поверх всего будет выведена форма с таблицей.
Пример 2
Настройка цветов в зависимости от статуса мероприятия
Варианты статусов
|
ID статуса |
Статус |
|
0 |
Не началось мероприятие |
|
1 |
Началось мероприятие |
|
2 |
Мероприятие закончилось |
3. Режим работы с программой
Управление выводимой формой осуществляется с помощью следующего стандартного окна настроек (см.рис.3).

Рис.3 - Стандартное окно настроек Монитора
Окно выводимой формы с этажным планом можно настраивать в соответствии с потребностями, и оно всегда выводится поверх остальных окон (см. рис.4).

Рис.4,5 - Варианты окна Монитора
Данное окно не подлежит закрытию стандартными средствами - для закрытия программы используется Окно настроек (с рис.3).
Файл MonitorSettings.xml:
<Monitor>
<Forms>
<Form left="5" top="5" Width="510" Height="380" Caption="Этажный план" ID="1" BorderStyle="2" WindowState="0">
<ZOrder>-1</ZOrder>
<ShowPanel>0</ShowPanel>
<Periodicity>2</Periodicity>
<SQLText>
select r.id id, r.number number, r.name, r.state, r.floor,r.building, 0 guest_quant ,
rk.id roomkind, rk.code roomkindcode,rk.name roomkindname,
COLORTOHTMLHEXCOLOR(rk.color) roomkindcolor,
d.id claim, d.status claimstate, formatdatetimeex('hh:mm:ss',d.startdate,'') arrival,
case when d.status=1 and d.finishdate=90000
then formatdatetimeex('hh:mm:ss',(d.startdate + p.diaryduration)-(d2dbl('now')),'')
else formatdatetimeex('hh:mm:ss',d.finishdate-(d2dbl('now')),'')
end fmt_end_time,
case when d.status=1 and d.finishdate=90000
then ROUND(((d.startdate + p.diaryduration)-(d2dbl('now')))*1440)
else ROUND(((d.finishdate)-(d2dbl('now')))*1440)
end fmt_end_time_min,
case when
case when d.status=1 and d.finishdate=90000
then ROUND(((d.startdate + p.diaryduration)-(d2dbl('now')))*1440)
else ROUND(((d.finishdate)-(d2dbl('now')))*1440)
end >5 then 'black'
else 'red'
end fmt_end_time_min_color,
d.guest,fp.aleft , fp.atop,fp.awidth,fp.aheight, r.building, r.floor,
case when d.status=1 then 'red' else 'green' end statecolor ,
g.fullname as GUESTNAME,
case when getnamedparamdefnum(dd.paramstr,'color',0)=000000
then 'ffffff'
else COLORTOHTMLHEXCOLOR(getnamedparamdefnum(dd.paramstr,'color',0)) end as room_abonement_categ_color
from resource_categ rc
left join room_kinds rk on rc.id=rk.resource_categ and rk.enabled=1
left join rooms r on r.roomkind=rk.id and r.enabled=1
/*and r.building=3*/
left join floorplan fp on fp.idroom = r.id
left join diary d on d.idroom=r.id and d.enabled=1
and ( d.status=1 or (d.startdate < d2dbl('now')
and d.finishdate > d2dbl('now')))
left join guests g on d.guest = g.id
left join abonement_packages ap on d.abonement_package = ap.id
left join abonements a on a.id = ap.abonement
left join package_kinds pk on a.package_kind=pk.id
left join d_document dd on dd.id=pk.abonementcateg
left join packages p on ap.package = p.id
where
rc.kind in (0)
and r.enabled=1
order by r.number ,fmt_end_time_min
</SQLText>
<XSLT>floorplan.xsl</XSLT>
<HTML>cache\floorplan.html</HTML>
<HIDECURSOR>0</HIDECURSOR>
<FormID>2</FormID>
</Form>
</Forms>
</Monitor>Файл floorplan.xsl
<?xml version="1.0" encoding="WINDOWS-1251" ?>
<!--Набор переменных используеться для XSLT -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://user.com/namespace" version="2.0"
>
<xsl:key name="group" match="/RecordSet/Record" use="ID" />
<!--Ключ "group", уникальное поле "ID" -->
<xsl:template match="/">
<header>
<META http-equiv="Content-Type" CONTENT="text/html; charset=WINDOWS-1251" />
</header>
<!--Фон страницы -->
<body style="background-image: url(floorplan2.GIF);background-repeat: no-repeat;">
<!-- Первый цикл по уникальному поле "ID" -->
<xsl:for-each select="/RecordSet/Record[ generate-id() = generate-id( key( 'group', ID ))]">
<!--позицианирование div блока согластно данным в БД-->
<div ID="{ID}" STYLE="position:absolute; top: {ATOP}px; left: {ALEFT}px; width: {AWIDTH}px; height: {AHEIGHT}px; overflow:hidden;">
<!--Построение "шапки" таблицы таблицы border толщина линий, width ширина height высота, cellpadding расстояние между ячейками по высоте, cellspacing расстояние между ячейками по ширине -->
<table border="1" width="100%" height="100%" cellpadding='0' cellspacing='0' >
<tr height="20px" > <!--Высота первой строки-->
<td align="center" colspan="2" style='background-color: #FFCC66;'>
<!--Фон первой строки-->
<xsl:value-of select="NUMBER"/> <!--Значение первой строки-->
</td>
</tr>
<xsl:for-each select="key( 'group', current()/ID )">
<!-- Второй цикл тут обходим только Record для ID из прошлого цикла, т.е. строим строки таблицы -->
<tr > <td align="center" width="60px"><!--Ширина первого столбца таблицы-->
<xsl:attribute name="BGCOLOR">
<!--Фон столбца таблицы, в зависимости от категории-->
<xsl:value-of select="ROOM_ABONEMENT_CATEG_COLOR"/>
</xsl:attribute>
<font color="{FMT_END_TIME_MIN_COLOR}">
<!--Фон столбца таблицы, в зависимости от категории-->
<xsl:value-of select="FMT_END_TIME_MIN"/> мин
</font>
</td >
<td align="center">
<xsl:attribute name="BGCOLOR">
<xsl:value-of select="ROOM_ABONEMENT_CATEG_COLOR"/>
<!--Фон 2 столбца таблицы, в зависимости от категории-->
</xsl:attribute>
<xsl:value-of select="GUESTNAME"/> <!--Гость во 2-м столбце таблицы-->
</td >
</tr>
</xsl:for-each>
</table>
</div>
</xsl:for-each>
</body>
</xsl:template>
</xsl:stylesheet>