Главная О компании Новости Обучение Обратная связь Форум
сервер контра

ABACUS Financial ABACUS Builder ABACUS Professional ABACUS WEB

Связанные таблицы ABACUS Builder (AB7) - инструмент разработки корпоративных информационных систем на базе СУБД Oracle

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

Для рассмотрения данного вопроса создадим документ, отображающий список сотрудников подразделения предприятия или всего предприятия.

Как всегда, проектирование модуля системы в 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. Работающее приложение. Список сотрудников отдела


Первой электрической машинкой был американский "Электроматик" выпуска 1935 г. Затем последовали "Эрики", "Оптимы", "Ятрани", которые практически повсеместно вытеснены персональными компьютерами. Из истории создания ККМ, арифмометров и счетных машин
ABACUS Builder. Cостав инструмента разработки

  © Компания "ОМЕГА"   www.omega.ru   (495) 234-42-32,  (495) 727-43-50