# VisDbLabel Описание класса

VisDbLabel служит для отображения и редактирования данных хранящихся в базах данных (БД).

Внимание! Компонент создан на основе VisLabel в режиме "очень надо", требует доработки.

Информация может быть статической или динамически изменяющейся.

Статическая информация задаётся при помощи свойства text, при этом свойство script должно быть пустым.
Для реализации динамической метки необходимо задать скрипт изменения информации (script). В процессе работы проекта, происходит периодический вызов скрипта, который может изменить текст и вид метки.
Родительский класс: VisBase
Объект данного класса должен быть частью (дочерним объектом) одного из потомков VisContainer.

# Свойства объекта

- text
- pos
- size
- font
- textColor
- backgroundColor
- reqPosColor
- autoFillBackground
- shadow
- shape
- alignment
- wordWrap
- controller
- ctrlInfo
- db
- query
- queryUpdate
- queryOptions
- valueEditor
- editorType
- editorOptions

# Описание свойств

## text

Текст метки.

## pos

Положение метки.

## size

Размер метки.

## font

Стиль шрифта.

## textColor

Цвет текста.

## backgroundColor

Цвет фона метки.

## autoFillBackground

Закрашивать фон.
Значение параметра равное "true" говорит что фон метки должен быть закрашен, инача фон прозрачный.

## shadow

Вид рамки вокруг метки.
Plain - плоская
Raised - выпуклая
Sunken - утопленная

## shape

Стиль рамки вокруг метки.

## alignment

Выравнивание текста.

## wordWrap

Перенос слов.

## script

Периодически исполняемый скрипт.
Скрипт - периодически вызываемая подпрограмма, позволяющая изменять информацию и внешний вид метки.

## controller

Контроллер действий пользователя.

## ctrlInfo

Дополнительная информация для контроллера.

## db

Источник данных типа DpBaseDB.
База данных хранящая информацию для отображения.

## query

Запрос возвращающий значение для отображения.
Например, запрос названия партии из базы данных весового учёта для весов "aw01":

    select b.DESCR

    from MODULES m, BATCHES b

    where m.name = 'aw01'

          and m.IDBATCH = b.IDBATCH

## queryUpdate

Запрос для обновления значения в БД.
Например, запрос названия партии из базы данных весового учёта для весов

## queryOptions

Дополнительные данные для выполнения запросов.

## valueEditor

Компонент для редактирования значения (не используется).

## editorType

Тип редактора.
Подробнее см. "Редакторы"

## editorOptions

Дополнительные данные для редактора.
Подробнее см. "Редакторы"

# Редакторы

Редакторы предназначены для измения определённых данных в БД. Тип редактора "editorType" определяет вид редактора, а дополнительные данные "editorOptions" содержат информацию о параметрах использования конкретного редактора. Дополнительные параметрый представляют из себя набор строк, назначение которых зависит от конкретного типа параметра.

Существующие редакторы:

- etInt
- etString
- etSelectionList
- etBatches

## etInt

Редактор целочисленного поля.
Пример для просмотра/редактирования значение поля "ARCVALSIZE" в таблице "MODULES" базы данных весового учёта.
Свойство "query" (необходимо и достаточно для отбражения значения):

     SELECT ARCVALSIZE

     FROM MODULES

     where name = 'aw01'

Свойство "queryUpdate" (необходимо для редактирования значения):

     update MODULES set ARCVALSIZE = %1

     where name = 'aw01'

Свойство "editorType" = etInt
Свойство "editorOptions" = ""

## etString

Не реализован.

## etSelectionList

Редактор для изменения текущего продукта в таблице модулей базы данных весового учёта.
В дополнительных параметрах, в первой строке необходимо указать имя (поле - "name") модуля.
Редактрор позволяет выбрать продукт из списка уже заданных, или добавать новый тип продукта.
Например, настройки для просмотра/редактирования текущего продукта для модуля "aw01".
Свойство "query" (необходимо и достаточно для отбражения значения):

     select p.NAME

     from PRODUCT p, MODULES m

     where (p.IDPROD = m.IDPROD)

           and (m.name = 'aw01')

Свойство "editorType" = etSelectionList
Свойство "editorOptions" в первой строке должно содержать "aw01"

## etBatches

Редактор предназначен для изменения значения поля текущей партии в таблице модулей базы данных весового учёта.
В дополнительных параметрах, в первой строке необходимо указать имя (поле - "name") модуля.
При вызове редаткора пользователь воодит название партии (строка). Для новго значение в таблице партий производится поиск существующе партии. Если партия с таким названием уже существует, то её id устанавливается в соответствующее поле таблицы модулей. Если партия с таким названием не существует, то сначала создаётся новая запись, а затем новый id партии устанавливается в соответсвующее поле.
Далее пример настроек для просмотра/редактирования текущей партии для модуля "aw1".
Свойство "query" (необходимо и достаточно для отбражения значения):

     select b.DESCR

     from MODULES m, BATCHES b

     where m.name = 'aw01'

           and m.IDBATCH = b.IDBATCH

Свойство "editorType" = etBathes
Свойство "editorOptions" в первой строке должно содержать "aw01"

# Использование скрипта

Скрипт может использовать объекты и функции описанные ниже.

## lbl - QLabel.

Можно использовать все "public slots" объекта.

## obj - собственно этот компонент (VisLabel).

Для него доступны:
void setText(QString arg) - изменить текст
QVariant getVar(int idx) - получить значение переменной
QVariant getParameterValue(int idx) - получить значение параметра
void setTextColor(QColor arg) - установить цвет текста
void setBackgroundColor(QColor arg) - установить цвет фона
void setTextColor(int arg) - установить цвет текста
void setBackgroundColor(int arg) - установить цвет фона
void show() - показать
void hide() - спрятать
QString FloatToStr(double v, int prec) - преобразовать число в строку. prec - количество знаков после запятой.

## Примеры:

Вывод процента (переменная с индексом = 0, равная процент * 10), с точностью до десятых.
`percent = obj.getVar(0);`
`lbl.text = obj.FloatToStr(percent/10, 1);`
Вывод информации о состоянии маршрута.
`state = obj.getVar(0);
switch (state) {
case 0: lbl.text = "Выключен"; break;
case 1: lbl.text = "Ожидание уст.задвижек, ДВУ..."; break;
case 2: lbl.text = "Готов к старту. Нажмите СТАРТ"; break;
case 3: lbl.text = "Запуск... Осталось " + (obj.getVar(3) - obj.getVar(1)) + " сек" ; break;
case 4: lbl.text = "Запуск приостановлен"; break;
case 5: lbl.text = "Работает"; break;
case 6: lbl.text = "Останов... Осталось "+ (obj.getVar(4) - obj.getVar(2)) + " сек"; break;
case 7: lbl.text = "Останов приостановлен"; break;
default:
lbl.text = "?";
}
if (state >0) {
obj.setBackgroundColor(0x00FF00);
} else {
obj.setBackgroundColor(0xCCCCCC);
}
`

# Использование контроллера

Без использования контроллера, при клике на метке, происходить проверка прав на редактирование параметров и, если права есть, вызов соответствующего редактора.
Если нам необходимо иметь возможность разрешить редактирование параметров пользователям с другим типом прав (например, право на редактирование маршрутов), или перед вызовом редактора задать вопрос, или после редактирования параметров сохранить соответствующее сообщение, то необходимо использовать один из контроллеров действий пользователя.
О контроллерах см. "Контроллер действий пользователя".
Метка использует контроллер в режиме "проверить права - задать вопрос - действие (вызвать редактор параметров) - сохранить сообщение".
Метка предоставляет контроллеру следующие данные:

1. Тип сообщения.
2. Объект сообщения.
3. Текст сообщения.
4. Вопрос для подтверждения вызова панели редактирования параметров.

Есть два варианта формирования этих данных - простой и расширенный.
Простой вариант.
Контроллеру передаются только объект сообщения (указывается в свойстве ctrlInfo без использования символа ";") и, если произошло изменение параметра, текст сообщения.
Тип сообщения производит и вопрос остаются не определёнными (на "усмотрение" контроллера).
Расширенный вариант.
Если в свойстве ctrlInfo используется символ ";" хотя бы один раз, то используется данный вариант.
Данные задаются в следующем порядке: "тип;объект;текст;вопрос".
Любое из полей может быть не определено, соответственно будут не определены соответствующие данные.
Например, если мы хотим передать только вопрос, то значение свойства будет ";;;вопрос".
Внимание! Пробел является допустимым значением.
.