Поиск данных по различным атрибутам

Лабораторная работа

по курсу «Управление базами данных»

 

 

Выполнил: Куликов Д.А.

Группа: 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