К пункту 1. Программа работы с таблицами строится в диалоговом режиме. Пользователю предоставляется выбор различных режимов работы программы. Этот диалог программно реализуется в виде меню, вызываемых друг за другом. Данный принцип построения программы называется принципом вложенных меню.
Создадим программу, производящую моделирование и связывание таблицы (см. ЛР №1). Закончим её оператором вызова другой программы DO telef.prg, производящей поиск и редактирование записей БД и реализующей принцип вложенных меню.
Программы создаются, сохраняются, вводятся и редактируются так же, как это было указано в ЛР № 2.
Программа rel.prg ( для связывания БД ):
USE "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table1.dbf" ALIAS r1
INDEX ON телефон TO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table1-1.dbf"
SELECT 2
USE "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table2.dbf" ALIAS r2
INDEX ON телефон TO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table2-1.dbf"
SET RELATION TO телефон INTO r1
DO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 3\telef.prg"
Программа telef.prg
SET TALK OFF
SET BLINK OFF
SET PROCEDURE TO labaproc.prg
DO WHILE T.
CLEAR
@ 4,17 SAY "БД абонентов и их родственников" COLOR r+
« операторы редактирования БД абонентов, см. Л/Р N2 » CASE m2=2
« операторы редактирования БД родственников, см. Л/Р N2»
ENDCASE m2=1
CASE m=2
@ 13,38 PROMPT "По фамилии" MESSAGE "Поиск записи по фамилии"
@ 14,38 PROMPT "Po nomeru telefona" MESSAGE "Поиск записи по номеру телефона"
MENU TO m4 DO CASE m4
CASE m4=1
« операторы поиска по фамилии ( по полю Char) в БД « Абоненты » и операторы вывода номера найденной записи »
CASE m4=2
«операторы поиска по номеру телефона ( по полю Numeric ) в БД « Абоненты» и операторы вывода номера найденной записи » ENDCASE m4=1
CASE m=3
EXIT
ENDCASE
ENDDO
CLEAR
CLOSEALL
При сравнениях в программе значений переменных и полей сначала преобразуются в символы верхнего регистра командой UPPER ( ). И осуществляется отбрасывание незначащих пробелов командой ALLTRIM ( ).
К пункту 2. Осуществляя поиск по числовому полю телефон (типа Numeric) в таблице, оператор Locate будет иметь вид LOCATE FOR телефон = fno (где fno– переменная для хранения заданного номера телефона). Рассмотрим программу, реализующую поиск нужной записи в БД «Абоненты» по ключевому заданному значению. Используем для этого команду LOCATE. Поле поиска - фамилия(типа char).
PROCEDURE findfam
USE "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table1.dbf"
CLEAR
fif=SPACE(20)
@ 7,32 SAY "Поиск по фамилии" COLOR r+/b
@ 6,2 TO 10,77 DOUBLE
@ 9,20 SAY "Введите искомое значение" GET fif
READ
fif=ALLTRIM(fif)
LOCATE FOR UPPER(фамилия)=UPPER(fif)
i=14
DO WHILE FOUND()
@ i,29 SAY ALLTRIM(фамилия)+"- номер записи -" +ALLTRIM(STR(RECNO()))
i=i+1
CONTINUE
ENDDO
PROCEDURE findte
USE "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\LR № 5\table1.dbf"
CLEAR
fno=0
@ 7,32 SAY "Поиск по номеру телефона" COLOR r+/b
@ 6,2 TO 10,77 DOUBLE
@ 9,20 SAY "Введите искомое значение" GET fno PICTURE '9-999-999-99-999'
READ
LOCATE FOR телефон=fno
i=14
DO WHILE FOUND()
@ i,29 SAY телефон PICTURE '9-999-999-99-999'+"- номер записи -" + ALLTRIM(STR(RECNO()))
i=i+1
CONTINUE
ENDDO
К пункту 3. Для упрощения разработки больших по объёму программ, а также для реализации базовых принципов модульного программирования, в Visual FoxPro предусмотрена возможность декомпозиции программы на отдельные модули и процедуры. При этом отдельные части программы оформляются в виде процедур, которые хранятся в отдельном от основной программы файле. Имя файла процедур в программе указывается оператором SET PROCEDURE TO < имя процедурного файла.prg >
В процедурном файле процедуры располагаются одна за другой, при этом каждая имеет заголовок PROCEDURE < имя процедуры >. Далее идёт тело процедуры и оператор возврата RETURN.
Переменные, которые должны передаваться из процедуры вне, описываются в начале процедуры оператором PUBLIC <переменная 1>, <переменная 2 >,...
Оформить в виде процедур основные части программы, а именно:
- операторы редактирования таблицы Абоненты;
- операторы редактирования таблицы Родственники;
- операторы поиска по символьному полю;
- операторы поиска по числовому полю.
Общая программа поиска и редактирования записей в БД должна выполнять:
- открытие, индексирование и реляционное связывание таблиц.
- система вложенных меню (см. п.1 указаний), должна позволять либо редактировать (отдельно в каждой таблице), либо искать (в реляционной БД ) записи.
При построении программы необходимо использовать процедурные файлы. Приведём пример программы, которая выполняет:
- добавление записей в таблицу Абоненты и в таблицу Родственники;
- поиск по фамилии в таблице Абоненты;
- поиск по телефону в таблице Родственники.
Для анализа результатов поиска в связанных базах данных удобно использовать функцию FOUND([<область>]) - функция вырабатывает логическое значение "истина" если команда поиска (LOCATE, CONTINUE) завершилась успешно, и "ложь" в противоположном случае.
Функция действует в рабочей или указанной <области>
Программа rel.prg приведена на рис.3.1
Рис. 3.1
Текст программы telef.prg приведён ниже:
SET TALK OFF
SET BLINK OFF
SET PROCEDURE TO labaproc.prg
DO WHILE.T.
CLEAR
@ 4,17 SAY "БД абонентов и их родственников" COLOR r+
@ 1,2 TO 21,77 DOUBLE
@ 10,22 PROMPT "Редактирование" MESSAGE "Редактирование и добавление записей"
@ 10,38 PROMPT "Поиск" MESSAGE "Поиск записей"
@ 10,45 PROMPT "Выход" MESSAGE "Выход из программы"
DO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\lr № 6\showab.prg"
READ
CASE m3=2
CLEAR
SELECT b
APPEND BLANK
DO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\lr № 6\showrods.prg"
READ
ENDCASE
m3=1
ENDCASE
m1=1
CASE m=2
@ 13,38 PROMPT "По фамилии" MESSAGE "Поиск записи по фамилии"
@ 14,38 PROMPT "По номеру телефона" MESSAGE "Поиск записи по номеру телефона"
MENU TO m4
DO CASE m4
CASE m4=1
CLEAR
SELECT a
DO findfam IN "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\lr № 3\labaproc.prg"
READ
CASE m4=2
CLEAR
SELECT b
DO findte IN "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\lr № 3\labaproc.prg"
READ
ENDCASE
m4=1
CASE m=3
EXIT
ENDCASE
m1=1
ENDDO
CLEAR
Программа labaprog.prg приведена на рис.3.2.
Рис. 3.2
При возникновении проблем по выполнению программы telef.prg необходимо в программе указать полные пути к самой программе telef.prg, к программе rel.prg, а также к процедуре labaproc.prg. Для запуска программы можно пользоваться панелью задач (Program/DO).
Данная манипуляция приведена на рис. 3.3.
Рис. 3.3
В появившемся окне выбираем необходимую программу и нажимаем ОK (рис. 3.4).
Рис. 3.4
Пример выполнения начала данной программы представлен на рис. 3.5.
Так же можно в командном окне набрать команду DO:
DO "c:\documents and settings\я.xxxl\мои документы\visual foxpro projects\lr № 3\rel.prg"
Результат её выполнения представлен на рис.3.5.
Рис. 3.5
При поиске по полю фамилиянеобходимо выбрать соответствующую вкладку меню, как это показано на рис. 3.6.
Рис. 3.6
После нажатия Enter на надписи Фамилия появится окно для ввода интересующей фамилии (рис. 3.7).
Рис. 3.7
После ввода фамилии необходимо нажать Enter.
Появится результат поиска (рис. 3.8).
Рис. 3.8
Действительно, в table1одна запись, чьё поле фамилия – Бережной (рис. 3.9).
Рис. 3.9
При необходимости редактировать содержания уже имеющихся записей, следует выбрать соответствующую вкладку (рис. 3.10).
Рис. 3.10
После чего будет предоставлена возможность выбрать: в какую из таблиц будут вноситься изменения (рис. 3.11).
Рис. 3.11
Внесём изменения в поле фамилия.
На рис. 3.12 показана запись до изменения, а на рис. 3.13 после внесения изменений.
Рис. 3.12
Рис. 3.13
Убедимся в том, что изменение вступило в силу, найдя (по вышеуказанному алгоритму) изменённую фамилию (рис. 3.14).
Рис. 3.14
Действительно, изменялась первая запись.
При поиске по полю телефон необходимо выбрать соответствующую вкладку (рис. 3.15).
Рис. 3.15
Появится окно для ввода телефона (рис. 3.16).
Рис. 3.16
После ввода телефона и нажатия Enter рабочее окно приобретёт вид, указанный на рис. 3.17.
Рис. 3.17
Действительно, в таблице table2 две записи с одинаковым номером (рис. 3.18).