МЕТОД FORM КЛАССОВ МЕТАСХЕМЫ
Построение экранной формы просмотра/редактирования/создания объектов классов метасхемы базируется на Instanсe.
Экранная форма редактирования объекта выполняет вызов процедуры GetInstance, которая выполняет создание Instance и заполнение его данными из БД. Сформированный набор данных объекта пересылается во временные таблицы экранной форме, которые обеспечивают его отображение и возможность изменения. По окончанию работы в экранной форме, измененный набор данных из временных таблиц экранной формы переносится в Instance, после чего осуществляется вызов процедуры SetInstance, которая осуществляет сохранение объекта в БД. Такую схему обработки обеспечивает шаблон экранной формы bis-tty-win.w.
Разберем по шагам процесс создание процедуры метода:
1. Копируем и переименовываем шаблон bis-tty-win.w.
Именно он станет основой нашей процедуры метода Form. Для примера скопируем и переименуем bis-tty-win.w в my-form.p. Получившуюся заготовку процедуры метода необходим открыть с помощью AppBuilder.
2. Объявление временных таблицы экранной формы.
В процедуре метода Form необходимо объявить временные таблицы, в которые впоследствии будут загружены данные из динамических временных таблиц экземпляра (Instance) и поля которых будут выведены в экранной форме. Имена полей дынных таблиц должны быть идентичны полям соответствующих таблиц Instance. Совсем необязательно объявлять все поля Instance во временных таблицах, а достаточно только те, которые впоследствии планируется вывести в экранной форме.
Помимо полей реквизитов класса метасхемы, данные таблицы обязательно должны содержать специальные поля Instance:
FIELD local__template AS LOG /* Признак шаблон/не шаблон */
FIELD local__rowid AS ROWID /* ROWID записи в БД */
FIELD local__id AS INT64 /* Идентификатор записи */
FIELD local__upid AS INT64 /* Ссылка на запись в агрегирующей табл. */
FIELD user__mode AS INT64 /* Флаг управления записью в БД */
Префикс создаваемой временной таблицы обязательно должен быть "tt-" (см &GLOBAL-DEFINE TT_PREFIX в form.def).
DEFINE TEMP-TABLE tt-loan NO-UNDO LIKE loan
FIELD local__template AS LOGICAL /* Признак шаблон/не шаблон */
FIELD local__rowid AS ROWID /* ROWID записи в БД */
FIELD local__id AS INT64 /* Идентификатор записи */
FIELD local__upid AS INT64 /* Ссылка на запись в агрег. таблице */
FIELD user__mode AS INT64 /* Флаг управления записью в БД */
/* Записываем ссылку на временную таблицу в специальную таблицу */
{ln-tthdl.i "tt-loan" "" }
ln-tthdl.i осуществляет помещение ссылки на временную таблицу в специальную таблицу формы для ее автоматического заполнения.
- 1-ый аргумент - созданная временная таблица основного класса;
- 2-ой аргумент - Instance агрегируемого класса. для главного Instance - "".
Для объявления временных таблиц в AppBulder-е переходим Tools -> Procedure Settings...
Для добавления временной таблицы нажимаем кнопку Add.
В разделе Additional Fields добавляем описание технических полей.
3. Размещение полей на форме.
После того как мы объявили все необходимые нам временные таблицы мы можем разместить их поля на экранной форме и задать их основные атрибуты.
4. Списки полей
Поля экранной формы объединяются в списки в зависимости от того, в каком из режимов поле должно быть доступно для редактирования. Назначение списков:
- LIST-1 - поля доступные для редактирования в режиме добавления записи;
- LIST-2 - поля доступные для редактирования в режиме редактирования записи;
- LIST-3 - поля доступные для редактирования в режиме просмотра. Обычно это поля, отображаемые в EDITOR для запрещения их изменения воспользуйтесь атрибутом READ-ONLY;
- LIST-4 - поля для которых атрибут формат определяется в форме. Для других он заполняется из метасхемы.
Для добавление поля формы в соответствующие списки необходимо в диалоговом окне атрибутов поля нажать кнопку Advanced.
Далее в открывшемся диалоговом окне необходимо галочками отметить списки, в которые необходимо включить данное поле.
Таким образом, автоматически будут созданы списки полей:
/* Custom List Definitions */
/* List-1,List-2,List-3,List-4,List-5,List-6 */
&Scoped-define List-1 tt-loan.branch-id tt-loan.cust-cat tt-loan.cust-id ~
tt-loan.cont-code tt-loan.cont-type tt-loan.open-date tt-loan.end-date ~
tt-loan.close-date
&Scoped-define List-2 tt-loan.branch-id tt-loan.cust-cat tt-loan.cust-id ~
tt-loan.cont-type tt-loan.open-date tt-loan.end-date tt-loan.close-date
&Scoped-define List-3 tt-loan.branch-id tt-loan.cust-cat tt-loan.cust-id ~
tt-loan.cont-type tt-loan.open-date tt-loan.end-date tt-loan.close-date
&Scoped-define List-4 tt-loan.branch-id tt-loan.cust-cat tt-loan.cust-id ~
tt-loan.cont-code tt-loan.cont-type tt-loan.open-date tt-loan.end-date ~
tt-loan.close-date
5. Описание триггеров, событий происходящих на форме.
В разделе Control Triggers возможно задание триггеров на события формы. Это могут быть как триггеры обработки нажатия горячих клавиш, так и модификация введенных данных.
6. Определение локальных пользовательских процедур.
В процедуре метода форм возможно определения ряда локальных пользовательских процедур. Вызов данных процедур осуществляется из процедур заполнения временных таблиц экранных форм данными из базы данных (процедура GetObject) и сохранения данных временных таблиц в базу данных (процедура SetObject) описанных в bis-tty.pro.
GetObject:
- BeforePrepareInstance - процедура вызываемая перед вызовом процедуры формирования структуры Instance. Выходным параметром данной процедуры является список реквизитов для PrepareInstance;
- LocalGetObject - процедура без параметров;
- AfterGetInstance - процедура без параметров, вызываемая после GetInstance;
- PostGetObject - процедура без параметров, вызываемая после переноса данных Instance во временные таблицы экранной формы.
SetObject:
- LocalSetObject - процедура без параметров, вызываемая первой в SetObject;
- BeforeSetInstance - процедура без параметров, вызываемая перед записью Instance в базу данных, т.е. перед выполнением процедуры SetInstance;
- PostSetObject - процедура без параметров, вызываемая сразу после SetInstance;
- ValidateObjectLocal - процедура валидации без параметров, вызываемая в завершение SetObject.
Таким образом, работа с временными таблицами экранной формы перед отображением может осуществляться в процедуре PostGetObject и перед сохранением в базу данных в процедуре LocalSetObject.
Для определения процедуры заходим в раздел Edit code:
В открывшемся окне в выпадающем списке Section выбираем пункт Procedures, после чего для добавления новой процедуры нажимаем кнопку New.
Далее от нас требуется указать имя добавляемой процедуры и приступить к ее описанию.