Основы программирования на языке Informix-L
В данном разделе описываются такие элементы языка Informix-4GL, как константы, программные переменные, операции, выражения и операторы общего назначения.
Константы
В Informix-4GL допускаются строковые, числовые константы, константы даты и времени. Существуют три предопределенные константы: TRUE=1, FALSE=0, NOTFOUND=100.
Переменным и значениям полей таблиц допускается присваивание значения NULL. Значение NULL отлично от нуля для чисел и от пробелов для строк. Способ его кодирования считается неизвестным для программиста.
Строковая константа - последовательность символов, записанная на одной строке и заключенная в кавычки или апострофы. Для использования в строке двойных кавычек они должны быть удвоены, либо им должен предшествовать знак "\".
Числовые константы записываются в обычной для языков программирования форме, причем только по основанию 10. Допускается экспоненциальная нотация. Константы типа DATA, DATATIME, INTERVAL задаются как с помощью символьных строк, так и специальным образом.
15
654.89
12967.0e-3
"1.01.97"
"Для продолжения нажмите \"Д\""
Типы данных Informix-4GL. Программные переменные
В языке Informix-4GL имеются простые переменные, переменные типа запись и массивы. Для описания всех переменных служит оператор DEFINE, в котором задаются идентификаторы и соответствующие типы данных.
Informix-4GL поддерживает 7 различных представлений числовых данных, некоторые из которых обозначаются более чем одним ключевым словом.
| Типы данных | Описание и представление | ||
| DECIMAL[(m,n)], DEC[(m,n)], NUMERIC[(m,n)] | Десятичные числа с фиксированной точкой с m (<=32) значащими цифрами, из которых n (<=m) - после запятой | ||
| DECIMAL[(m)], DEC[(m)], NUMERIC[(m)] | Десятичные числа с плавающей точкой, лежащие в интервале от 10**(-128) до 10**128 (по умолчанию DECIMAL(16)) | ||
| MONEY[(m[,n])] | Денежные суммы с фиксированной точкой, соответствующие DECIMAL(m,n) | ||
| FLOAT[(n)], DOUBLE PRECISION[(n)] | Двоичные числа с плавающей точкой c точностью, соответствующей double в C | ||
| REAL, SMALLFLOAT | Двоичные числа с плавающей точкой c точностью, соответствующей float в C | ||
| INT, INTEGER | Целые числа в интервале от -2,147,483,647 до 2,147,483,647 аналогично integer в C | ||
| SMALLINT | Целые числа в интервале от -32,767 до 32,767 аналогично short в C | 
Informix- 4GL поддерживает следующие типы данных для отслеживания времени.
| Типы данных | Описание и представление | |
| DATE | Календарные даты, хранимые в виде целых чисел дней, прошедших от 31 декабря 1899 года | |
| DATETIME | Моменты времени (дата и время дня), хранимые в виде десятичных чисел с плавающей точкой с нулевой дробной частью и различной точностью, зависящей от требований | |
| INTERVAL | Интервалы времени со знаком, прошедшие между двумя значениями DATETIME | 
| Функция | Описание | |
| DAY(date-expr) | Возвращает номер дня месяца от переменных типа DATE или DATETIME | |
| MONTH(date-expr) | Возвращает номер месяца от переменных типа DATE или DATETIME | |
| WEEKDAY(date-expr) | Возвращает номер дня недели от переменных типа DATE или DATETIME | |
| EXTEND(date,quel) | Меняет точность DATE или DATETIME значений, возвращая значение DATETIME | |
| YEAR(date-expr) | Возвращает номер года от переменных типа DATE или DATETIME | |
| DATE(date-expr) | Преобразует целое или символьную строку в переменную типа DATE или DATETIME | |
| MDY(m,d,y) | Строит значение DATE из целочисленных значений месяца, дня, года | |
| TODAY | Строит значение DATE с текущим значением даты | 
| Типы данных | Описание и представление | |
| CHAR(n), CHARACTER(n) | Строки фиксированной длины до 32,767 ASCII символов | |
| VARCHAR(m) | Строки переменной длины до 256 байт | |
| TEXT | Символьные строки до 2**31 байт | 

Помимо перечисленных выше простых типов данных Informix-4GL позволяет организовывать записи и массивы. Переменная типа запись описывается при помощи конструкции RECORD . . . END RECORD и включает группу переменных, в общем случае различных типов и возможно другие записи.
Обращение к полю element_name записи record_name производится как record_name. element_name, а ко всем полям записи как record_name.* Конструкции LIKE table.column позволяют определять тип данных в соответствии со значением типа столбца column таблицы table. Если определить запись с помощью конструкции LIKE table.*, то запись будет иметь столько же полей, сколько столбцов в таблице table и таких же типов. Элементами записи могут быть другие записи. Переменная типа массив имеет описатель ARRAY [i,j,k] OF type, где type - тип простой переменной или конструкция RECORD. Ниже приведены примеры определения записей и массивов:

Переменные подразделяются на локальные, модульные и глобальные. Локальная переменная объявлена внутри блока function, main, report. Память под локальные переменные выделяется динамически и определение действует внутри блока, в котором переменная объявлена. Модульная переменная должна быть объявлена в самом начале модуля с исходным текстом вне любого блока report, function или main. Память под модульные переменные выделяется статически и определение действует внутри всего модуля за исключением блоков, в которых это имя переобъявлено и является для них локальным. Глобальные переменные должны быть определены с помощью блока GLOBALS . . . END GLOBALS в этом или отдельном модуле, либо в специальном файле, обращение к которому производится в виде GLOBALS "globals-filename". Для обращения к глобальным переменным в модуле ранее всех программных блоков должно содержаться их определение. Ниже приведен пример описания переменных разных классов и области их действия для программы, состоящей из трех файлов:

Областью действия глобальных переменных, определенных в файле Define.4gl, является вся программа (файлы Define.4gl, Sklad.4gl, Funk.4gl), исключая переменную init_day, которая в функции Funk1 переопределена как локальная. Аналогично областью действия модульных переменных, определенных в файле Sklad.4gl, является весь этот файл, исключая переменную audit, которая в блоке main() переопределена как локальная.
Областью действия идентификаторов форм, окон, функций и отчетов является вся программа. Область действия идентификаторов предложений PREPARE и DECLARE начинается с самого предложения и продолжается до конца модуля.
Операции в языке Informix-4GL
Числовые операции языка Informix-4GL представлены таблицей
| + | сложение | - | вычитание | 
| * | умножение | / | деление | 
| ** | возведение в степень | mod | деление по модулю | 
| () | выделение приоритета | USING | форматирование | 
time-var + interval-var = time-var;
time-var - time-var = interval-var.
Набор операций и функций для работы со строковыми типами данных и строковых преобразований в Informix-4GL представлен ниже
| Операции и функция | Описание | |
| char-var, char-var | Конкатенация строк | |
| char-var[s,t] | Выделение подстроки значений CHAR или VARCHAR | |
| ASCII int-var | Преобразование ASCII-кода в CHAR(1) | |
| char-var CLIPPED | Удаление конечных пробелов | |
| value USING "format" | Получение символьного представления значения value в соответствии с форматом | |
| LENGTH(char-var) | Получение длины символьного выражения, исключая конечные пробелы | 
expr1 rel_op expr2 или expr или NOT expr,
где rel_op - операция отношения из следующего набора:
| Операция rel_op | Описание | Тип expr | Примечание | 
| = | Равно | Любой | |
| > | Больше | Любой | |
| >= | Больше или равно | Любой | |
| !=, <> | Не равно | Любой | |
| < | Меньше | Любой | |
| <= | Меньше или равно | Любой | |
| [NOT] LIKE | Вхождение | Символьный | |
| [NOT] MATCHES | Вхождение | Символьный | |
| IS [NOT] NULL | NULL-значение | Любой | expr2 отсутствует | 
При этом Informix- 4GL делает все возможное, чтобы выполнить преобразование типов данных.

Операторы общего назначения
В данном разделе обсуждаются три группы операторов языка Informix-4GL (подробный синтаксис операторов приведен в приложении Г [5]):
К первой группе операторов относятся:
| LET | Значение, вычисленное в общем случае как результат выражения, присваиваемое простой программной переменной, элементу массива или записи. | 
| INITIALIZE | Инициализация списка переменных или записи значением NULL или значениями, которые определены как значения по умолчанию для столбцов указанной таблицы. | 

Ко второй группе операторов относятся:
| СALL | Вызов функции, возвращающей нуль или более значений, указанных в конструкции RETURNING. | 
| FOR | Заголовок цикла, заканчивающийся предложением END FOR и выполняющийся до тех пор, пока переменная цикла не достигнет предельного значения. | 
| FOREACH | Заголовок цикла, заканчивающийся предложением END FOREACH и выполняющийся по одному разу для всех строк, возвращенных как результат запроса к базе данных. | 
| WHILE | Заголовок цикла, заканчивающийся предложением END WHILE и выполняющийся до тех пор, пока условие, сформулированное в заголовке цикла, не станет ложным. | 
| CONTINUE | Переход к следующей итерации цикла, к следующему пункту меню или к продолжению ввода. | 
| EXIT | Преждевременный выход из предложений FOR, FOREACH, WHILE, MENU, INPUT, CASE или из всей программы. | 
| IF | Заголовок условного оператора, заканчивающегося конструкцией END IF. | 
| CASE | Заголовок оператора выбора, заканчивающегося конструкцией END CASE. | 
| GOTO | Переход к заранее определенному месту программы на указанную метку. | 
| LABEL | Определение метки программы для безусловного перехода. | 
| SLEEP | Задержка выполнения программы на указанный промежуток времени. | 
| RETURN | Возврат управления из функции, возможно, с возвратом списка выражений, число и типы которых совпадают с обозначенными в предложении RETURNING оператора CALL при вызове функции. | 
| RUN | Запуск некоторой программы средствами операционной системы. | 
К третьей группе операторов относятся:
| MAIN | Основной блок программы, на который передается управление при запуске и который заканчивается предложением END MAIN. | 
| FUNCTION | Программный блок, содержащий последовательность операторов языка Informix-4GL, заканчивающийся предложением END FUNCTION и, возможно, возвращающий вызвавшей ее функции нуль или более значений посредством оператора RETURN. | 
| REPORT | Блок, содержащий спецификации по выводу и форматированию отчета (см. гл. 4). | 

