| Главная | О компании | Новости | Обучение | Обратная связь | Форум |
ABACUS Financial ABACUS Builder ABACUS Professional
|
Связанные таблицы
В этой статье рассмотрим вопрос организации связанных таблиц на экранной форме. Если быть более точными, то основное, что надо понять - это механизм работы связанных компонентов, отвечающих за отображение данных в таблице. Связка таблиц осуществляется для одновременного скроллинга (прокрутки). Для рассмотрения данного вопроса создадим документ, отображающий список сотрудников подразделения предприятия или всего предприятия. Как всегда, проектирование модуля системы в ABACUS Builder начинается с анализа учетной схемы. На рис.1 приведена упрощенная учетная схема - отображаются лишь те категории и связи, которые нам понадобятся для создание документа. В схеме приведены категории (сущности), их номера и атрибуты. Связь "сверху вниз" показывает, что у одного экземпляра "верхнего" объекта может быть несколько экземпляров "нижнего" объекта.
Рис. 1. Учетная схема предприятия (упрощенная) Создадим экранную форму нашего документа. Разместим компонент "Вычисляемое поле" FIRM, в свойствах "Дополнительно" укажем параметры справочника - это документ №3 категории 12003. Теперь мы сможем выбирать предприятие из имеющихся в этой категории. Аналогично разместим компонент "Вычисляемое поле" DEPART, в параметрах справочника укажем документ №2 категории 12004 (список подразделений). (Подробнее смотрите в статье "Подкачиваемые таблицы"). Теперь разместим на форме заголовки таблицы (компоненты "Текст"), таблицу TABLE (компонент "Таблица"), в таблице 5 компонентов типа "Вычисляемое поле": TAB_NO, FIO, POS, ORD, DAT для отображения табельного номера, фамилии и инициалов, должности, наименования приказа, даты начала действия приказа соответственно. Разместим справа от таблицы TABLE еще один компонент "Таблица" TABLE1, в этом компоненте разместим "Вычисляемое поле" DEP для отображения подразделения, сверху поместим компонент "Текст", на вкладке свойств "Дополнительно" "Название" укажем TEXT_DEP (название текстового компонента нам понадобится для управления его отображением). Также дадим имена компонентам типа "Текст", расположенным слева от поля FIRM TEXT_FIRM и слева от поля DEPART TEXT_DEPART. Все вычисляемые поля внутри таблиц TABLE и TABLE1 должны быть размножаемыми, сами таблицы вводимыми. Инсталляция документа приведена на рис. 2.
Рис. 2. Инсталляция документа Теперь для организации одновременного скроллинга таблиц TABLE и TABLE1, укажем в свойстве TABLE1 "Выровнять по горизонтали" TABLE (рис.3).
Рис. 3. Выравнивание таблиц Аналогично выровняем по горизонтали компонент DAT по TAB_NO и ORD по DAT. Теперь добавим компонент "Вычисляемое поле" SELECT для организации запроса, а также компонент "Флажок" CHECK для организации возможности просматривать либо все предприятие, либо только отдел, разместим компоненты "Локатор" и "COMBO" для организации поиска и сортировки информации в таблице TABLE (рис. 4).
Рис. 4. Общий вид инсталляции документа Теперь напишем запрос для заполнения таблиц. В компонент SELECT добавим формулу "Вычисление", текст формулы следующий:
DECLARE
check AS INTEGER --Переменная для отображения статуса CHECK
{
check:=%CHECK.getcheck(); --"Включен" ли CHECK?
if check then {
--Если да, (отображаем сотрудников всего предприятия) то
%TEXT_FIRM.Show(); --Показываем компонент TEXT_FIRM
%FIRM.Show(); --Показываем компонент FIRM
%TABLE1.Show(); --Показываем компонент TABLE1
%DEP.Show(); --Показываем компонент TEXT_FIRM
%TEXT_DEP.Show(); --Показываем компонент TEXT_DEP
%TEXT_DEPART.Hide(); --Убираем компонент TEXT_DEPART
%DEPART.Hide(); --Убираем компонент DEPART
%SHOW_FIRM.Hide(); --Убираем компонент SHOW_FIRM
--Формирование запроса для заполнения таблицы TABLE
%TABLE:=aql(
SELECT
#.1003, --Выбираем атрибут 1003 (табельный №)
#.1002, --Выбираем атрибут 1002 (Фамилия, И.О.)
#:1830 where (#^1839.10002=2)^184.2
-/Выбираем все объекты категории 1830, привязанные "снизу" к сотруднику,
проверяем, что приказ о назначении на должность, получаем атрибут 2
(Наименование) объекта категории 184 "Должность", привязанного сверху
к выбранному приказу/-
FROM %FIRM:12005 ORDER BY 2);
-/Выбираем все объекты категории 12005 "Сотрудники", привязанные
"снизу" к объекту, находящемуся в компоненте FIRM,
сортируем по 2-му столбцу (Ф.И.О.)/-
}
else { --Иначе отображаем список сотрудников отдела
--"Прячем и показываем" соответствующие компоненты
%TEXT_FIRM.Hide();
%FIRM.Hide();
%DEPART.Show();
%TEXT_DEPART.Show();
%TABLE1.Hide();
%DEP.Hide();
%TEXT_DEP.Hide();
%SHOW_FIRM.Show();
--Запрос, почти аналогичный предыдущему
%TABLE:=aql(SELECT
#.1003,
#.1002,
#:1830 where (#^1839.10002=2)^184.2
FROM [12003*] where(#:12004=%DEPART):12005 ORDER BY 2);
-/Выбираем все предприятия, из них отбираем те, у которых
нижний объект категории 12004 это объект компонента DEPART,
выбираем сотрудников, сортируем по полю Ф.И.О./-
}
}
Теперь необходимо добавить в компонент DAT следующую формулу "Вычисление":
DECLARE
ob AS COV --Переменная "Категория, объект, значение
dat AS DATE
{
ob:=%TAB_NO.Current(); --Получаем текущий объект сотрудника
return aql(ob:1830.187); --Возвращаем дату всех приказов сотрудника
}
А также в компонент ORD формулу "Вычисление":
DECLARE
ob AS COV
{
ob:=%DAT.Current(); --Получаем текущий приказ из компонента DAT
return aql(ob^1839.2); --Возвращаем наименование приказа
}
Для того, чтобы в случае переключения компонента CHECK автоматически обновлялось содержимое таблиц TABLE и TABLE1, необходимо добавить в него формулу "Вычисление" для отработки компонента SELECT: %SELECT.ReRead(); Теперь необходимо для заполнения таблицы TABLE1 в компонент DEP добавить следующую формулу "Вычсление":
DECLARE
ob AS COV
{
ob:=%TAB_NO.Current();
--Получаем текущее значение объекта категории 12005 "Сотрудники"
return aql(ob:1830 where(#^1839.10002=3)^12004.2);
-/Выбираем все приказы этого сотрудника, находим приказ "О подразделении"
(тип 3), получаем объект категории 12004, привязанный "сверху"
к этому приказу, отображаем атрибут 2 "Наименование"/-
}
Работающий документ выглядит следующим образом: (рис. 5, 6)
Рис. 5. Работающее приложение. Список сотрудников предприятия
Рис. 6. Работающее приложение. Список сотрудников отдела
|
|
|
|
||