Краткое пособие по языку INFORMIX-4GL

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

Пример программы, выдающей отчет
DATABASE zawod
MAIN
DEFINE zapisx record like kadry.*
DEFINE simw char (200), zapr char (300),fn char (18)
OPEN form maxprim from "maxprim"
DISPLAY form maxprim # вывести экранную форму
CONSTRUCT BY NAME simw ON kadry.* # Введение критериев выбора
# с экрана
LET zapr="select * from kadry where ",
simw clipped," order by tabnom "
MESSAGE simw
PREPARE selpr FROM zapr # Изготовление запроса
DECLARE qquer CURSOR FOR selpr # Объявление курсора для него
DISPLAY "Не забудьте нажать CTRL-O" AT 2,40
PROMPT "Файл, куда выводить отчет? или CR, если на экран: "
FOR fn
IF length(fn)=0 then START REPORT kadryrep # на экран
else START REPORT kadryrep TO fn # в файл
END IF
# выполнить запрос и сбросить выбранные строки в отчет
FOREACH qquer into zapisx.* # Очередную строку из курсора
OUTPUT TO REPORT kadryrep(zapisx.*) # поместить в отчет
END FOREACH
FINISH REPORT kadryrep # Вывести результаты отчета
END MAIN
REPORT kadryrep(z)
DEFINE nameceh like ceh.nameceh
DEFINE z record like kadry.*
# nomerceh int, # номер цеха
# tabnom serial, # табельн. номер
# fio char(20), # фамилия
# dolvn char(20), # должность
# zarplata money(16,2), # зарплата
# datarovd date # дата рожд.
OUTPUT
left margin 0
right margin 80
top margin 0
bottom margin 0
page length 23
ORDER BY z.nomerceh, z.tabnom # Упорядочить
FORMAT
PAGE HEADER
print "-------------------------------------------------------"
print "цех|таб.ном|фио |должность |зарплата| дата рожд"
print "_______________________________________________________"
ON EVERY ROW
print z.nomerceh using "##", column 4,z.tabnom using "#####",
column 13,z.fio clipped,
column 28,z.dolvn clipped,
column 43,z.zarplata using "$####.##",
column 53,z.datarovd using "dd-mm-yyyy"
BEFORE GROUP OF z.nomerceh
select @nameceh into nameceh from ceh where nomerceh=z.nomerceh
skip to top of page
skip 1 line
print "Цех ",nameceh
skip 1 line
AFTER GROUP OF z.nomerceh
need 2 lines
print " В цехе ",nameceh clipped,2 spaces,
group count(*) using "#####" ," человек, "
print " Средняя зарплата ",
group avg(z.zarplata) using "##### руб.## коп"
PAGE TRAILER
print "заполнена страница номер", pageno
pause "нажмите ВВОД"
END REPORT
Вот что увидит на пользователь во время работы программы:
+-------------------------------------------------------------+
|Укажите файл, куда выводить отчет, или CR, если на экран: |
| Не забудьте нажать CONTROL-О|
| |
|---------------------------------------------- |
| цех [1:4] [ ] |
| таб.номер [ ] |
| фамилия [*ов ] |
| должность [ ] |
| зарплата [>500 ] |
|дата рождения [ ] |
| |
| |
nomerceh between 1 and 4 and fio matches "*о*" and zarplata>500
| |
+-------------------------------------------------------------+
---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд
_______________________________________________________________
Цех дирекция
1 34 иванов директор $ 4000.00
1 35 кононов зав. по снабжению$ 4000.00
В цехе дирекция 2 человек,
Средняя зарплата 4000 руб.00 коп
заполнена страница номер 1
нажмите ВВОД
---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд
_______________________________________________________________
Цех литейный
2 12 окунев рабочий $ 2000.00
2 14 липко лаборант $ 2000.00
2 18 пухов мастер $ 2000.00
2 21 сухов рабочий $ 2000.00
2 24 угольков рабочий $ 2000.00
В цехе литейный 5 человек,
Средняя зарплата 2000 руб.00 коп
заполнена страница номер 2
нажмите ВВОД
---------------------------------------------------------------------------
цех|таб.ном|фио |должность |зарплата| дата рожд
_______________________________________________________________
Цех гараж
4 9 потруев слесарь $ 1230.00
4 12 гундосов шофер $ 2000.00
В цехе гараж 2 человек,
Средняя зарплата 1615 руб.00 коп
заполнена страница номер 3
нажмите ВВОД
Описание экранной формы
Описание состоит из 5 разделов: DATABASE, SCREEN, TABLES, ATTRIBUTES, INSTRUCTIONS
# база данных, с которой ведется работа
DATABASE zawod
# Картинка, которая выводится на экран.
# экранные поля обозначены так: [метка поля ]
# метка поля используется в разделе ATTRIBUТЕ
SCREEN
{
номер цеха [nceh ] зарплата [f002 ]
фамилия [fio ]
должность [dol ]
Так в экранной форме рисуется рамка.
Значок \g используется для входа и выхода в графический режим
\gp-----------------------------q\g
\g|\g Экранный массив \g|\g
\g|\g [s1 ] [s2 ] \g|\g
\g|\g [s1 ] [s2 ] \g|\g
\g|\g [s1 ] [s2 ] \g|\g
\g|\gномер цеха название цеха \g|\g
\gb-----------------------------d\g
в графическом режиме символы р q b d - | заменяются
символами рисования рамки ѓ' ѓ' ѓ" ѓ" ѓ› ѓљ
}
TABLES # имена таблиц, с которыми ассоциированна форма
kadry
ceh
ATTRIBUTES # Имена экранных полей в форме и их атрибуты.
# слева от знака (=) пишется метка поля (которая фигурирует в
# разделе SCREEN), справа - имя экранного поля, которое обычно,
# для удобства, должно совпадать с именем какого-нибудь столбца
# из таблиц, перечисленных в разделе TABLES
nceh = kadry.nomerceh;
f002 = zarplata, COLOR=REVERSE WHERE f002 >500;
# если в поле выведено значение больше 500, то оно будет
# выделено с атрибутом  REVERSЕ (негатив)
fio = fio;
dol = dolvn, comments="Проверьте наличие в штатном расписании";
s1 = ceh.nomerceh;
s2 = ceh.nameceh;
# здесь экранные поля можно
INSTRUCTIONS # объединить в экранные записи
screen record kad (kadry.nomerceh, dolvn, zarplata)
# и описать экранные массивы
screen record scr[3] (ceh.nomerceh, nameceh)
END
а вот что увидит на экране пользователь, использующий эту форму:
ѓ'ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ'
ѓљ номер цеха [ ] зарплата [f002 ] ѓљ
ѓљ фамилия [ ] ѓљ
ѓљ должность [ ] ѓљ
ѓљ Так в экранной форме рисуется рамка. ѓљ
ѓљ Значок используется для входа и выхода в графический режим ѓљ
ѓљ ѓ'ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ'
ѓљ ѓљ Экранный массив ѓљ ѓљ
ѓљ ѓљ [ ] [ ] ѓљ ѓљ
ѓљ ѓљ [ ] [ ] ѓљ ѓљ
ѓљ ѓљ [ ] [ ] ѓљ ѓљ
ѓљ ѓљ номер цеха название цеха ѓљ ѓљ
ѓљ ѓ"ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ"
ѓљ в графическом режиме символы р q b d - | заменяются ѓљ
ѓљ символами рисования рамки ѓ' ѓ' ѓ" ѓ" ѓ› ѓљ ѓљ
ѓ"ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ›ѓ
В этой экранной форме определены экранные поля: kadry.nomerceh, zarpllatа, fiо, dolvп, ceh.nomerceh, nameceh А так же экранные записи: kadrу (по умолчанию), ceh (по умолчанию), kad, scr[3]

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...