Оператор DISPLAY FORM отображает экранную форму, начиная с третьей строки (если это не изменено предложением ATTRIBUTE оператора OPEN WINDOW) экрана терминала или окна, возможно, со своими атрибутами, определяющими цветовую гамму.
Отметим, что указание опции WITH FORM в операторе OPEN WINDOW равносильно паре операторов OPEN FORM и DISPLAY FORM.
отображать список программных переменных в поля экранной формы с использованием конструкции DISPLAY BY NAME . . . при условии совпадения имен программных переменных с именами полей экранной формы;
задавать при отображении данных собственные атрибуты, определяющие цветовую гамму.

Приведенный пример демонстрирует отображение значений программных переменных в поля экранной формы Example1.per в случае неидентичности имен переменных и имен полей, указанных в секции Attributes.
В следующем примере имена отображаемых значений и используемые поля экранной формы совпадают, что позволяет применять конструкцию BY NAME и не различать имена программных переменных и экранных полей.

Поскольку экранные записи являются лишь средством группирования полей экранной формы, работа с ними выполняется теми же операторами языка Informix-4GL, что и ввод/вывод в поля/из полей экранной формы: по каждому оператору DISPLAY элементы записи, определенной в 4GL-программе и имеющие те же характеристики, что и элементы экранной записи, отображаются в поля экранной формы, ассоциированные с этой экранной записью; по оператору INPUT выполняется обратная операция, по которой вводимые данные из полей экранной формы, составляющие экранную запись, переносятся в элементы программной записи. В обоих случая в 4GL-операторах указываются лишь имена программных и экранных записей.
Если в секции Instructions экранной формы Example1.per из полей экранной формы описана экранная запись

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

P ALIGN="JUSTIFY">Оператор INPUT позволяет:
- вводить список указанных программных переменных через поля экранной формы, используя имена полей экранной формы (INPUT. . . FROM . . .);
- вводить список программных переменных через поля экранной формы с использованием конструкции INPUT BY NAME . . . при условии совпадения имен программных переменных с именами экранных полей экранной формы;
- вводить элементы программной записи (предварительно созданные по DEFINE variable-record RECORD . . . ) через поля экранной записи (INPUT variable-record.* FROM screen-record.*);
- определять использование/не использование значений по умолчанию для полей формы (WITHOUT DEFAULTS);
- задавать действия по обработке до/после ввода данных в поле (BEFORE FIELD/AFTER FIELD, а также контролировать вводимые значения;
- определять порядок ввода данных в поля экранной формы (NEXT FIELD); при отсутствии NEXT FIELD порядок обхода полей экранной формы определяется последовательностью полей в списке INPUT;
- определять действия, которые необходимо выполнить при нажатии указанных функциональных или управляющих клавиш (ON KEY);
- использовать help-сообщения из help-файла (HELP
проверять значение текущего поля с использованием функции infield(field), возвращающей значение true/false;
при необходимости прерывать ввод (EXIT INPUT).
Ввод данных по оператору INPUT завершается нажатием клавиши ESC, либо управляющей клавиши, определенной параметром ACCEPT KEY в операторе OPTIONS, либо нажатием клавиши RETURN после ввода последнего поля экранной формы при условии действия опции INPUT NO WRAP в операторе OPTIONS. В случае опции INPUT WRAP в операторе OPTIONS нажатие клавиши RETURN после ввода последнего поля экранной формы приводит к циклическому перемещению на первое поле экранной формы.

Следующий пример демонстрирует ввод значений элементов программной записи из полей экранной записи и использование конструкции WITHOUT DEFAULTS.

Ниже приведены примеры использования различных конструкций оператора INPUT.

Отметим, что ввод с использованием экранной формы напрямую не связан с занесением информации в таблицы базы данных.
Оператор CLOSE FORM разрывает связь с экранной формой.
Схема организации скроллирующего массива следующая:
- в секции INSTRUCTIONS экранной формы определяется экранный массив;
- в 4GL-программе оператором DEFINE определяется массив достаточной размерности, элементами которого являются записи, компоненты которых имеют те же атрибуты, что и поля экранной формы, ассоциированные с ней;
- любыми средствами выбора данных из таблиц (fetch, foreach) заполняется указанный выше программный массив;
- с помощью функции set_count() 4GL-программе указывается, сколько строк программного массива заполнено данными и подлежит последующему выводу;
- оператором DISPLAY ARRAY выполняется отображение скроллирующего программного массива в экранный массив;
- с помощью функций arr_curr(), scr_liпе() в любой момент можно получить номер текущей строки программного и экранного массивов соответственно;
- в блоках ON KEY, ассоциированных с DISPLAY ARRAY, при необходимости определяются комбинации клавиш и программные действия, которые должны быть выполнены при нажатии этих клавиш.
Ниже приведен пример отображение данных в экранный массив s_items[5], описанный в экранной форме Example1.per.

Средства организации скроллирующего массива на основе оператора DISPLAY ARRAY могут использоваться для создания вертикального меню. С этой целью организуется экранный массив, состоящий из одного или нескольких полей, и программный массив, содержащий либо фиксированные тексты, либо заполненный элементами строк некоторой таблицы. Функции scr_liпе(), arr_curr() позволяют отслеживать положение курсора на экране и внутри программного массива (пункта меню). С помощью конструкции ON KEY, связанной с оператором DISPLAY ARRAY, выполняется та или иная обработка, которая в общем случае может быть связана с пунктом меню, на котором находится курсор. После выполнения некоторой обработки присходит возврат в вертикальное меню (скроллирующий массив).

Приведенный выше фрагмент 4GL-программы, выполняющий работу с вертикальным меню, использует экранную форму (Scroll.per), в которой описан экранный массив из шести записей.

В отличие от оператора DISPLAY ARRAY, который позволяет лишь отображать скроллирующий массив записей, оператор INPUT ARRAY позволяет менять содержимое записей, удалять их и вставлять новые.
Основные шаги при подготовке экранного массива и использовании оператора INPUT ARRAY те же, что и для оператора DISPLAY ARRAY. Дополнительно отметим возможность включения в этот оператор блоков BEFORE/AFTER INPUT, BEFORE/AFTER FIELD, аналогичных по назначению оператору INPUT и использование функций arr_count() для определения количества
заполненных строк в программном массиве. После выполнения оператора INPUT ARRAY с учетом полученного числа строк в программном массиве выполняется обновление строк таблицы, которая ассоциирована с программным массивом.
Ввод данных по оператору INPUT ARRAY так же, как и для INPUT, прерывается нажатием клавиши ESC, либо управляющей клавиши, определенной параметром ACCEPT KEY в операторе OPTIONS. Управляющие клавиши, определенные в параметрах INSERT KEY, DELETE KEY, NEXT KEY, PREVIOUS KEY оператора OPTIONS, служат соответствено для вставки, удаления строк в экранном массиве, а также
перемещения страниц вперед и назад.
Ниже приведен фрагмент программы , выполняющей ввод данных в экранный массив s_items[5], описанный в экранной форме Example1.per.


Informix-4GL содержит средства, позволяющие использовать экранную форму и несколько другим путем: помещая литеральные значения и ограничения на значения в поля экранной формы во время выполнения программы, пользователь формирует условия для запроса. Такой процесс называется запросом по образцу (Query-by-example). Оператор CONSTRUCT используется для создания переменной типа Char и формирования булевого выражения, построенного на экранном запросе Query-by-example. Указанный оператор в значительной степени похож на оператор INPUT и содержит список имен столбцов базы данных и список имен полей экранной формы, ассоциированных с этими столбцами. При совпадении имен полей экранной формы и имен столбцов конструкция BY NAME позволяет исключить из оператора CONSTRUCT список имен полей экранной формы. Конструкции BEFORE (AFTER) FIELD, BEFORE (AFTER) CONSTRUCT, ON KEY в операторе CONSTRUCT используются аналогично соответствующим конструкциям оператора INPUT. При вводе параметров поиска Query-by-example необходимо придерживаться следующего синтаксиса:
Символ
Значение
Тип данных
Использование
=
равно
все
по умолчанию
>
больше
все
>x
<
меньше
все
>x
>=
больше или равно
все
>=x
<=
меньше или равно
все
<=x
<>
не равно
все
<>x
:
диапазон
все
x:y
*
ноль или больше символов
Char
*x, x*, *x*
?
один символ
Char
?x, x?, ?x?, x??
. .
диапазон
Datetime, Interval
x . . y
|
или
все
x | y
Ввод в поле значения литерала равносильно формированию условия равенства на значение соответствующего столбца.
Ввод данных по оператору CONSTRUCT так же, как и для оператора INPUT завершается нажатием клавиши ESC, либо управляющей клавиши, определенной параметром ACCEPT KEY в операторе OPTIONS, либо нажатием клавиши RETURN после ввода последнего поля экранной формы при условии действия опции INPUT NO WRAP в операторе OPTIONS. В случае опции INPUT WRAP в операторе OPTIONS нажатие клавиши RETURN после ввода последнего поля экранной формы приводит к циклическому перемещению курсора на первое поле экранной формы. Если после окончания ввода критерия поиска в поля экранной формы ни в одно из полей не введено значений, сформированное условие в текстовой переменной, указанной в операторе CONSTRUCT, имеет вид " 1=1".
На основании введенных данных в поля экранной формы в текстовой переменной, указанной в операторе CONSTRUCT, формируется булевое выражение, которое впоследствии может использоваться при формировании оператора SQL:
- к постоянной части оператора SELECT (INSERT, DELETE, UPDATE) после фразы WHERE добавляется условие, хранимое в переменной, указанной в операторе CONSTRUCT;
- выполняется оператор PREPARE для составленного текста SQL-оператора;
- объявляется курсор для структуры, сформированной в операторе PREPARE;
- открывается курсор и оператором FETCH (FOREACH) выполняется чтение строк, удовлетворяющих сформированному запросу.
Отметим два 4GL-оператора общего использования, полезных при разработке программных приложений. Оператор WHENEVER с опциями GOTO, CALL, CONTINUE позволяет определить действия, которые необходимо выполнить в случае возникновения ошибок при исполнении программы. Данный оператор особенно полезен при динамическом формировании операторов, когда в тексте оператора возможны ошибки. Отслеживая состояние системных переменных sqlca.sqlcode и STATUS пользователь сам обрабатывает возникающие ошибки. Значение по умолчанию для ERROR - STOP, для WARNING - CONTINUE. Оператор DEFER запрещает прерывание ввода (обычно DEL или Control-C) и прерывание программы (Control-\).
