Поиск данных по различным атрибутам
Лабораторная работа
по курсу «Управление базами данных»
Выполнил: Куликов Д.А.
Группа: 03-217
Руководитель: Склеймин Ю.Б.
Москва, 2011г.
Содержание
Цель работы.. 3
Постановка задачи. 3
Выполнение работы.. 3
Правила ссылочной целостности. 4
Пользовательский интерфейс. 4
Описание кнопок. 5
Заключение. 8
Вывод. 8
Приложение А.. 8
Приложение В.. 12
Цель работы:
Изучение основных элементов языка FOXPRO и его применение для разработки информационных систем.
Постановка задачи: разработать информационную систему, которая могла бы послужить прототипом телефонного справочника. Создать программу, которая позволяет редактировать содержимое справочника.
Выполнение работы
Для начала определим содержание таблиц, из которых состоит проект, а также связи между таблицами.
Наша база будет содержать справочники фамилий, имен, отчеств, наименований улиц, а также сводную таблицу (дочернюю). В ней помимо данных из справочников (родительских таблиц) будут указаны номера дома, корпуса, квартиры и телефона.
Связи таблиц будем использовать типа «один-ко-многим», так как значения из родительских таблиц могут повторяться в дочерней. А для выполнения ссылочной целостности будем использовать дополнительный атрибут - первичный ключ.
Структура сводной таблицы:
cod | FAM | NAM | otch | Street | dom | flat | Telephone |
N10 | N5 | N5 | N5 | N5 | C 8 | N4 | C 12 |
|
NAM | |
cod | N5 |
name | C15 |
FAM | |
cod | N5 |
fam | C15 |
Street | |
cod | N5 |
val | C15 |
OTCH | |
cod | N5 |
val | C25 |
(См. Приложение А)
На справочники ссылаются поля:
-FAM
-NAME
-OTCH
-Street
Правила ссылочной целостности
Cascade- При изменении значений полей первичного ключа или ключа-кандидата в родительской таблице, автоматически осуществляется каскадное изменение всех соответствующих значений в дочерней таблице.
Restrict- Не позволяет изменять значения полей первичного ключа или ключа-кандидата в родительской таблице, если в дочерней таблице имеется хотя бы одна запись, содержащая ссылку на изменяемую запись.
Ignore- Позволяет изменять значения полей первичного ключа или ключа-кандидата в родительской таблице независимо от существования связанных записей в дочерней таблице. Целостность данных при этом не поддерживается
Пользовательский интерфейс
Пользовательский интерфейс представляет собой форму, в которой представлены окна для формирования критериев поиска и добавления записей, кнопки добавления и удаления записей и сама таблица результатов.
Описание кнопок
При запуске справочника мы видим заполненную таблицу результатов(полная база данных). В случае необходимости получения имеющихся данных в базе достаточно нажать кнопку «поиск» при нулевых значениях атрибутов поиска.
При работе пользователя с базой данных ему предоставлены также следующие возможности (программные коды кнопок приведены в приложении B).
1)Добавление записи в базу данных.
Примечание: при условии что в родительских таблицах уже существовали добавляемые данные (для Ф.И.О. и улицы), а номера дома, корпуса, квартиры и телефона могут быть любыми.
2) Вывод данных по интересующим параметрам (фамилия, имя, отчество и т.д.). Далее представлен запрос по фамилии, другие варианты можно посмотреть в приложении А. Запрос выполняется при нажатии кнопки «поиск».
Примечание: Параметры запроса выбираются из уже существующих, и при нажатии кнопки «поиск» отображаются в таблице результатов, которая окажется пустой при отсутствии таковой записи в базе.
3) Удаление записи из базы. При нажатии кнопки «Редактировать» высветится новая форма, в которой надо отметить строки на удаление и нажать кнопку «Удалить» уже в новой форме.
4)При необходимости пользователь может добавить фамилию, имя, отчество или улицу. Для этого на главной форме нужно нажать на соответствующую кнопку, после чего высветится новая форма(форма добавления или удаления записей из родительской таблицы).
5)Редактирование базы данных. При нажатии кнопки «Редактировать» высветится новая форма, в которой можно изменить данные любой строки и сохранить изменения нажатием кнопки «Сохранить» уже в новой форме.
6)Выходной документ(отчет) выводится при нажатии кнопки «Печать».
Заключение
В процессе выполнения работы были освоены и изучены методы объектно-ориентированного языка программирования Visual FoxPro. Была решена задача по разработке базы данных в виде телефонного справочника, содержание которого можно редактировать.
Вывод
Разработанная нами программа работает корректно, цели в изучении основных элементов языка Visual FoxPro и в его применении для обработки баз данных достигнуты, можно считать, что работа выполнена в полном объеме.
Приложение А
Связи таблиц
Поиск данных по различным атрибутам
Поиск по фамилии
Поиск по имени
Поиск по отчеству
Поиск по улице
Поиск по номеру дома
Поиск по номеру квартиры
Поиск по номеру телефона
Приложение В
1)Программный код кнопки «добавить»:
IF !empty(THISFORM.CFam.value)
IF !empty(THISFORM.CNam.value)
IF !empty(THISFORM.COTCH.value)
IF !empty(THISFORM.CSTREET.value)
IF !empty(THISFORM.DOM.value)
IF !empty(THISFORM.FLAT.value)
IF !empty(THISFORM.TELEPHONE.value)
SELECT MAIN
CALCULATE MAX(COD) TO WSP
WSP=WSP+1
DIMENSION PER_ARR(8)
PER_ARR[1]=WSP
PER_ARR[2]=FAM.COD
PER_ARR[3]=NAM.COD
PER_ARR[4]=OTCH.COD
PER_ARR[5]=STREET.COD
PER_ARR[6]=CAST(thisform.DOM.value AS INT)
PER_ARR[7]=CAST(thisform.FLAT.value AS INT)
PER_ARR[8]=thisform.TELEPHONE.value
APPEND FROM ARRAY PER_ARR
messagebox('Запись добавлена!')
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
messagebox('Заполните все поля!')
endif
thisform.Refresh
2)Программный код кнопки «удалить»:
SELECT TABLE7
DELETE
SELECT MAIN
DELETE ALL
SET DELETED on
SELECT table7
DIMENSION PER_ARR1(8)
SCAN
PER_ARR1[1]=TABLE7.COD
SELECT FAM
SCAN FOR FAM.FAM=TABLE7.FAM
PER_ARR1[2]=FAM.COD
ENDSCAN
SELECT NAM
SCAN FOR NAM.NAME=TABLE7.NAME
PER_ARR1[3]=NAM.COD
ENDSCAN
SELECT OTCH
SCAN FOR OTCH.VAL=TABLE7.OTCH
PER_ARR1[4]=OTCH.COD
ENDSCAN
SELECT STREET
SCAN FOR STREET.VAL=TABLE7.STREET
PER_ARR1[5]=STREET.COD
ENDSCAN
PER_ARR1[6]=CAST(TABLE7.DOM AS INT)
PER_ARR1[7]=CAST(TABLE7.FLAT AS INT)
PER_ARR1[8]=TABLE7.TELEPHONE
INSERT INTO MAIN FROM ARRAY PER_ARR1
SELECT TABLE7
ENDSCAN
messagebox('Записи успешно удалены')
THISFORM.Refresh
3)Программный код кнопки «поиск»:
SELECT Table7
DELETE ALL
DIMENSION PER_ARR(8)
SELECT MAIN
SCAN
SCATTER TO PER_ARR1
PER_ARR[1]=PER_ARR1[1]
SELECT FAM
SCAN FOR FAM.COD=PER_ARR1[2]
PER_ARR[2]=FAM.FAM
ENDSCAN
SELECT NAM
SCAN FOR NAM.COD=PER_ARR1[3]
PER_ARR[3]=NAM.NAME
ENDSCAN
SELECT OTCH
SCAN FOR OTCH.COD=PER_ARR1[4]
PER_ARR[4]=OTCH.VAL
ENDSCAN
SELECT STREET
SCAN FOR STREET.COD=PER_ARR1[5]
PER_ARR[5]=STREET.VAL
ENDSCAN
PER_ARR[6]=PER_ARR1[6]
PER_ARR[7]=PER_ARR1[7]
PER_ARR[8]=PER_ARR1[8]
INSERT INTO TABLE7 FROM ARRAY PER_ARR
SELECT MAIN
ENDSCAN
SELECT TABLE7
SCAN
I=0
IF (ALLTRIM(TABLE7.FAM)=ALLTRIM(THISFORM.CFam.value)) OR empty(THISFORM.CFam.value)
IF (ALLTRIM(TABLE7.NAME)=ALLTRIM(THISFORM.CNam.value)) OR empty(THISFORM.CNam.value)
IF (ALLTRIM(TABLE7.OTCH)=ALLTRIM(THISFORM.COTCH.value)) OR empty(THISFORM.COTCH.value)
IF (ALLTRIM(TABLE7.STREET)=ALLTRIM(THISFORM.CSTREET.value)) OR empty(THISFORM.CSTREET.value)
IF (ALLTRIM(TABLE7.DOM)=ALLTRIM(THISFORM.DOM.value)) OR empty(THISFORM.DOM.value)
IF (ALLTRIM(TABLE7.FLAT)=ALLTRIM(THISFORM.FLAT.value)) OR empty(THISFORM.FLAT.value)
IF (ALLTRIM(TABLE7.TELEPHONE)=ALLTRIM(THISFORM.TELEPHONE.value)) OR empty(THISFORM.TELEPHONE.value)
I=1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF I=0
DELETE
ENDIF
SELECT TABLE7
ENDSCAN
SET DELETED ON
THISFORM.Refresh
4) Программный код кнопки «Печать»:
select main
report form report1.frx noeject noconsole to printer preview
5) Программный код кнопки «Сохранить»:
SET DELETED on
SELECT main
cou=RECCOUNT()
DIMENSION k(cou,8)
cou=0
SELECT TABLE7
SCAN
cou=cou+1
i=0
k[cou,1]=CAST(table7.cod as int)
SELECT FAM
SCAN
IF FAM.FAM=ALLTRIM(TABLE7.FAM)
k[cou,2]=fam.cod
i=1
ENDIF
ENDSCAN
IF I=1
SELECT NAM
SCAN
IF NAM.NAME=ALLTRIM(TABLE7.NAME)
k[cou,3]=nam.cod
i=2
ENDIF
ENDSCAN
IF I=2
SELECT OTCH
SCAN
IF OTCH.VAL=ALLTRIM(TABLE7.OTCH)
k[cou,4]=otch.cod
I=3
ENDIF
ENDSCAN
IF I=3
SELECT STREET
SCAN
IF STREET.VAL=ALLTRIM(TABLE7.STREET)
k[cou,5]=street.cod
k[cou,6]=CAST(table7.dom as int)
k[cou,7]=CAST(table7.flat as int)
k[cou,8]=table7.telephone
I=4
ENDIF
ENDSCAN
ENDIF
ENDIF
ENDIF
IF i<>4
MESSAGEBOX('Вы ввели некорректное значение одного из параметров у пользователя №'+table7.cod)
i=5
EXIT
ENDIF
SELECT table7
ENDSCAN
IF i<>5
SELECT main
FOR coul=1 TO cou
UPDATE main SET main.fam=k[coul,2],main.name=k[coul,3],main.otch=k[coul,4],main.street=k[coul,5],main.dom=k[coul,6],main.flat=k[coul,7],main.telephone=k[coul,8] WHERE main.cod=k[coul,1]
ENDFOR
MESSAGEBOX('Данные успешно изменены и сохранены')
ENDIF
SET DELETED ON
thisform.Load
thisform.Refresh
6) Программный код кнопки «Добавить» в родительских таблицах(все коды в родительских таблицах совпадают, разница лишь в названии таблиц):
SELECT fam
SET DELETED OFF
CALCULATE MAX(COD) TO PER_MAX
PER_MAX=PER_MAX+1
DIMENSION PER_ARR(2)
PER_ARR[1]=PER_MAX
PER_ARR[2]=' '
INSERT INTO FAM FROM ARRAY PER_ARR(2)
SET DELETED ON
THISFORM.Refresh