Язык программирования баз данных Informix-4GL

3. Экранный интерфейс

3.1. Общие принципы организации экранного взаимодействия

3.2. Организация меню в Informix-4GL

3.3. Использование экранных форм в Informix-4GL

3.3.1. Файл спецификации экранной формы

3.3.2. Экранные записи и экранные массивы

3.3.3. Операторы языка Informix-4GL для работы с экранными формами

3.4. Запросы по образцу

3. Экранный интерфейс

3.1. Общие принципы организации экранного взаимодействия

В любой момент времени на экране терминала существует текущее окно, через которое и выполняется весь ввод/вывод программы. С окном связаны используемые операторами языка при вводе/выводе атрибуты и номера строк окна. При открытии нового окна оно становится текущим и последующий ввод/вывод будет направляться уже в него.

Ниже приведен набор операторов организации экранного взаимодействия. Самые простейшие из них (Prompt, Display) уже использовались в текстах примеров предыдущих разделов.

Display

Вывод данных в следующую строку.

Display . . . at

Вывод данных в указанные позиции экрана.

Display Form

Отображение предварительно подготовленной экранной формы.

Display . . . to (Display by name)

Вывод данных в поля экранной формы.

Prompt

Вывод списка значений и ввод пользователем переменной, указанной конструкцией FOR.

Input

Ввод данных в поля или экранные массивы экранной формы.

Construct

Ввод пользователем критерия поиска в поля экранной формы.

Message

Вывод короткого сообщения-предупреждения.

Error

Вывод короткого сообщения об ошибке.

Menu

Отображение и работа c горизонтальным меню.

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

Название строки

Назначение

Строка по умолчанию

Привязка

Prompt

Ввод-вывод по оператору PROMPT

FIRST

4GL-window

Menu

Кольцевое меню занимающее две строки

FIRST

4GL-window

Message

Вывод по оператору Message

FIRST+1

4GL-window

Form

Начальная строка экранной формы

FIRST+2

4GL-window

Comment

Комментарий к текущему полю формы

LAST LAST-1

4GL-window 4GL-screen

Error

Вывод по оператору Error

LAST

4GL-screen

Display (без фразы at)

Вывод выражений, заданных в операторе Display

следующая

4GL-window

Ниже приведен пример использования простейших средств экранного взаимодействия.

Создание и открытие окна выполняется оператором OPEN WINDOW. Window-name является глобальным для программы, в которой оно открывается. Когда открывается окно, для него используются параметры, специфицированные по умолчанию, либо заданные оператором OPTIONS для строк MESSAGE, PROMPT, FORM, COMMENT, ERROR. Эти значения могут быть скорректированы предложением ATTRIBUTE в операторе OPEN WINDOW.

Значение атрибута

Значение по умолчанию

BORDER

нет границы

атрибут цвета

цвет изображения на экране

REVERSE

нет обратного изображения

PROMPT LINE

FIRST (1)

MESSAGE LINE

FIRST+1 (2)

FORM LINE

FIRST+2 (3)

COMMENT LINE

LAST-1 (для экрана)

 

LAST (для всех окон, кроме экрана)

Цвета, заданные в предложении ATTRIBUTE, становятся цветом по умолчанию для всего, что отображается в окне, и специфицируются следующим образом:

WHILE

RED

BLUE

INVISIBLE

YELLOW

CYAN

BLACK

BOLD

MAGENTA

GREEN

DIM

NORMAL

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

Дополнительные операторы CURRENT WINDOW, CLEAR WINDOW, CLOSE WINDOW служат соответственно для определения текущего окна, очистки и закрытия окна.

3.2. Организация меню в Informix-4GL

Языковые средства Informix-4GL включают лишь создание кольцевого горизонтального меню для определения вариантов выбора (см. оператор MENU).

Конструкция BEFORE MENU служит для определения блока операторов, выполняемых до активизации меню. Каждый пункт меню начинается ключевым словом COMMAND, с которым могут быть связаны:

Наименование пункта меню обязательно.

При выборе пункта меню выполняется набор записанных ниже операторов языка Informix-4GL, соответствующих варианту выбора. Дополнительные конструкции CONTINUE MENU, EXIT MENU, NEXT OPTION, SHOW OPTION, HIDE OPTION среди операторов, относящихся к ключевому слову COMMAND, служат соответственно для возврата управления в текущий оператор MENU, выхода из меню, указания следующего пункта меню, отображения либо, наоборот, скрытия пункта меню.

Help-файл представляет собой файл, созданный утилитой mkmessage из предварительно подготовленного текстового файла нижеприведенной структуры (данный файл может одновременно содержать описание сообщений для операторов INPUT, PROMPT, MENU):

. <Номер сообщения>

<Текстовое описание сообщения>

. <Номер сообщения>

<Текстовое описание сообщения>

. . . . . . .

При запуске утилиты mkmessage первым параметром указывается имя текстового файла, вторым - имя формируемого утилитой mkmessage откомпилированного файла. Перед вызовом меню, в котором предполагается использование help-файла, оператором OPTIONS должны быть определены используемый откомпилированный help-файл и способ вызова help-сообщения

OPTIONS HELP FILE "help-файл"

OPTIONS HELP KEY key-name,

где key-name - функциональная либо управляющая клавиша (по умолчанию CONTROL-w).

3.3. Использование экранных форм в Informix-4GL

Для использования экранной формы в Informix-4GL необходимо:

Ниже приведен пример отображения данных через экранную форму, на которую в дальнейшем будем ссылаться как Example.per.

3.3.1. Файл спецификации экранной формы

Файлы спецификации формы состоят из трех обязательных секций (Database, Screen, Attributes) и двух необязательных (Tables, Instructions), расположенных в указанном ниже порядке.

Секция Database

Секция Database идентифицирует базу данных, характеристики столбцов таблиц которой будут использоваться для определения полей экранной формы на этапе ее компиляции утилитой Form4gl, либо указывает (FORMONLY), что для определения полей экранной формы не требуется какая-либо база данных.

Database {имя_БД | FORMONLY} [WITHOUT NULL INPUT],

где WITHOUT NULL INPUT - условие, запрещающее ввод NULL-значений.

Cекция Screen

Секция Screen задает точное расположение формы на экране.

Screen [SIZE lines [BY cols]]

{

[text] [field-tag] [graphics-char]

[text] [field-tag] [graphics-char]

. . .

}

[END]

По умолчанию число строк и символов равно соответственно 24 и 80.

Описание формата экрана состоит из массива полей экрана и текстовой информации, такой, как заголовки, поясняющие записи и т.д.

Правила описания полей экранной формы:

Дополнительно отметим графические символы для рисования рамок

\gp------------------q\g

\g| |\g

\gb------------------d\g

Ниже представлено описание секции Screen приведенной выше экранной формы Example1.per.

Секция Tables

Секция Tables специфицирует таблицы, характеристики столбцов которой будут использоваться для определения полей экранной формы на этапе ее компиляции утилитой Form4gl.

Tables

table | table_alias=[database [@server] :][owner.]]таблица

table | table_alias=[database [@server] :][owner.]]таблица

. . . . . . . . . . .

[End]

Ниже приведено возможное описание секции Tables.

Секция Attributes

Секция Attributes описывает поведение, внешний вид, допустимые входные значения, значения по умолчанию каждого поля в секции Screen и связывает каждое поле с именем поля. Каждое поле в секции Screen должно быть описано в секции Attributes. Порядок, в котором описаны поля секции Attributes, задает порядок по умолчанию перемещения курсора на экране.

Attributes

field-tag=field-description;

field-tag=field-description;

. . .

[End]

Двумя важнейшими атрибутами каждого поля являются имя поля и тип поля. Имя поля - это имя, используемое 4GL-программой для отображения в поле экранной формы данных при вводе или выводе. Тип поля может быть задан явно, либо неявно и обусловлен видом полей экранной формы:

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

Формат описания полей, связанных со столбцами:

field-description =[table.]name_column[,attribute-list];

Имя или псевдоним таблицы обязателен лишь в том случае, когда одно и то же имя столбца упоминается более чем в одной таблице в экранной форме. С помощью вырезок в поле могут быть отображены части столбцов типа Char.

Второй тип связи используется для описания полей, не связанных со столбцами таблиц базы данных. Формат описания данного типа связи:

field-description =Formonly.field-name

[Type [data-type | LIKE table.column]]

[NOT NULL][,attribute-list];

Назначение записанных выше параметров:

Formonly - ключевое слово, информирующее, что поле field-tag не связано со столбцом таблицы базы данных и 4GL-программе доступно под именем field-name;

Type - тип данных в соответствии с типами данных Informix с длиной, определенной шириной отображения (по умолчанию предполагается CHAR);

NOT NULL - ключевое слово, информирующее, что поле обязательно должно иметь введенное значение.

Ниже приведен перечень атрибутов attribute-list, служащих для уточнения свойств полей:

1. AUTONEXT - автоматическое перемещение курсора в следующее поле после заполнения текущего при выполнении операции ввода

field-tag = table_column, AUTONEXT, . . .

2. COLOR - вывод текста поля на экран в цвете

field-tag = table_column,

COLOR=[color][ligth][WHERE условие 2 на field-tag], . . .

Список значени цвета и интенсивности изображения приведен выше.

3. COMMENTS - определение сообщения-подсказки

field-tag = table_column, COMMENTS="сообщение", . . .

4. DEFAULT - задание значения по умолчанию

field-tag = table_column, DEFAULT=значение.

5. DOWNSHIFT - замена прописных букв на строчные

field-tag = table_column, DOWNSHIFT, . . .

6. FORMAT - управление форматом вывода на экран для столбцов типа DECIMAL, SMALLFLOAT, FLOAT, DATE

field-tag = table_column, FORMAT="строка_формата", . . .

Строка_формата может содержать символы:

# - для представления цифры; mm, dd, yy - месяц, день, год для данных типа даты в различной форме представления и т.д.

7. INCLUDE - задание полю допустимых значений

field-tag = table_column, INCLUDE=(sense_list) , . . .

где sense_list - список, определяемый отдельными значениями (значение1, значение2, . . .), диапазоном значений (значение1 ТО значение2) или их комбинацией.

8. NOENTRY - предотвращение ввода данных во время операции добавления

field-tag = table_column, NOENTRY, . . .

9. NOUPDATE - предотвращение ввода данных во время операции обновления

field-tag = table_column, NOUPDATE, . . .

10. PICTURE - указание шаблона для вводимых символьных данных

field-tag = table_column, PICTURE="picture-string" , . . .

где picture- string - комбинация из трех символов: А - любая буква, # - любая цифра, X - любой символ.

11. REQUIRED - требование принудительного ввода данных в указанные поля во время операции добавления.

field-tag = table_column, REQUIRED, . . .

12. REVERSE - вывод на экран в реверсном изображении

field-tag = table_column, REVERSE, . . .

13. UPSHIFT - преобразование строчных букв в прописные.

field-tag = table_column, UPSHIFT, . . .

14. VERIFY - требование от пользователя ввода полей дважды, чтобы снизить вероятность ошибки при вводе.

field-tag = table_column, VERIFY, . . .

15. WORDWRAP - необходимость расположения длинной символьной строки в нескольких полях, имеющих один и тот же тэг

field-tag = table_column, WORDWRAP, . . .

Ниже представлено описание секции Screen приведенной выше экранной формы Example1.per.

Секция Instructions

Секция Instruction используется для

Секция начинается с ключевого слова Instructions и заканчивается необязательным ключевым словом END.

По умолчанию в качестве разграничителей полей выступают символы "[" и "]". Для изменения их в инструкции DELIMITERS данной секции в кавычках указываются два символа, определенных в качестве разграничителя для данной экранной формы.

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

3.3.2. Экранные записи и экранные массивы

Экранная запись представляет собой объединение полей экранной формы в единое целое в секции INSTRUCTIONS

SCREEN RECORD record-name

({table_name.*|

table_name.column THRU table_name.column |

table_name.column} [, . . . ])

Элементы экранной записи указываются либо их перечислением, либо заданием диапазона имен полей в порядке их следования в секции ATTRIBUTES (THRU), либо это может быть полный список. При этом table_name может быть FORMONLY, либо именем таблицы базы данных. В 4GL-программе экранная запись доступна под именем record-name.

В нижеприведенном примере часть полей, соответствующих столбцам таблицы Customer (заказчик), ассоциируются с экранной записью. Такая экранная запись позволяет упростить операторы Informix-4GL для корректировки реквизитов заказчика. Все поля, соответствующие столбцам таблицы Customer из указанного диапазона, составляют экранную запись Adress.

Группа из n экранных записей в свою очередь может быть объединена в экранный массив.

Описание экранного массива выполняется в секции INSTRUCTIONS конструкцией

SCREEN RECORD record-name[n]

({table_name.*|

table_name.column THRU table_name.column |

table_name.column} [, . . . ])

Для приведенной выше экранной формы Example1.per описание используемого в ней экранного массива из пяти записей может быть выполнено в виде

Следующая иллюстрация показывает как связаны между собой описания экранного массива в секциях Screen, Attribute и Instructions.

Экранный массив является средством организации так называемого скроллирующего массива, когда на экране при нажатии курсорных клавиш отображается скроллирующий список строк, число которых превышает физический размер области экрана, предназначенной для ввода этих строк.

3.3.3. Операторы языка Informix-4GL для работы с экранными формами

Операторы языка Informix-4GL обеспечивают следующий набор действий с экранной формой:

Оператор OPEN FORM связывает идентификатор Informix-4GL form-name c откомпилированным файлом экранной формы и должен предшествовать всем операциям с экранной формой.

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

Отметим, что указание опции WITH FORM в операторе OPEN WINDOW равносильно паре операторов OPEN FORM и DISPLAY FORM.

Оператор DISPLAY в случае работы с формами позволяет:

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

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

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

Если в секции Instructions экранной формы Example1.per из полей экранной формы описана экранная запись

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

P ALIGN="JUSTIFY">Оператор 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.

3.4. Запросы по образцу

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-\).