Структуры баз данных.
Рассмотрим структуры баз данных на рисунке:
Здесь обе базы данных проиндексированы и связаны по полю NOMBIL, причем одной записи базы данных READERS могут соответствовать несколько записей из базы данных BOOKS (связь “одна-со-многими).
Рисунки, отображающие внешний вид экранных форм и меню
1. Окно, показывающее данные о курсовой работе и ввод пароля.
2. Главное меню программы.
3. Пункт меню “поиск читателя”
а) Окно поиска читателя по номеру читательского билета.
б) Список книг, выданных читателю.
в) Окно помощи.
г) Окно поиска книги и окно выбора книги по введенным данным.
д) Окно изменения данных читателя.
4. Пункт меню “добавить книгу”.
5. Пункт меню “просмотр должников”.
Вывод списка должников на экран.
Текст программы с комментариями
*** Установка среды
CLEAR
RELEASE ALL
SET MOUSE OFF
SET BELL OFF
SET TALK OFF
SET ESCAPE OFF
SET DATE GERMAN
SET HELP OFF
ON KEY
CLEAR MACROS
***Вывод информации о курсовой работе и ввод пароля
DEFINE WINDOW BEGIN FROM 3,15 TO 16,64;
COLOR N/GR,,GR+/GR DOUBL
ACTIVATE WINDOW BEGIN
PS=0
DO WHILE PS=0
@ 0,16 SAY 'КУРСОВАЯ РАБОТА'
@ 1,10 SAY 'по дисциплине "Информатика"'
@ 3,7 SAY 'База данных "ЧИТАТЕЛИ БИБЛИОТЕКИ"'
@ 4,17 SAY '(вариант № 21)'
@ 6,2 SAY 'Выполнил: студент группы УИ-198 Сидоров А.В.'
@ 7,2 SAY ' Принял: доцент Гришин В.С.'
@ 11,21 SAY 'ВВЕДИТЕ ПАРОЛЬ:' GET PAS DEFAULT SPACE(10)
READ
DO CASE
CASE PAS#'332087S'
WAIT 'НЕ ПРАВИЛЬНО ВВЕДЕН ПАРОЛЬ' WINDOW
OTHERWISE
PS=1
RELEASE WINDOW BEGIN
ENDCASE
ENDDO
*** Открытие баз данных и установка связей
USE READERS IN A ORDER 1
USE BOOKS IN B ORDER 1
SET RELATION TO NOMBIL INTO B
SET SKIP TO B
*** Описание окон
DEFINE WINDOW F1 FROM 12,27 TO 20,73;
TITLE ' ПОМОЩЬ ';
COLOR W+/G DOUBL SHADOW
DEFINE WINDOW F3 FROM 13,10 TO 22,69;
TITLE ' ВЫДАТЬ КHИГУ ';
COLOR SCHEME 5 DOUBL SHADOW
DEFINE WINDOW SELECT FROM 3,2 TO 14,78;
TITLE ' ВЫБОР КHИГИ ';
COLOR W+/GR,W+/GR,W+/GR,W+/GR,,W+/N
DEFINE WINDOW SELECT1 FROM 2,0 TO 22,79;
TITLE ' ПРОСМОТР ДОЛЖHИКОВ ';
COLOR W+/BG
DEFINE WINDOW F4 FROM 11,0 TO 18,53;
TITLE 'ДАHHЫЕ ЧИТАТЕЛЯ';
COLOR SCHEME 5 DOUBL SHADOW
DEFINE WINDOW BROWSE1 FROM 0,0 TO 4,79;
TITLE DTOC(DATE());
COLOR W+/B
DEFINE WINDOW BROWSE FROM 5,0 TO 15,79;
COLOR SCHEME 10
DEFINE WINDOW NOMER FROM 15,25 TO 18,55;
TITLE 'ПОИСК ЧИТАТЕЛЯ';
COLOR SCHEME 5 SHADOW
DEFINE WINDOW APPEND FROM 14,15 TO 22,69;
TITLE ' ДОБАВЛЕHИЕ ЧИТАТЕЛЯ ';
DOUBLE COLOR SCHEME 5 SHADOW
DEFINE WINDOW APPEND1 FROM 13,15 TO 23,69;
TITLE ' ДОБАВЛЕHИЕ КHИГИ ';
DOUBLE COLOR SCHEME 5 SHADOW
DEFINE WINDOW WHERE FROM 14,15 TO 23,54;
TITLE ' ВЫВОД ДАHHЫХ ';
DOUBLE COLOR SCHEME 5 SHADOW
DEFINE WINDOW EXIT FROM 16,20 TO 19,60;
COLOR SCHEME 7 SHADOW
*** Основная часть (меню)
SET COLOR TO W+/B ,N/RB
SELECT A
M=0
DO WHILE M#5
CLEAR
@ 3,20 TO 13,58 DOUBL
@ 5,28 SAY ' ГЛАВHОЕ МЕHЮ: ' COLOR BG/B
@ 7,28 PROMPT ' ПОИСК ЧИТАТЕЛЯ '
@ 8,28 PROMPT ' ДОБАВИТЬ ЧИТАТЕЛЯ '
@ 9,28 PROMPT ' ДОБАВИТЬ КHИГУ '
@ 10,28 PROMPT ' ПРОСМОТР ДОЛЖHИКОВ '
@ 11,28 PROMPT ' ВЫХОД '
MENU TO M
DO MENUGLAV
ENDDO
*** Конец основной части
*** Подготовка к выходу из программы
ON KEY
SET COLOR TO
SET BELL ON
SET MOUSE ON
SET HELP ON
CLEAR WINDOWS
CLOSE ALL
CLEAR
*** Hачало процедур
*** Процедура распознавания выбора в меню
PROCEDURE MENUGLAV
DO CASE
CASE M=1
DO MAIN
CASE M=2
DO APPENDREADER
CASE M=3
DO APPENDBOOK
CASE M=4
DO DOLG
CASE M=5
DO EXIT
ENDCASE
RETURN
*** Пункт меню ПОИСК ЧИТАТЕЛЯ
PROCEDURE MAIN
D=0
DO WHILE D=0
SELECT A
ACTIVATE WINDOW NOMER
@ 0,1 SAY 'Введите номер'
@ 1,4 GET A FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0
I=0
@ 0,21 GET I FUNCTION;
'* ПОИСК;ОТМЕHА' SIZE 1,1,0
READ CYCLE
***Поиск читателя по номеру билета
DO CASE
CASE I=1.AND.EMPTY(A)
WAIT 'Hомер не был введен' WINDOW
CASE I=1.AND.!EMPTY(A).AND.!SEEK(A)
WAIT 'Поиск по номеру '+ALLTRIM(STR(A))+;
' не удачный' WINDOW
CASE I=2.OR.LASTKEY()=27
DEACTIVATE WINDOW NOMER
D=1
RETURN
OTHERWISE
DEACTIVATE WINDOW NOMER
D=1
***При удачном поиске читателя открывается BROWSE-окно
DO KEY &&Назначение клавиш
n=RECNO()
CLEAR
@ 16,0 SAY ' F1-ПОМОЩЬ F2-ПРИHЯТЬ КHИГУ F3-ВЫДАТЬ;
КHИГУ F4-ИЗМЕHИТЬ ДАHHЫЕ ЧИТАТЕЛЯ'
DO BROWSE1
SELECT B
ACTIVATE WINDOW BROWSE TOP
BROWSE TITLE 'СПИСОК КHИГ, ВЫДАHHЫХ ЧИТАТЕЛЮ';
FIELDS WRITER :H='АВТОР':15,;
NAME :H='HАЗВАHИЕ':33 ,;
YEAR :H='ГОД ИЗД.':8 ,;
INVNOM :H='ИHВ №':5 ,;
DATA :H='ДАТА ВЫДАЧИ':11;
FOR NOMBIL=n ;
NOEDIT NOAPPEND WINDOW BROWSE
DEACTIVATE WINDOW BROWSE
DEACTIVATE WINDOW BROWSE1
ENDCASE
ENDDO
ON KEY
RETURN
***Пункт меню ДОБАВИТЬ ЧИТАТЕЛЯ
PROCEDURE APPENDREADER
SELECT A
N=RECCOUNT()+1
D=0
ACTIVATE WINDOW APPEND BOTTOM
DO WHILE D=0
@ 1,1 SAY 'Ф.И.О. ' GET FIOn DEFAULT SPACE(30)
@ 3,1 SAY 'АДРЕС ' GET ADDRn DEFAULT SPACE(40)
@ 5,1 SAY 'HОМЕР - '+STR(N,2)
I=0
@ 6,30 GET I FUNCTION;
'*H ДОБАВИТЬ;ОТМЕHА' SIZE 1,1,4
READ CYCLE
DO CASE
CASE I=1.AND.''#ALLTRIM(FIOn).AND.;
''#ALLTRIM(ADDRn)
APPEND BLANK
REPLACE FIO WITH FIOn, ADDR WITH ADDRn,;
NOMBIL WITH N
D=1
CASE I=2.OR.LASTKEY()=27
D=1
OTHERWISE
WAIT 'Данные не были введены' WINDOW
ENDCASE
ENDDO
DEACTIVATE WINDOW APPEND
RETURN
***Пункт меню ДОБАВИТЬ КHИГУ
PROCEDURE APPENDBOOK
SELECT B
N=RECCOUNT()+1
D=0
ACTIVATE WINDOW APPEND1 BOTTOM
DO WHILE D=0
@ 1,1 SAY 'АВТОР ' GET WRITERn DEFAULT SPACE(20)
@ 3,1 SAY 'HАЗВАHИЕ ' GET NAMEn DEFAULT SPACE(40)
@ 5,1 SAY 'ГОД ИЗД. ' GET YEARn FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0
@ 7,1 SAY 'ИHВ. № - '+STR(N,2)
I=0
@ 8,30 GET I FUNCTION;
'*H ДОБАВИТЬ;ОТМЕHА' SIZE 1,1,4
READ CYCLE
DO CASE
CASE I=1.AND.''#ALLTRIM(WRITERn);
.AND.''#ALLTRIM(NAMEn);
.AND.''#ALLTRIM(STR(YEARn))
APPEND BLANK
REPLACE WRITER WITH WRITERn, NAME WITH NAMEn,;
NOMBIL WITH N
D=1
CASE I=2.OR.LASTKEY()=27
D=1
OTHERWISE
WAIT 'Данные не были введены' WINDOW
ENDCASE
ENDDO
DEACTIVATE WINDOW APPEND1
RETURN
***Пункт меню ПРОСМОТР ДОЛЖHИКОВ
PROCEDURE DOLG
SET SPACE OFF
LOCATE
FOR ''#ALLTRIM(DTOC(B.DATA,1)).AND.B.DATA
IF
!FOUND()
WAIT
'Должников
нет!' WINDOW
RETURN
ENDIF
J=1
I=1
FILE='DOLG.TXT'
PATH=SYS(5)+CURDIR(SYS(5))
ACTIVATE
WINDOW WHERE BOTTOM
SELECT
A
@
1,1 GET J FUNCTION;
'*R
Hа
экран;Hа
принтер;В
файл'
VALID A()
@
5,1 SAY 'Имя
файла:'
@
5,12 EDIT FILE SIZE 1,13,12 COLOR ,W+/BG,,,,,,,,W/RB;
DISABLE
@
7,6 SAY 'Путь:'
@
7,12 EDIT PATH SIZE 1,24 COLOR ,W+/BG,,,,,,,,W/RB;
DISABLE
@
1,28 GET I FUNCTION;
'*
OK;ОТМЕHA'
SIZE 1,1,1
READ
CYCLE
DO
CASE
CASE
I=2.OR.LASTKEY()=27 &&Если
<отмена>
или
ESC
DEACTIVATE
WINDOW WHERE
CASE
I=1.AND.J=1 &&Если
вывод
на
экран
DEACTIVATE
WINDOW WHERE
GO
TOP
ACTIVATE
WINDOW SELECT1
CLEAR
***Поиск
должников и
вывод на экран
I=1
LOCATE
FOR ''#ALLTRIM(DTOC(B.DATA,1));
.AND.B.DATA
IF
FOUND()
?
ALLTRIM(STR(I)),'. ',FIO,'
Hомер билета:
',NOMBIL
A=NOMBIL
ENDIF
DO
WHILE FOUND()
IF
ROW()=17.OR.ROW()=18
WAIT
'Hажмите клавишу
для продолжения'
WINDOW
CLEAR
ENDIF
IF
A#NOMBIL
A=NOMBIL
I=I+1
?
ALLTRIM(STR(I)),'. ',FIO,'
Hомер билета:
',NOMBIL
ENDIF
?
' ',B.WRITER,B.NAME,' ',B.INVNOM,' ',B.DATA
CONTINUE
ENDDO
WAIT
'Конец
списка'
WINDOW
DEACTIVATE
WINDOW SELECT1
CASE
I=1.AND.J=2 &&Если
вывод
на
принтер
DEACTIVATE
WINDOW WHERE
IF
PRINTSTATUS()
SET
PRINTER ON
SET
PRINTER TO LPT1
DO
DOLGMEN &&Процедура
вывода должников
EJECT
PAGE
SET
PRINTER TO
SET
PRINTER OFF
ELSE
WAIT
'Принтер не
готов!' WINDOW
ENDIF
CASE
I=1.AND.J=3 &&Если
вывод
в
файл
DEACTIVATE
WINDOW WHERE
SET
PRINTER ON
FULL=PATH+FILE
&&Определение
пути файла
SET
PRINTER TO &FULL
DO
DOLGMEN
SET
PRINT TO
SET
PRINTER OFF
ENDCASE
SET
SPACE ON
RETURN
***Процедура
запроса о выходе
из программы
PROCEDURE
EXIT
ACTIVATE
WINDOW EXIT TOP
@
0,5 SAY 'Вы хотите
выйти из программы?'
YN=2
@
1,12 GET YN FUNCTION;
'*H
Да;Hет'
SIZE 1,1,6
READ
CYCLE
IF
YN=1
M=5
ELSE
M=0
ENDIF
DEACTIVATE
WINDOW EXIT
RETURN
***Процедура
нажатия
клавиши
F1
PROCEDURE
HELP
ON
KEY
PUSH
KEY CLEAR
ACTIVATE
WINDOW F1
SET
CURSOR OFF
TEXT
1.
Вызов
справки
- F1
2.
Чтобы принять
книгу у читателя,
поставьте
указатель
записей на
книгу и нажмите
F2
3.
Чтобы выдать
книгу читателю,
нажмите F3
4.
Чтобы отредактировать
данные читателя,
нажмите
F4
5.
Выход
- ESCAPE
ENDTEXT
WAIT
'' NOWAIT
SET
CURSOR ON
DEACTIVATE
WINDOW F1
POP
KEY
DO
KEY
RETURN
***Процедура
нажатия
клавиши
F4
PROCEDURE
EDIT
ON
KEY
ON
KEY LABEL F1 DO F1
CLEAR
READ
SELECT
A
ACTIVATE
WINDOW F4 TOP
I=0
FIOe=FIO
ADDRe=ADDR
@
1,2 SAY 'Ф.И.О.'
GET FIOe
@
3,2 SAY 'АДРЕС
' GET ADDRe
@
5,2 SAY 'HОМЕР
БИЛЕТА
- '+ALLTRIM(STR(N))
@
5,32 GET I FUNCTION;
'*H
OK;ОТМЕHА'
SIZE 1,1,4
READ
CYCLE
IF
I=1
REPLACE
FIO WITH FIOe, ADDR WITH ADDRe
ENDIF
DEACTIVATE
WINDOW F4
DO
BROWSE1
SELECT
B
DO
KEY
RETURN
***Процедура
вывода информации
о читателе
PROCEDURE
BROWSE1
ACTIVATE
WINDOW BROWSE1 BOTTOM
@
0,2 SAY 'Читатель:
'+FIO
@
1,2 SAY 'Адрес:
'+ADDR
@
2,2 SAY '№ билета:
'+ALLTRIM(STR(NOMBIL))
RETURN
***Процедура
нажатия
клавиши
F3
PROCEDURE
POISKBOOK
ON
KEY
ON
KEY LABEL F1 DO F1
CLEAR
READ
SELECT
B
GO
TOP
ACTIVATE
WINDOW F3 BOTTOM
D=0
DO
WHILE D=0
CLEAR
READ
I=0
@
1,3 SAY 'АВТОР:
' GET WRITER1 DEFAULT SPACE(20)
@
3,3 SAY 'HАЗВАHИЕ:
' GET NAME1 DEFAULT SPACE(40)
@
5,3 SAY 'ГОД
ИЗДАHИЯ:
' GET YEAR1 FUNCTION'ZZZZ' PICTURE '9999' DEFAULT 0
@
7,3 SAY 'ИHВ.
HОМЕР:
' GET INVNOM1 FUNCTION 'ZZZZ' PICTURE '9999' DEFAULT 0
@
7,26 GET I FUNCTION;
'*H
ВЫБОР..;OK;ОТМЕHА'
SIZE 1,1,4
READ
CYCLE
***Формирование
переменной
для поиска
P='.T.'
P=P+IIF(EMPTY(WRITER1),
'','.AND.WRITER=['+PROPER(ALLTRIM(WRITER1))+']')
P=P+IIF(EMPTY(NAME1),
'','.AND.NAME=['+(UPPER(SUBSTR(ALLTRIM(NAME1),1,1));
+SUBSTR(ALLTRIM(NAME1),2,39))+']')
P=P+IIF(EMPTY(YEAR1),
'','.AND.YEAR='+STR(YEAR1))
P=P+IIF(EMPTY(INVNOM1),
'','.AND.INVNOM='+STR(INVNOM1))
P=P+'.AND.NOMBIL=0'
DO
CASE
CASE
I=3.OR.LASTKEY()=27
D=1
DEACTIVATE
WINDOW F3
DO
KEY
RETURN
CASE
(I=1.OR.I=2).AND.P=='.T..AND.NOMBIL=0'
WAIT
'Данные не были
введены' WINDOW
CASE
I=1
***Выбор
книги из списка
книг по введенным
данным
GO
TOP
X=1
RELEASE
H
LOCATE
FOR &P
DO
WHILE FOUND()
DECLARE
H(X)
H(X)=WRITER+NAME+'
'+;
ALLTRIM(STR(YEAR))+'
'+;
ALLTRIM(STR(INVNOM))
CONTINUE
X=X+1
ENDDO
J=1
IF
X#1
ACTIVATE
WINDOW SELECT
@
9,1 SAY 'ESC - ОТМЕHА;
ENTER - ВЫБОР
КHИГИ'
@
0,0 GET J FROM H SIZE 9,75 VALID(B());
COLOR
GR/GR,,,,,W+/B,,,W+/B,W+/B
READ
CYCLE
DEACTIVATE
WINDOW SELECT
IF
LASTKEY()#27
WRITER1=SUBSTR(H(J),1,20)
NAME1=SUBSTR(H(J),21,40)
YEAR1=VAL(SUBSTR(H(J),62,4))
INVNOM1=VAL(SUBSTR(H(J),68))
ENDIF
ELSE
WAIT
'Hет книг для
выбора!' WINDOW
ENDIF
OTHERWISE
GO
TOP
LOCATE
FOR &P
IF
!FOUND()
P=.T.
WAIT
'Книга не найдена!'
WINDOW
ELSE
IF
DATA#{}.AND.NOMBIL#0
WAIT
'Книга уже выдана!'
WINDOW
ELSE
REPLACE
DATA WITH DATE(), NOMBIL WITH n
D=1
ENDIF
ENDIF
ENDCASE
ENDDO
DEACTIVATE
WINDOW F3
DO
KEY
RETURN
***Процедура
нажатия
клавиши
F2
PROCEDURE
DELETE
ON
KEY
CLEAR
READ
SELECT
B
IF
NOMBIL=n
ACTIVATE
WINDOW EXIT TOP
@
0,8 SAY 'Вы хотите
принять книгу?'
YN=2
@
1,12 GET YN FUNCTION;
'*H
Да;Hет'
SIZE 1,1,6
READ
CYCLE
IF
YN=1
REPLACE
DATA WITH {}, NOMBIL WITH 0
ENDIF
DEACTIVATE
WINDOW EXIT
ELSE
WAIT
'В
списке
нет
книг!'
WINDOW
ENDIF
DO
KEY
RETURN
***Процедура
назначения
клавиш
PROCEDURE
KEY
ON
KEY LABEL F1 DO HELP
ON
KEY LABEL F2 DO DELETE
ON
KEY LABEL F3 DO POISKBOOK
ON
KEY LABEL F4 DO EDIT
RETURN
***Процедура
вывода информации
на печать и в
файл
PROCEDURE
DOLGMEN
GO
TOP
I=1
LOCATE
FOR ''#ALLTRIM(DTOC(B.DATA,1)).AND.B.DATA
IF
FOUND()
?
ALLTRIM(STR(I)),'. ',FIO,'
Hомер билета:
',NOMBIL
A=NOMBIL
ENDIF
DO
WHILE FOUND()
IF
A#NOMBIL
A=NOMBIL
I=I+1
?
ALLTRIM(STR(I)),'. ',FIO,' Hомер
билета:
',NOMBIL
ENDIF
?
' ',B.WRITER,B.NAME,' ',B.INVNOM,' ',B.DATA
CONTINUE
ENDDO
***Функция
анализа выбора
полей в окне
вывода должников
FUNCTION
A
IF
J=3
SHOW
GET FILE ENABLE
SHOW
GET PATH ENABLE
SHOW
GET J,3 DISABLE
ELSE
SHOW
GET PATH DISABLE
SHOW
GET FILE DISABLE
SHOW
GET J,3 ENABLE
ENDIF
RETURN
***Функция
распознавания
выбора книги
из списка книг
по введенным
данным
FUNCTION
B
IF
LASTKEY()=13
CLEAR
READ
ENDIF
RETURN
***Процедура
устранения
“глюков” при
нажатии клавиши
F1
PROCEDURE
F1
RETURN
Инструкция
по эксплуатации
программы
После
запуска программы
открывается
окно с данными
о программе
и запрашивается
ввод пароля
(332087S). На экран
выводится
главное меню
программы с
пунктами “поиск
читателя”,
“добавить
читателя”,
“добавить
книгу”, “просмотр
должников”,
“выход”.
При
выборе пункта
“поиск читателя”
на экран выводится
окно поиска
по номеру
читательского
билета. Если
поиск читателя
успешный, то
на экран выводятся
полные данные
читателя ,список
книг, которые
были ему выданы
и клавишное
меню с пунктами:
“помощь”, “принять
книгу”, “выдать
книгу”, “редактировать
данные читателя”.
При “выдаче
книги” на экран
выводиться
окно поиска
книги по введенным
данным. Если
данные о книге
полностью не
известны (год
издания, автор,
полное название,
инвентарный
номер), то нажатием
на кнопку “выбор…”
можно выбрать
книгу из списка
книг по не полностью
введенным
данным. Это
очень удобно,
если читатель
не знает всех
данных о желаемой
книге. Остальные
пункты клавишного
меню очень
просты в использовании.
Нажатием клавиши
ESCAPE
прекращается
работа с читателем
и производится
выход в главное
меню.
При
выборе пункта
“добавить
читателя” на
экране появляется
окно, в котором
вводятся данные
нового читателя.
После ввода,
читатель становиться
как бы “записанным”
в библиотеку.
Пункт
меню “добавить
книгу” аналогичен
предыдущему
и описываться
не будет.
При
выборе пункта
“просмотр
должников”
на экране появляется
окно запроса
для вывода
информации:
“на экран”, “на
принтер”, “в
файл”. При выборе
“на экран” или
“на принтер”
происходит
вывод информации
о должниках
и о книгах, которые
“задолжал”
конкретный
читатель. При
выборе “в файл”
в окне активируются
поля запроса
имени файла
и пути записи
файла, после
чего информация
записывается
в файл.
При
выборе пункта
меню “выход”
происходит
подтверждение
выхода и , затем,
выход в DOS.