Главная | О компании | Новости | Обучение | Обратная связь | Форум |
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. Работающее приложение. Список сотрудников отдела
|
|
|
||