Язык программирования баз данных Informix-4GL
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-сообщения
OP
TIONS 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 {имя_БД | FO
RMONLY} [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. COLO
R - вывод текста поля на экран в цветеfield-tag = table_column,
COLOR=[color][ligth][WHERE условие 2 на field-tag], . . .
Список значени цвета и интенсивности изображения приведен выше.
3. COMMENTS - определение сообщения-подсказки
field-tag = ta
ble_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.
Ввод данных по оператору INPUT завершается нажатием клавиши ESC, либо управляющей клавиши, определенной параметром ACCEPT KEY в операторе OPTIONS, либо нажатием клавиши RETURN после ввода последнего поля экранной формы при условии действия опции INPUT NO WRAP в операторе OPTIONS. В случае опции INPUT WRAP в операторе OPTIONS нажатие клавиши RETURN после ввода последнего поля экранной формы приводит к циклическому перемещению на первое поле экранной формы.
Следующий пример демонстрирует ввод значений элементов программной записи из полей экранной записи и использование конструкции WITHOUT DEFAULTS.
Ниже приведены примеры использования различных конструкций оператора INPUT.
Отметим, что ввод с использованием экранной формы напрямую не связан с занесением информации в таблицы базы данных.
Оператор CLOSE FORM разрывает связь с экранной формой.
Схема организации скроллирующего массива следующая:
Ниже приведен пример отображение данных в экранный массив 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:
Отметим два 4GL-оператора общего использования, полезных при разработке программных приложений. Оператор WHENEVER с опциями GOTO, CALL, CONTINUE позволяет определить действия, которые необходимо выполнить в случае возникновения ошибок при исполнении программы. Данный оператор особенно полезен при динамическом формировании операторов, когда в тексте оператора возможны ошибки. Отслеживая состояние системных переменных sqlca.sqlcode и STATUS пользователь сам обрабатывает возникающие ошибки. Значение по умолчанию для ERROR - STOP, для WARNING - CONTINUE. Оператор DEFER запрещает прерывание ввода (обычно DEL или Control-C) и прерывание программы (Control-\).