INTEGER SERIAL[(n0)] CHAR(n) DATE
SMALLINT DECIMAL(m,n) DATETIME qualif1 TO qualif2
REAL MONEY(m,n) INTERVAL qualif1 TO qualif2
FLOAT RECORD ARRAY [i,j,k] OF datatype
где qualif \in {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}
Операции числовые: ** * / mod + - ( )
Все аргументы, в том числе CHAR, преобразуются к типу DECIMAL
Внимание: -7 mod 3 = -1
Внимание: mod и ** нельзя использовать в операторе SELECT
Можно пользоваться встроенными функциями 4GL (см. "Функции 4GL") и функциями на языке Си.
status { 0 | NOTFOUND | <0 } код завершения оператора
quit_flag ( не 0 если было нажато QUIT )
int_flag ( не 0 если было нажато ^C )
define SQLCA record # системная запись с кодами завершения
SQLCODE integer, =status
SQLERRM char(71), -
SQLERRP char(8), -
SQLERRD array[8] of int,...„см.
SQLAWARN char(8) warning или пробел
end record
SQLERRD[1] зарезервирован
SQLERRD[2] serial значение или ISAM error cod
SQLERRD[3] число обработанных строк
SQLERRD[4] CPU cost запроса
SQLERRD[5] offset of error into SQL-st
SQLERRD[6] ROWID of last row
SQLERRD[7] зарезервирован
SQLERRD[8] зарезервирован
MAIN Главный блок (должен быть ровно один)
. . .
END MAIN
CALL function-name ([список аргументов]) [RETURNING возвр. знач]
FUNCTION function-name ([список аргументов])
. . . Аргументы передаются
[RETURN expr-list] по значению
. . .
END FUNCTION
REPORT report-name(variable-list)
[DEFINE-statement]
. . .
[OUTPUT
output-statement
. . .]
[ORDER [EXTERNAL] BY sort-list
FORMAT
format-statement
. . .
4gl-statement
. . .
END REPORT
DEFINE список переменных { type | LIKE table.column
| RECORD {LIKE table.* | список переменных [,..]
END RECORD} } [,...]
где type может быть следующим:
INTEGER CHAR(n) DATE
SMALLINT DECIMAL(m,n) DATETIME qualif1 TO qualif2
REAL MONEY(m,n) INTERVAL qualif1 TO qualif2
FLOAT RECORD ARRAY [i,j,k] OF datatype
где qualif Ё {YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}
GLOBALS { "файл с GLOBALS объявлениями" |
DEFINE-st Должен лежать вне любого блока во всех
. . . модулях, где эти переменные используются
END GLOBALS }
CALL function([список аргументов]) [RETURNING список переменных]
! ! ! передача по значению
CASE CASE (выражение)
WHEN логич.выраж. WHEN выраж1
. . . или . . .
[EXIT CASE] [EXIT CASE]
. . . . . .
WHEN логич.выраж. WHEN выраж2
. . . . . .
[OTHERWISE] [OTHERWISE]
. . . . . .
END CASE END CASE
IF логическое выражение THEN
. . .
[ELSE
. . . ]
END IF не забывайте закрывать все операторы IF !!!
FOR I= i1 TO i2 [STEP i3]
statement
. . .
[CONTINUE FOR]
. . .
[EXIT FOR]
. . .
END FOR
CONTINUE { FOR | FOREACH | MENU | WHILE }
EXIT { CASE | WHILE | FOR | FOREACH | MENU | INPUT | DISPLAY
| PROGRAM[(status code for UNIX)] }
WHILE логическое выражение
операторы . . .
. . .
[CONTINUE WHILE]
. . .
[EXIT WHILE]
. . .
END WHILE
GOTO [:] метка Двоеточие ':' для совместимости с ANSI стандартом
LABEL метка: Действует только внутри блока
RUN {"командная строка UNIX"|char-variable} [RETURNING int-variable
| WITHOUT WAITING]
SLEEP целое-выраж. Подождать n секунд
MENU "Название меню"
COMMAND { KEY (key-list) |
[KEY (key-list)] "kоманда меню"
[" подсказка help"] [HELP help-number] }
Либо key, либо первая буква, обязаны быть латинскими.
statement
. . .
[CONTINUE MENU]
. . .
[EXIT MENU]
. . .
[NEXT OPTION "kоманда меню" # Перейти к
[COMMAND . . . ]
. . .
END MENU
OPTIONS { По умолчанию:
PROMPT LINE p | FIRST
MESSAGE LINE m | FIRST + 1
FORM LINE f | FIRST + 2
COMMENT LINE c | LAST [-1]
ERROR LINE e | LAST
INPUT { WRAP | NO WRAP } | NO WRAP
INSERT KEY key-name | Вставить F1 !! Не применять:
DELETE KEY key-name | Удал. стр F2 CONTROL-A,D,H,L,
NEXT KEY key-name | Страница F3 CONTROL-Q,R,X,
PREVIOUS KEY key-name | Страница F4 CONTROL-C,S,Q,Z
ACCEPT KEY key-name | ESC
HELP FILE "help-file" | Предварительно откомпилированный
HELP KEY key-name | CONTROL-W утилитой mkmessage
INPUT ATTRIBUTE(список атрибутов) |
DISPLAY ATTRIBUTE(список атрибутов)
} [,...] атрибуты:
NORMAL REVERSE FORM использовать атрибуты
BOLD UNDERLINE WINDOW текущего окна
INVISIBLE BLINK
OPEN WINDOW window-name AT row, column
WITH { integer ROWS, integer COLUMNS | FORM "form-file" }
[ATTRIBUTE(список аттрибутов)]
Атрибуты: BORDER По умолчанию: нет
BOLD, DIM, INVISIBLE, NORMAL NORMAL
REVERSE, UNDERLINE, BLINK нет
PROMPT LINE n FIRST
MESSAGE LINE m FIRST + 1
FORM LINE m FIRST + 2
COMMENT LINE m LAST
CURRENT WINDOW IS { window name | SCREEN }
CLEAR {SCREEN | WINDOW window-name | FORM | список полей}
CLOSE WINDOW window-name
OPEN FORM form-name FROM "form-file" Без расширения .frm
DISPLAY FORM form-name [ATTRIBUTE(список аттрибутов)]
CLOSE FORM form-name
MESSAGE список переменных, констант [ATTRIBUTE(список атрибутов)]
ERROR список переменных, констант [ATTRIBUTE(список атрибутов)]
по умолчанию REVERSE
PROMPT список переменных и констатнт
[ATTRIBUTE(аттрибуты вывода)] FOR [CHAR] variable
[HELP help-number] # Ввести значение в variable
[ATTRIBUTE(аттрибуты ввода)] # FOR CHAR - ввести один символ
[ON KEY (key-list)
statement атрибуты: NORMAL REVERSE
. . . BOLD UNDERLINE
. . . DIM BLINK
END PROMPT] INVISIBLE
в ON KEY пункте нельзя напрямую пользоваться операторами
PROMPT, INPUT.Для их вызова применяйте функции.
DISPLAY { BY NAME список переменных |
список переменных TO {список полей|screen-record[[n]].*}[,..] |
список переменных AT row, column }
[ATTRIBUTE(список атрибутов)]
[Не стирать значений из формы перед вводом]
INPUT { BY NAME список переменных [WITHOUT DEFAULTS] |
список переменных [WITHOUT DEFAULTS] FROM
{список полей | screen-record[[n]].*}[,...]}
[ATTRIBUTE(список атрибутов)]
[HELP help-number]
[ { BEFORE FIELD подсписок полей по клавише ESC
| AFTER { FIELD подсписок полей | INPUT }
| ON KEY (key-list) }
statement . . .
[NEXT FIELD field-name]
[EXIT INPUT]
statement . . .
. . .
END INPUT ]
конструирует WHERE условие для QUERY BY EXAMPLE
CONSTRUCT {BY NAME char-variable ON column-list |
char-variable ON column-list FROM
{список полей | screen-record[[n]].*}[,...]}
[ATTRIBUTE(список атрибутов)]
В полях могут использоваться служебные символы:
символ:
пример:
назначение:
*
*X
произвольная строка
?
X?
произвольный символ
|
abc|cdef
или
>,<, >=,<=,<>
>X
:
X:YW
промежуток
..
Date..Date
промежуток между датами
call set_count(кол-во выводимых строк) в программном массиве
DISPLAY ARRAY record-array TO screen-array.*
[ATTRIBUTE(список атрибутов)]
[ ON KEY (key-list)
. . .
[EXIT DISPLAY]
. . .
END DISPLAY ] | [END DISPLAY]
SCROLL {field-list | screen-record.*} [,...} Прокрутить строки
{UP | DOWN} [BY int] в экранном массиве
call set_count(кол-во выводимых строк) в программном массиве
INPUT ARRAY record-array [WITHOUT DEFAULTS]
FROM screen-array.* [HELP help-number] [ATTRIBUTE(атр.)]
[{BEFORE {ROW | INSERT | DELETE | FIELD подсписок полей}[,...]
| AFTER {ROW|INSERT|DELETE|FIELD подсписок полей |INPUT}[,...]
| ON KEY (key-list) }
statement ...
[NEXT FIELD field-name]
statement...
[EXIT INPUT]
. . .
. . .
END INPUT ]
Внутри оператора DISPLAY ARRAY можно пользоваться функциями:
arr_curr() номер текущей строки прогр. массива
arr_count() число заполненных строки прогр. массива
scr_line() номер текущей строки экр. массива
CALL showhelp(helpnumber) - вывести help
Внимание: SCROLL cursor нельзя открывать FOR UPDATE, зато для не-SCROLL cursora можно использовать
Внимание: оператор DECLARE cursor-name должен располагаться в тексте программы выше любого использования этого курсора.
OPEN cursor-name [USING список переменных]
CLOSE cursor-name
для SELECT-курсора:
FOREACH cursor-name [INTO список переменных]
. . .
[CONTINUE FOREACH]
. . .
[EXIT FOREACH]
. . .
END FOREACH
FETCH { NEXT | PREVIOUS | FIRST | LAST | CURRRENT |
RELATIVE m | ABSOLUTE n ] cursor-name
[INTO список переменных]
если cursor not SCROLL то можно только NEXT
если строки не обнаружено, то status=NOTFOUND
для INSERT-курсора:
PUT cursor-name [FROM список переменных] ввести строку в буфер,
[заменив знаки ? для DECLAREd INSERT-st на список переменных]
FLUSH cursor-name вытолкнуть буфер
^^ SQL операторы ^^