Короткий посібник з мови Informix-4GL, Informix, Бази даних, статті

Угоди про мову 4GL і початкові поняття.

Програма мовою 4GL може складатися з декількох файлів
(Модулів) з вихідними текстами на 4GL. До неї так само відносяться
файли з описом використовуваних екранних форм, які
компілюються окремо. Ім'я кожного модуля повинно мати
розширення .4 gl (наприклад, module1.4gl), а ім'я файлу з
описом екранних форм повинно мати розширення. per (наприклад,
form2.per).

Кожен модуль містить описи змінних і кілька
процедурних блоків function (підпрограми) і report (блоки
друку). В програмі повинен бути один блок main - головний
блок, що починається з ключового слова main. На нього буде
передаватися управління при старті програми.

Формат запису операторів 4GL вільний. Можна писати все
поспіль на одному рядку, один оператор на декількох рядках,
слова операторів можна розділяти довільною кількістю
прогалин та коментарів. Ніякими значками (типу;) оператори
розділяти не потрібно. Закінчення операторів визначається за
контексту.

Весь набір ключових слів мови зарезервована, їх не можна
займати для інших цілей (на імена об'єктів і змінних 4GL).

Компілятору мови байдуже, великими або маленькими
буквами пишуться оператори. Він їх не розрізняє.

Коментарі позначаються знаками {коментар},
або знаком # - до кінця рядка,
або знаком - (два знака мінус) до кінця рядка.

Об'єкти, використовувані в Informix-4GL

1. Об'єкти SQL 2. Змінні 4GL 3. Програмні

Ім'я бази даних проста мінлива функція
Ім'я таблиці змінна типу "запис" звіт
Ім'я стовпця масив мітка
Ім'я індексу
Ім'я псевдотабліци
Ім'я синоніма

(Database-name прості змінні function)
(Table-name мінлива типу запис report)
(Column-name масиви label)
( index-name )
( view-name )
( synonim-name )

4. Імена операторів 5. Об'єкти екранного обміну.
і курсорів
window
statement-id - виготовлений оператор form
cursor-name - курсор screen-field
screen-record
screen-array

1. ІДЕНТИФІКАТОР INFORMIX.

Кожен об'єкт 4GL має ім'я (ідентифікатор) - це слово,
складається з букв, цифр, і знаків підкреслення (_),
починається з букви або знака (_). У INFORMIX-4GL НЕ
розрізняються маленькі та великі літери. Тому i_Un103Tt і
I_UN103TT - одне і теж ім'я.

2. ОБЛАСТІ ДІЇ ІМЕН ЗМІННИХ:

ЛОКАЛЬНА змінна - оголошена всередині блоку function, main,
report. Діє всередині блоку, в якому оголошена.

МОДУЛЬНІ змінна повинна бути оголошена на самому початку
модуля з вихідним текстом поза будь-якого блоку report, function або
main. Чинний всередині всього модуля (за винятком блоків, в
яких це ім'я переоб'явлено і є для них локальним).

ГЛОБАЛЬНІ змінні - оголошуються за допомогою оератора GLOBALS
на початку модулів. Діють у всіх модулях з вихідним текстом,
в яких є відповідне оголошення цих змінних.

3. Область дії імен КУРСОР і ВИГОТОВЛЕНОЇ ОПЕРАТОРІВ від
точки їх оголошення (DECLARE, PREPARE) і до кінця модуля.

4. Область дії імен ВІКОН, ФОРМ, ФУНКЦІЙ, ЗВІТІВ - У всій
програмі.

* У МОВІ 4GL Є ТАКІ ОПЕРАТОРИ *

Оператори SQL

див. окремо файл schoolsql

Організація програми
MAIN
FUNCTION
REPORT

Оголошення змінних
DEFINE
GLOBALS

Присвоєння
LET
INITIALIZE

Програмні

CALL EXIT GOTO
RETURN FOR LABLE
CASE WHILE RUN
IF CONTINUE SLEEP

Перехоплення переривань
WHENEVER
DEFER

Динамічне створення операторів

PREPARE EXECUTE FREE

Маніпуляція "курсором"
DECLARE
OPEN FOREACH PUT
CLOSE FETCH FLUSH

Екранний обмін

MENU OPEN FORM DISPLAY ARRAY
OPTIONS DISPLAY FORM SCROLL
OPEN WINDOW CLOSE FORM INPUT ARRAY
CURRENT WINDOW DISPLAY PROMPT
CLEAR INPUT ERROR
CLOSE WINDOW CONSTRUCT MESSAGE

Генерація звітів
START REPORT
OUTPUT TO REPORT
FINISH REPORT

ТИПИ ЗМІННИХ І ОПЕРАТОРИ ОПИСУ ЗМІННИХ У 4GL

У мові 4GL є прості змінні, змінні типу запис
і масиви. Прості змінні бувають наступних типів:

INTEGER CHAR(n) DATE
SMALLINT DECIMAL (m, n) DATETIME ед_врем1 TO ед_врем2
REAL MONEY (m, n) INTERVAL ед_врем1 TO ед_врем2
FLOAT
де ед_врем1, ед_врем2 - одиниці виміру часу
{YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,FRACTION(n)}

де FLOAT = DOUBLE PRECISSION

Змінна типу запис описується за допомогою конструкції
RECORD ... END RECORD або конструкції LIKE ім'я_таблиці .*

Змінна типу масив має описувач ARRAY [i, j, k] OF type,
де type - тип простий змінної, конструкція RECORD, або
конструкція ARRAY.

Для опису змінних служить оператор DEFINE:

DEFINE simw char (200), j,i,k INTEGER, ff FLOAT
# Тут оголошені символьна змінна simw довжиною 200 байт,
# Цілі i, j, k, і ff - восьмібайтовое з плаваючою точкою

DATABASE zawod
DEFINE doljno RECORD
# Оголошується запис doljno, що складається з 4 простих змінних
dolzn CHAR (20), # посаду
zarplmin LIKE kadry.zarplata,
zarplmax money (16,2), # зарплата
vakansii int # вакансії
END RECORD # Тут закінчується оголошення запису doljno
# Змінну можна о'явіть з ключовим словом LIKE column_name.
# Мінлива zarplmin отримує такий же тип, що і стовпець
# Zarplata таблиці kadry з бази даних zawod

DEFINE rrr RECORD LIKE kadry.*
# Змінну типу запис теж можна оголосити з ключовим словом
# LIKE. Тут оголошено запис rrr, що містить елементи, маю-
# Щие ті ж самі назви і ті ж самі типи що і стовпці
# Таблиці kadry

Елементами записи можуть бути масиви. Можна оголосити масив
елементів типу RECORD.

DEFINE zap RECORD
a LIKE kadry.tabnom,
b array[8] OF REAL
END RECORD,

massiw ARRAY[2,15] OF RECORD
kolwo INT,
tip CHAR(8)
END RECORD
# Massiw оголошений як масив записів. Кожна запис складається
# З двох простих елементів - kolwo і tip

Індекси масивів пишуться в квадратних дужках. На елементи
записів можна посилатися на його імені, якщо не допускається
двозначності, інакше їх необхідно уточнювати ім'ям записи,
відокремлюючи його точкою (.) від простого імені.

# Присвоїти значення елементу масива можна так:
LET massiw[1,i+2].kolwo = zap.a + LENGTH(massiw[1,i+2].tip)

Для скорочення перерахування елементів у списках можна користу-
тися нотацією (*). Наприклад, strkt .* означає всі елементи
записи strkt. А так же нотацією THRU: (елементи запису від і до)

SELECT kadry.* INTO strkt.* FROM kadry WHERE kadry.tabnom=i+j

SELECT * INTO strukt.b THRU strkt.e FROM kadry

Глобальні змінні повинні мати однакові оголошення
GLOBALS у всіх модулях програми (в яких використовуються).
Найпростіше це організується так: заводиться окремий модуль, в
якому нічого, крім оголошень GLOBALS немає. А у всіх решти
них модулях програми посилаються на цей файл. Нижче наводиться
приклад оголошення глобальних змінних у файлі progrglob.4gl:

DATABASE zawod
GLOBALS
DEFINE zap RECORD LIKE kadry.*
DEFINE ext_count INT
. . .
END GLOBALS

Тоді в інші модулі програми, де використовуються ці гло-
бальні змінні, треба включити рядок

GLOBALS "progrglob"
. . .

ПОДПРОГРАММНИЕ БЛОКИ (ФУНКЦІЇ).

У мові 4GL при програмуванні функцій (підпрограм) викорис-
зуются оператори function. Усі аргументи функції повинні бути
оголошені. Аргументи передаються за значенням. Якщо функція возв-
ращаются які-небудь значення, то при виклику її потрібно скориста-
тися в операторі CALL пропозицією RETURNING з перерахуванням
змінних, в які повертається значення. Нижче наводиться
відповідний фрагмент програми.

FUNCTION stroka(rec)
DEFINE rec RECORD i int, st char(256) END RECORD
RETURN st clipped, "автопробігу"
END FUNCTION
. . .
MAIN
. . .
CALL stroka(rec1.*) RETURNING simw
. . .
LET simw = stroka (7, "Привіт учасникам")
# Якщо функція повертає одне значення, то її ім'я мож-
# Але використовувати у виразах.
MESSAGE simw
. . .
END MAIN

На екрані користувач побачить:
+--------------------------------------------------------+
| Привіт учасникам автопробігу |
| |
| |
| |
+--------------------------------------------------------+

ПРИКЛАДИ ВИКОРИСТАННЯ ПРОГРАМНИХ ​​ОПЕРАТОРІВ

Оператор безумовного переходу діє в межах модуля.

GOTO metka
. . .
LABEL metka: . . .

Оператор вибору.

CASE
WHEN iscreen=1
current window is w1
WHEN iscreen=2
current window is w2
let iscreen=1
OTHERWISE
current window is SCREEN
END CASE

CASE (a + b) # Інший формат оператора CASE
WHEN 1
message "a=",a
WHEN 2
message "b=",b
END CASE

Умовний оператор.

IF str = "завершити" OR y <0 THEN exit program
# Не забувайте в кінці кожного умовного
# Оператора ставити END IF.
END IF

Оператор циклу.

FOR I= i1 TO 23
let a[i]=0
if b[i]=100 then
EXIT FOR
END IF
END FOR

Цикл "поки".

WHILE ff> 3 or nn = "проба"
PROMPT "Введіть число" for n
let i=n+1
message "А у мене", i, ", більше. Ви програли."
SLEEP 5
RUN "rm *" WITHOUT WAITING
END WHILE

* ДИНАМІЧНИЙ ВИГОТОВЛЕННЯ ОПЕРАТОРІВ SQL. КУРСОР *

Оператори PREPARE і EXECUTE призначені для динамічного (у
час виконання програми) виготовлення та виконання операто-
рів мови SQL (не 4GL !!!).

У наведеному нижче фрагменті у відповідь на запит користувач
зможе ввести з клавіатури рядок з оператором мови SQL
(Нехай, наприклад, він введе рядок: DROP DATABASE buhgalteriq).
Програма виготовить з цього рядка справжній оператор і виконан-
ніт його за допомогою оператора EXECUTE. Якщо при виконанні зорі-
гістрірована помилка, про що повідомить встановлений в негативний
ве значення код завершення status, користувача знову попросять
ввести оператор.

DEFINE stroka char(200)

MAIN
. . .
LABEL METK2: PROMPT "уведіть оператор мови SQL:" FOR stroka

WHENEVER ERROR CONTINUE # Включити режим "У разі
# Помилки продовжити виконання
# Програми "

PREPARE st1 FROM stroka # Виготовити оператор з
# Символьного рядка
EXECUTE st1 # Виконати виготовлений оператор
IF status<0 THEN
ERROR "помилка номер", status, "у вашому операторі"
GOTO metk2
END IF

WHENEVER ERROR STOP # Відновити режим
# "У випадку помилки перервати
# Виконання програми "
. . .
END MAIN

У системну змінну status поміщається код виконання кожного
оператора 4GL (status = 0 якщо все нормально, status <0 якщо виро-
ся помилка). Мінлива status може перевірятися після будь-якого
оператора програми і залежно від її значемогут підприємцями-
маться які-небудь дії.

Курсори

Якщо запит до таблиці повертає кілька (більше однієї)
рядків, то для їх обробки використовується так званий курсор -
покажчик у безлічі рядків, вибраних оператором SELECT. Опе-
ратором DECLARE оголошується курсор для запиту, оператором OPEN
цей запит фактично виконується і вибрані рядки виділяють-
ся. Курсор встановлюється на першу з вибраних рядків. З по-
міццю оператора FETCH ви можете брати черговий рядок, на ко-
торую вказує курсор, і поміщати її в свої програмні пере-
менниє. Курсор після цього зміщується на наступний рядок.

За допомогою конструкції циклічної FOREACH імя_курсора ... END
FOREACH можна перебрати всі рядки, обрані оператором
SELECT. Оператор OPEN в цьому випадку не потрібний.

DATABASE zawod
DEFINE zap RECORD LIKE kadry.*
DECLARE curs1 CURSOR FOR
select * from kadry where datarovd>"9/25/1973"

# В циклі FOREACH виводимо на екран всі рядки таблиці kadry,
# В яких стовпець datarovd містить дату після 25 вересня
# 1973 року.
FOREACH curs1 INTO zap .* # Беремо чергову рядок і по-
# Міщан її до запису zap
MESSAGE zap .* # Виводимо запис zap на екран
PROMPT "Ще?" FOR CHAR c
END FOREACH # Кінець циклу FOREACH

У наступному прикладі рядки обрані з таблиці kadry через
курсор curs2 поміщаються в масив z1 (але не більше 100 рядків).

DATABASE zawod
DEFINE z1 ARRAY[100] OF RECORD LIKE kadry.*, counter int

DECLARE curs2 CURSOR FOR SELECT * FROM kadry
WHERE datarovd<"9/26/1973"
OPEN curs2

FOR counter=1 TO 100

FETCH curs2 INTO z1[counter].*
# Взяти чергову рядок і помістити її в наступний елемент
# Масиву z1

IF status=NOTFOUND THEN
# Якщо вибрані терміни скінчилися, закінчити цикл
EXIT FOR
END IF

END FOR

LET counter=counter-1
MESSAGE "У масив z1 прочитано", counter, "записів"

Цей приклад демонструє ще одне використання змінної
status. Якщо оператор FETCH намагається взяти терміну з курсора
коли той вже порожній, то значення змінної status встановлювали-
ється рівним символічною константі NOTFOUND, що має значення
100. Тому можна перевіряти значення status після оператора
FETCH і якщо воно дорівнює 100, то припинити читання рядків з опус-
тевшего курсору.

У даному прикладі користувач сам повинен ввести умови, за ко-
менту, котрим будуть знайдені рядки в таблиці ceh. Він, наприклад, може
ввести: "nomerceh> 15 and nomerceh <23". Програма причепить це
умова до рядка, в якій записаний SELECT оператор, отримає
рядок "SELECT * FROM ceh WHERE nomerceh> 15 and nomerceh <23",
виготовить з неї оператор, і для цього виготовленого оператора
SELECT оголосить курсор. Далі дії аналогочни попереднього
наприклад.

DEFINE z2 ARRAY[100] OF RECORD LIKE ceh.*,
counter int, simw char(200)
PROMPT "допишіть оператор SELECT * FROM ceh WHERE" FOR simw
IF LENGTH(simw)=0 THEN
LET simw="TRUE"
END IF
LET simw="SELECT * FROM ceh WHERE ", simw CLIPPED
PREPARE st2 FROM simw
DECLARE cs2 FOR st2

let counter=1
FOREACH cs2 INTO z2[counter].*
LET counter=counter+1
IF counter>100 THEN
EXIT FOREACH
END IF
END FOREACH
LET counter=counter-1
MESSAGE "У масив z2 прочитано", counter, "записів"

* ПРОГРАМУВАННЯ ЕКРАННИХ ОБМІНУ *.

У будь-який момент часу на екрані терміналу існує ПОТОЧНИЙ
вікно, через яке і виконується введення / висновок вашої програми. З
вікном пов'язані використовувані при введенні і виведенні атрибути (напри-
заходів, green, revers, underline тощо) та номери рядків вікна, ис-
пользуемих операторами MESSAGE, PROMPT і ERROR для виводу.

При відкритті нового вікна воно стає поточним і і весь ввід /
висновок буде направлятися вже у нього.

У вікно можна вивести екранну форму, яка, представляє со-
бій набір екранних полів, що мають імена, і в ці поля (з цих
полів), звертаючись до них по імені, можна виводити (вводити) дан-
ні за допомогою оператора DISPLAY (INPUT). Екранні поля можна
об'єднувати в екранні запису. Опис екранних полів і самої
форми розташовується окремо від програми у файлі опису ек-
ранной форми.

Нижче наведено приклад програми, що ілюструє роботу з вікнами.

OPEN WINDOW wind1 AT 2,30 WITH 10 ROWS, 40 COLUMNS
ATTRIBUTE(BORDER, REVERSE, MESSAGE LINE FIRST)
# Поточним вікном є wind1

. . .
OPEN WINDOW wind2 AT 5,15 WITH FORM "schoolp"
ATTRIBUTE(GREEN,PROMPT LINE LAST,
MESSAGE LINE LAST, FORM LINE FIRST)
# Поточним вікном є wind2

CLEAR WINDOW wind1
. . .

CURRENT WINDOW IS wind1
# Поточним вікном є wind1

OPEN FORM form1 from "schoolp" # Ініціалізувати форму form1
# Взявши її опис з файлу
# schoolp.frm
DISPLAY FORM form1 # Вивести форму form1 в поточне вікно
# Тобто в wind1

В результаті роботи цих операторів на екрані терміналу
з'явиться приблизно така картинка:
+-------------------------------------------------------------+
| +----------------------------------------+ Вікно |
| | Значення дорівнює 8 | | wind1 |
| +---------------------------------------+ | | |
| | Цех [2] [ливарний] | | <- + |
| | Таб.номер [26] | | вікно |
| | Прізвище [Петров У.Е. ] | | | Wind2 |
| | Посаду [бригадир] | | | |
| | Зарплата [$ 340] |<--------+ |
| | Дата народження [31.12.1952] | | |
| | | | |
| +---------------------------------------+ | |
| | 789 | |
| +----------------------------------------+ |
| |
| Немає таких |
+-------------------------------------------------------------+

Оператори MENU. MESSAGE. PROMPT.

В результаті роботи фрагмента програми

let sta_return = podtwervdenie ("Справді вирішили закінчити?")
...
function podtwervdenie(stroka)
define stroka char(38) , kod_wozwr int

open window podtwervdenie AT 11,10 WITH 4 rows, 39 columns ATTRIBUTE (border)
display stroka at 4, 2 attribute (reverse)

menu " "
command key ("Y") "Yes" "Дійсно Так."
let kod_wozwr=1
exit menu
command key ("N", ESC) "No" "Ні, повернутися назад."
let kod_wozwr=0
exit menu
command key ("A") "Abort" "Скасувати. І закінчити."
let kod_wozwr=-1
exit menu
end menu
close window podtwervdenie
return kod_wozwr
end function

на екрані в поточному вікні з'явиться таке меню

+---------------------------------------+
| : Yes No Abort |
| Дійсно Так. |
| |
| В справді вирішили закінчити? |
+---------------------------------------+

Оператор OPTIONS

Оператор OPTIONS може встановити нові режими для введення виводи-
так, якщо вас не влаштовують задані за замовчуванням.

OPTIONS MESSAGE LINE 23,
HELP FILE "h4gl.txt", HELP KEY CONTROL-T,
DISPLAY ATTRIBUTE(REVERSE, UNDERLINE)

Оператори MESSAGE, ERROR

Оператор MESSAGE виводить рядок значень на екран на message
line. Аргументами MESSAGE можуть бути змінні і константи, але
не вираження.

let ttmm=CURRENT
message "Московський час", ttmm

error "Даних більше немає, прочитавши", n, "строк"

Оператор ERROR робить теж, що і MESSAGE, тільки зі дзвінком і
з атрибутом REVERSE. Повідомлення виводиться на 24-й рядок екрана.

Оператор PROMPT

Оператор PROMPT виводить на екран display-list - список значень
змінних і констант, і вводить після цього з клавіатури значення
ня в зазначену слідом за ключовим словом FOR змінну.

PROMPT "Так чи ні?" FOR answer
ON KEY (CONTROL-U)
LET answer=wozderv()
EXIT PROMPT
END PROMPT

Можна включити в PROMPT контрольні блоки, що виконуються при
натисканні заданих клавіш. Якщо в даному прикладі під час введення
користувач натисне клавішу CTRL-U то виконаються оператори з
ON KEY пропозиції: буде викликана функція wozderv () а потім
перерваний оператор PROMPT, не завершивши введення.

Оператори обміну з екранної формою DISPLAY і INPUT

Оператор DISPLAY виводить дані в поля екранної форми.

DISPLAY a,b,zap[i].nomerceh TO pole1,fscr.* ATTRIBUTE(BOLD)

Якщо імена виводяться змінних співпадають з іменами екранних
полів в поточній екранній формі, то можна застосувати ключове
слово BY NAME.

DISPLAY BY NAME fio, dolvnostx

Оператор INPUT використовується для введення значень через поля
екранної форми. Можна передбачити додаткові дії при
введенні. Для цього в оператор можна включити контрольні блоки
AFTER, BEFORE, ON KEY.

INPUT kadr.* FROM fio, dolvnostx, nomerceh
BEFORE FIELD nomerceh
message "Сьогодні обслуговуються цеху 5 і 6"
sleep 2
message ""
AFTER FIELD nomerceh
IF kadr.nomerceh > 6 then
MESSAGE "Немає такого цеху, повторіть"
NEXT FIELD NOMERCEH
ENF IF
END INPUT

Часто вживаний в 4GL метод виведення даних з таблиці на
екран схематично можна зобразити так:

+-Д-І-С-К ---- + курсор
| +--------+ | Оператори +---------------+
| | +-------------------> Вибрані |
| | Таблиця | | DECLARE FOR | |
| | | | SELECT-курсор | рядка |
| | | | І OPEN | |
| +--------+ | +-+-------------+
| | Операторами FETCH
| | Чи FOREACH
+------------+ |
+--V------------+
+-Т-Е-Р-М-І-Н-А-Л --------- + | програмний |
| | | Масив |
|+-----------------------+| +--+------------+
| | | | Опе | ратор DISPLAY
| | [] | | Чи | DISPLAY ARRAY
| | [Екранний] | | |
| | [Масив] <-------+
|| [ ] ||
|+-----------------------+|
+-------------------------+

Фрагмент, який реалізує віконце підказки.

Нижче наведено приклад програмування підказки (в
процесі інтерактивного діалогу) з використанням екранного
масиву. Таблиця ceh містить два стовпці: номер цеху і його
назву. У наведеному фрагменті викликається функція wyborceh,
яка виводить вміст таблиці ceh в екранний масив.
Користувач пересуває курсор на назву потрібного йому цеху і
натискає клавішу CR. Підпрограма визначає номер цеху і
повертає його викликає програмі.

DATABASE zawod
. . .
let nc= wyborceh()
. . .
FUNCTION wyborceh () # Вибір цеху, для внесення змін
DEFINE counter int
DEFINE ceharr ARRAY [25] OF RECORD # масив для зберігання
nomerceh int, # номерцеха даних з таблиці
nameceh char (20) # назва цеху ceh
END RECORD

# Відкрити вікно з рамкою і вивести в нього екранну форму cehform
OPEN WINDOW cehwind AT 4 ,6 WITH FORM "cehform"
ATTRIBUTE(BORDER)

# Оголосити курсор для вибору вмісту з таблиці ceh
DECLARE cehcurs CURSOR FOR
SELECT * FROM ceh ORDER BY nomerceh

# Виконати запит і всі вибрані рядки помістити в програм-
# Ний масив ceharr
LET counter = 0
FOREACH cehcurs INTO ceharr[counter+1].*
LET counter = counter + 1
IF counter >=25 THEN EXIT FOREACH END IF
END FOREACH
# Лічильник counter дорівнює фактичному числу рядків виданих в
# Курсор

MESSAGE "Виберіть цех та натисніть CR"

# Вивести в екранний масив cehscreen в екранній формі cehform
# Counter перших рядків з програмного масиву ceharr
call set_count(counter)
DISPLAY ARRAY ceharr TO cehscreen.*
ON KEY (CONTROL-M) EXIT DISPLAY
END DISPLAY
# Закінчити показ екранного масиву при натисканні клавіші CR

# Закрити вікно з екранної формою cehform
CLOSE WINDOW cehwind

let counter = arr_curr () # номер рядка масиву,
# На якому натиснуто CR
RETURN ceharr [counter]. Nomerceh # номер цеху,
# На якому натиснуто CR
END FUNCTION

А це користувач побачить на екрані:

+----------------------------+
| Номер цех |
| [3] [токарний] |
| [4] [гараж] |
| [5] [стайня] |
| [6] [їдальня] |
|[ ] [ ]|
| Виберіть цех та натисніть CR |
+----------------------------+

Опис і компіляція екранних форм

У наведеному вище фрагменті використана екранна форма
cehform.per. Нижче наведено її опис. Цей опис має
лежати у файлі cehform.per і повинно бути откомпилирован комп-
лятора екранних форм Informix'а form4gl.

Опис екранної форми cehform.per

DATABASE zawod
SCREEN
{
номер цех
[f00] [f001 ]
[f00] [f001 ]
[f00] [f001 ]
[f00] [f001 ]
[f00] [f001 ]
}
TABLES
ceh

ATTRIBUTES
f00 = ceh.nomerceh;
f001 = ceh.nameceh;

INSTRUCTIONS
screen record cehscreen[5] (ceh.*)
END

У секції DATABASE вказана база даних; в секції SCREEN
задана картинка, яка буде малюватися на екрані; У TABLES
вказуються таблиці, в ATRIBUTES вказуються імена екранних
полів, (і, можливо, їх атрибути) а в INSTRUCTIONS оголошений
екранний масив cehscreen в п'яти рядках з двох полів
(Nomerceh і nameceh)

Як приклад нижче наводиться функція, що реалізує
найпростіший калькулятор. Повертає значення обчисленого
вираження. Скомпілюйте її самостійно і подивіться
відладчиком, як вона працює.

function kalkulator () # Калькулятор
define wyravenie, kalkulator char(64), kolichestwo int
define stroka_kalkulatora char(200)
define beep char(1)
let beep=ascii 7
open window kalkulator at 2,2 with form "kalkulator"
attribute(border, form line first)

input by name wyravenie, kalkulator without defaults
before field kalkulator

let stroka_kalkulatora=
"select count(*),",wyravenie," from systables"

whenever error continue
prepare kalkulqtor_operator from stroka_kalkulatora
if status<0 then
display beep to kalkulator
display "Неправильне вираз" to kalkulator
next field wyravenie
end if

declare kalkulator cursor for kalkulqtor_operator

foreach kalkulator into kolichestwo, kalkulator
if status<0 then
display beep to kalkulator
display "Неправильне вираз" to kalkulator
next field wyravenie
end if
end foreach
whenever error stop

display kalkulator to kalkulator
next field wyravenie
end input

close window kalkulator
return kalkulator

end function

Використана в підпрограмі екранна форма повинна бути
описана у файлі kalkulator.per і відкомпілювати за допомогою
компілятора form4gl.

DATABASE formonly
SCREEN
{
Калькулятор. Щоб закінчити натисніть ESC
[wyravenie ]
[kalkulator ]
}
ATTRIBUTES
wyravenie =formonly.wyravenie;
kalkulator=formonly.kalkulator;
END

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*