МЕТОД 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...

form1.jpg

Для добавления временной таблицы нажимаем кнопку Add.

form2.jpg

В разделе Additional Fields добавляем описание технических полей.

3. Размещение полей на форме.

После того как мы объявили все необходимые нам временные таблицы мы можем разместить их поля на экранной форме и задать их основные атрибуты.

form5.jpg

4. Списки полей

Поля экранной формы объединяются в списки в зависимости от того, в каком из режимов поле должно быть доступно для редактирования. Назначение списков:

  • LIST-1 - поля доступные для редактирования в режиме добавления записи;
  • LIST-2 - поля доступные для редактирования в режиме редактирования записи;
  • LIST-3 - поля доступные для редактирования в режиме просмотра. Обычно это поля, отображаемые в EDITOR для запрещения их изменения воспользуйтесь атрибутом READ-ONLY;
  • LIST-4 - поля для которых атрибут формат определяется в форме.  Для других он заполняется из метасхемы.     

Для добавление поля формы в соответствующие списки необходимо в диалоговом окне атрибутов поля нажать кнопку Advanced.

form3.jpg

Далее в открывшемся диалоговом окне необходимо галочками отметить списки, в которые необходимо включить данное поле.

form4.jpg

Таким образом, автоматически будут созданы списки полей:

/* 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:

form6.jpg

В открывшемся окне в выпадающем списке Section выбираем пункт Procedures, после чего для добавления новой процедуры нажимаем кнопку New.

form7.jpg

Далее от нас требуется указать имя добавляемой процедуры и приступить к ее описанию.

form8.jpg