close

Вход

Забыли?

вход по аккаунту

?

12 вариант (2)

код для вставкиСкачать
Содержание
Задание ........................................................................................ 2
1. Разработка базы данных .................................................................3
1.1. Проектирование базы данных .......................................................3
1.2. Структура базы данных ............................................................. 5
1.3. Структура таблиц базы данных ....................................................5
2. Разработка программы ................................................................. 7
2.1. Интерфейс программы .............................................................. 7
2.2. Код программы ....................................................................... 9
3. Заключение ................................................................................25
Литература ....................................................................................26
Приложение ....................................................................................27
Задание
Медицинское учреждение (поликлиника) ведёт учёт пациентов (больных) и диагнозов, установленных каждому пациенту. Для каждого пациента нужно знать фамилию, имя, отчество, доту рождения, пол. Каждый диагноз, который может быть установлен, относится к одной из нескольких групп болезней. Каждому пациенту может быть установлено до двадцати диагнозов. Причем диагнозы могут относиться как к одной группе, так и к разным. Может быть несколько диагнозов, относящихся к одной группе болезней. Список болезней в группе и сам список групп болезней могут пополняться.
Нужно иметь возможность пополнять список пациентов и изменять перечень диагнозов каждого пациента. При предъявлении данных на пациента в экранной форме должны быть показаны и все его диагнозы. Ввод нового диагноза пациенту должен производиться выбором из списка болезней нужной группы. Нужно иметь возможность найти в БД любого пациента.
Дополнительно для каждого пациента фиксируется адрес (улица, дом, квартира).
Поликлиника ведёт статистическую обработку сведений о пациентах и болезнях. Для этой цели каждый пациент должен быть отнесён к одной из двенадцати возрастных групп. Возрастная группа пациента определяется на момент обработки данных по дате рождения.
Обработка данных должна дать следующие сведения:
1. Общее количество пациентов;
2. Количество диагнозов данной группы болезней и в процентах к общему количеству диагнозов;
3. Список пациентов данного пола и данной возрастной группы с данным диагнозом;
4. Количество пациентов данного пола и данной возрастной группы с данным диагнозом и в процентах к общему количеству пациентов данного пола;
5. Количество пациентов данного пола и данной возрастной группы с диагнозами данной группы болезней и в процентах к общему количеству пациентов данного пола с диагнозами данной группы болезней.
Статистические сведения должны оформляться в виде отчёта, который можно посмотреть на экране и распечатать.
Приложение: Пол М Ж.
Возрастные группы
0-4, 5-9, 10-14, 15-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-89, 90-99 лет.
Группы болезней и болезни
1. ОТЛОЖЕНИЕ СОЛЕЙ: 1. ИБС. 2. Гипертония. 3. Остеохондроз. 4. Полиартрит. 5. Камни в почках. 6. Камни в печени. 7. Диабет. 8.Сосуды периферические. 9. Аллергия.
2. ГОРМОНАЛЬНЫЙ БАЛАНС: 1. Нарушение щитовидки (зоб). 2. Нарушение месячных. 3. Бесплодие. 4. Мастопатия. 5. Фибриома. 6. Эндомитриоз. 7. Кисты, узлы, полипы.
3. ЖЕЛУДОЧНО-КИШЕЧНЫЙ ТРАКТ: 1. Гастрит, колит. 2. Язва, язвенный колит. 3. Геморрой. 4. Трещина ануса. 5. Цирроз. 4. ВНУТРИЧЕРЕПНОЕ ДАВЛЕНИЕ: 1. ЧПЗ. 2. Судорожный синдром. 5. СИСТЕМА ДЫХАНИЯ: 1. Бронхиальная астма. 2. Пневмонии. 3. Хр. Бронхиты.
1. Разработка базы данных
1.1. Проектирование Базы данных
В БД хранятся сведения о пациентах поликлиники. Каждому пациенту может быть установлено несколько диагнозов. Причем диагнозы могут относиться как к одной группе, так и к разным. Может быть несколько диагнозов, относящихся к одной группе болезней.
Диаграмма ER-типа для всех сущностей и связей, полученных на базе из инфологического описания предметной области:
№ВОЗРАСТА
№ПОЛИСА №БОЛЕЗНИ № ГРУППЫ Набор предварительных отношений, созданный с помощью диаграммы ER-типа:
* Для связи m:n всегда формируется 3-и отношения.
По одному для каждой сущности и одно для связи, причём среди атрибутов отношения для связи должны быть ключи обеих сущностей.
1. ПАЦИЕНТ (№ПОЛИСА, №ВОЗРАСТА, ФИО, ДАТА_РОЖЕДНИЯ, ПОЛ, УЛИЦА, ДОМ, КВАРТИРА )
2. БОЛЕЗНЬ (№БОЛЕЗНИ, НАЗВ_БОЛЕЗНИ, №ГРУППЫ)
3. ПАЦИЕНТ_БОЛЕЗНЬ (№ПОЛИСА, №БОЛЕЗНИ)
* Для связи q:1 при обязательном вхождении q-связной сущности создаются 2-а отношения. По одному для каждой сущности.
1. БОЛЕЗНЬ (№БОЛЕЗНИ, НАЗВ_БОЛЕЗНИ, №ГРУППЫ)
2. ГРУППА (№ГРУППЫ, НАЗВ_ГРУППЫ)
* Для связи d:1 при обязательном вхождении d-связной сущности создаются 2-а отношения. По одному для каждой сущности.
1. ПАЦИЕНТ (№ПОЛИСА, №ВОЗРАСТА, ФИО, ДАТА_РОЖЕДНИЯ, ПОЛ, УЛИЦА, ДОМ, КВАРТИРА )
2. ВОЗРАСТНАЯ_ГРУППА (№ВОЗР_ГРУППЫ, НАЗВ_ВОЗР_ГРУППЫ)
Всего шесть отношений, но, т.к. отношения БОЛЕЗНЬ и ВОЗРАСТНАЯ_ГРУППА относится к обеим связям, то получаем пять отношений:
1. ПАЦИЕНТ (№ПОЛИСА, №ВОЗРАСТА, ФИО, ДАТА_РОЖЕДНИЯ, ПОЛ, УЛИЦА, ДОМ, КВАРТИРА )
2. БОЛЕЗНЬ (№БОЛЕЗНИ, НАЗВ_БОЛЕЗНИ, №ГРУППЫ)
3. ПАЦИЕНТ_БОЛЕЗНЬ (№ПОЛИСА, №БОЛЕЗНИ)
4. ГРУППА (№ГРУППЫ, НАЗВ_ГРУППЫ)
5. ВОЗРАСТНАЯ_ГРУППА (№ВОЗР_ГРУППЫ, НАЗВ_ВОЗР_ГРУППЫ)
Функциональные зависимости:
Составной ключ:
Из приведённых функциональных зависимостей: В каждом из отношений имеется один детерминант, который и является возможным ключом. Все атрибуты присутствуют в созданных отношениях. Следовательно, все отношения находятся в нормальной форме Бойса-Кодда. 1.2. Структура базы данных
Таблица 1.
Название таблицыИмя файлаСодержаниеПациентPacient.dbСведения о пациентах поликлиникиБолезньBolezn.dbПеречень болезнейПациент_БолезньPolis_bolezn.dbПривязка пациентов к болезнямВозрастная_группаVozrast.dbПеречень возрастных группГруппаGruppa.dbПеречень групп болезней
1.3. Структура таблиц базы данных
Отношение "Пациент" Таблица 2.
Имя поляТип
данныхДлинаПервичный ключИндексФункциональное назначениеINomer_polisaLong Integer+Номер страхового полиса пациентаCFIOAlpha40+ФИО пациентаNNomer_vozrastaShortКод возрастной группыCYlizaAlpha20Название улицы, где живёт пациентCDomAlpha3Номер дома пациентаCKvartiraAlpha3Номер квартиры пациентаDData_rogdeniaDateДата рождения пациентаCPolAlpha9Пол пациента
Функциональные зависимости:
Отношение "Болезнь" Таблица 3.
Имя поляТип
данныхДлинаПервичный ключИндексФункциональное назначениеNNomer_bolezni+
(Autoincrement)+Номер болезниCNazvanie_bolezniAlpha25+Название болезниNNomer_gruppiShort+Номер группы болезней
Функциональная зависимость:
Отношение "Пациент_Болезнь" Таблица 4.
Имя поляТип
данныхДлинаПервичный ключИндексФункциональное назначениеINomer_polisaLong Integer++Номер полисаNNomer_bolezniShort++Номер болезни
Функциональная зависимость (составной ключ):
Отношение "Группа" Таблица 5.
Имя поляТип
данныхДлинаПервичный ключИндексФункциональное назначениеNNomer_gruppi+
(Autoincrement)+Номер группы болезнейCNazv_gruppiAlpha25+Название группы болезней
Функциональная зависимость:
Отношение "Возрастная_группа" Таблица 6.
Имя поляТип
данныхДлинаПервичный ключИндексФункциональное назначениеNNomer_vozrastaShort+Номер возрастной группы CVozrastAlpha5+Название возрастной группы Функциональная зависимость:
2. Разработка программы
2.1. Интерфейс программы
Программа оснащена главной формой (рис. 1), с помощью которой можно перемещаться в любой раздел программы с помощью кнопок:
- список пациентов
- список болезней и групп болезней
- отчеты: 1) Список пациентов
2) Количество пациентов с данным диагнозом
3) Количество пациентов данного возраста с данной группой болезни
4) Количество диагнозов данной группы болезней
5) Количество пациентов данного пола с данным диагнозом
Рис. 1
При нажатии на кнопке главного меню "Список пациентов" появится форма (рис 2).
На этой форме можно заносить новых пациентов и изменять записи уже внесенных пациентов. Здесь содержаться общие сведения о пациентах клиники со списком диагнозов. Поиск осуществляется по ФИО пациента. Каждый пациент может иметь не более 20 диагнозов.
Рис. 2
При нажатии на кнопке главного меню "Список болезней и групп болезней" появится форма (рис 3).
Список болезней и групп болезней может пополняться, изменяться, удаляться (CTRL+DEL). В каждой группе может быть несколько болезней. Рис. 3
Все отчеты представлены в ПРОЛОЖЕНИИ.
2.2. Код программы
Текст программы:
Форма "Главное меню" (рис. 1).
unit UMenu;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus, Grids, DBGrids, DB, DBTables;
type
TMenu = class(TForm)
LabelSpBoleznPac: TLabel;
LabelGrBolezni: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
NPacientBolezn: TMenuItem;
NKolPacient: TMenuItem;
NGrKolPac: TMenuItem;
NDiagGr: TMenuItem;
NPacPol: TMenuItem;
procedure LabelSpBoleznPacClick(Sender: TObject);
procedure LabelGrBolezniClick(Sender: TObject);
procedure NPacientBoleznClick(Sender: TObject);
procedure NKolPacientClick(Sender: TObject);
procedure NGrKolPacClick(Sender: TObject);
procedure NDiagGrClick(Sender: TObject);
procedure NPacPolClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Menu: TMenu;
implementation
uses UGrBolezni,UPacientBolezn, UOtchetPacientBolezn, UOtchetKolPacient,
UOtchetGrKolPacVozr, UOtchetGrDiagn, UOtchetPacient;
{$R *.dfm}
{Кнопка "Список пациентов"}
procedure TMenu.LabelSpBoleznPacClick(Sender: TObject);
begin
if Pacienti=nil then Pacienti:=tPacienti.Create(self);
Pacienti.ShowModal;
end;
{Кнопка "Список болезней и групп болезней"}
procedure TMenu.LabelGrBolezniClick(Sender: TObject);
begin
if Bolezni=nil then Bolezni:=tBolezni.Create(self);
Bolezni.ShowModal;
end;
{Кнопка "Количество пациентов с данным диагнозом"}
procedure TMenu.NPacientBoleznClick(Sender: TObject);
begin
if OtchetPacientDiagn=nil then OtchetPacientDiagn:=tOtchetPacientDiagn.Create(self);
with OtchetPacientDiagn do begin
QueryKolPac.Close;
QueryKolPac.SQL.Clear;
QueryKolPac.SQL.Add('select count(CFIO) as kolich');
QueryKolPac.SQL.Add('from Pacient');
QueryKolPac.open;
QueryBoleznKolPac.Close;
QueryBoleznKolPac.SQL.Clear;
QueryBoleznKolPac.SQL.Add('select B.CNazvanie_bolezni as bolezn,count(P.CFIO) as kol');
QueryBoleznKolPac.SQL.Add('from Pacient P,Bolezn B,Polis_bolezn PB');
QueryBoleznKolPac.SQL.Add('where B.NNomer_bolezni=PB.NNomer_bolezni AND PB.INomer_polisa=P.INomer_polisa');
QueryBoleznKolPac.SQL.Add('Group By B.CNazvanie_bolezni');
QueryBoleznKolPac.open;
QueryBoleznKolPac.Active:=true;
QueryKolPac.Active:=true;
QuickRepBolKolPac.Preview;
end;
end;
{Кнопка отчетов "Общее количество пациентов"}
procedure TMenu.NKolPacientClick(Sender: TObject);
begin
if OtchetKolPacient=nil then OtchetKolPacient:=tOtchetKolPacient.Create(self);
with OtchetKolPacient do begin
QueryKolPacient.Active:=true;
QuickRepKolPacient.Preview;
end;
end;
{Кнопка отчетов "Количество пациентов данного возраста с данной группой болезни"}
procedure TMenu.NGrKolPacClick(Sender: TObject);
begin
if OtchetGrKolPac=nil then OtchetGrKolPac:=tOtchetGrKolPac.Create(self);
with OtchetGrKolPac do begin
QueryKolPac1.Close;
QueryKolPac1.SQL.Clear;
QueryKolPac1.SQL.Add('select count(CFIO) as kolich1');
QueryKolPac1.SQL.Add('from Pacient');
QueryKolPac1.open;
QueryGrKolPacVozr.Close;
QueryGrKolPacVozr.SQL.Clear;
QueryGrKolPacVozr.SQL.Add('select V.CVozrast as vozr,G.CNazv_gruppi as gruppa,count(P.CFIO) as kol');
QueryGrKolPacVozr.SQL.Add('from Pacient P,Gruppa G,Polis_bolezn PB,Bolezn B,Vozrast V');
QueryGrKolPacVozr.SQL.Add('where B.NNomer_bolezni=PB.NNomer_bolezni AND PB.INomer_polisa=P.INomer_polisa AND B.NNomer_gruppi=G.NNomer_gruppi AND V.NNomer_vozrasta=P.NNomer_vozrasta');
QueryGrKolPacVozr.SQL.Add('Group By V.CVozrast,G.CNazv_gruppi');
QueryGrKolPacVozr.open;
QueryKolPac1.Active:=true;
QueryGrKolPacVozr.Active:=true;
QuickRepGrKolPacVozr.Preview;
end;
end;
{Кнопка отчетов "Количество диагнозов данной группы болезней"}
procedure TMenu.NDiagGrClick(Sender: TObject);
begin
if OtchetGrDiagn=nil then OtchetGrDiagn:=tOtchetGrDiagn.Create(self);
with OtchetGrDiagn do begin
QueryGrDiagn.Close;
QueryGrDiagn.SQL.Clear;
QueryGrDiagn.SQL.Add('select G.CNazv_gruppi as gruppa,count(B.CNazvanie_bolezni) as kol');
QueryGrDiagn.SQL.Add('from Gruppa G,Bolezn B');
QueryGrDiagn.SQL.Add('where B.NNomer_gruppi=G.NNomer_gruppi ');
QueryGrDiagn.SQL.Add('Group By G.CNazv_gruppi');
QueryGrDiagn.open;
QueryKolbol.Close;
QueryKolbol.SQL.Clear;
QueryKolbol.SQL.Add('select count(CNazvanie_bolezni) as kolbol');
QueryKolbol.SQL.Add('from Bolezn');
QueryKolbol.open;
QueryGrDiagn.Active:=true;
QueryKolbol.Active:=true;
QuickRepGrDiagn.Preview;
end;
end;
{Кнопка отчетов "Количество пациентов данного пола с данным диагнозом"}
procedure TMenu.NPacPolClick(Sender: TObject);
begin
if OtchetPacientPol=nil then OtchetPacientPol:=tOtchetPacientPol.Create(self);
with OtchetPacientPol do begin
QueryPacPol.Close;
QueryPacPol.SQL.Clear;
QueryPacPol.SQL.Add('select B.CNazvanie_bolezni as bolezn,P.CPol as pol,count(P.CFIO) as kol,B.NNomer_bolezni as nombol');
QueryPacPol.SQL.Add('from Pacient P,Bolezn B,Polis_bolezn PB');
QueryPacPol.SQL.Add('where B.NNomer_bolezni=PB.NNomer_bolezni AND PB.INomer_polisa=P.INomer_polisa');
QueryPacPol.SQL.Add('Group By B.CNazvanie_bolezni, P.CPol,B.NNomer_bolezni');
QueryPacPol.open;
QueryKolPacBol.Close;
QueryKolPacBol.SQL.Clear;
QueryKolPacBol.SQL.Add('select B.CNazvanie_bolezni as bolezn,count(P.CFIO) as kolpac,B.NNomer_bolezni as nomer');
QueryKolPacBol.SQL.Add('from Pacient P,Bolezn B,Polis_bolezn PB');
QueryKolPacBol.SQL.Add('where B.NNomer_bolezni=PB.NNomer_bolezni AND PB.INomer_polisa=P.INomer_polisa');
QueryKolPacBol.SQL.Add('Group By B.CNazvanie_bolezni,B.NNomer_bolezni');
QueryKolPacBol.open;
QueryPacPol.Active:=true;
QueryKolPacBol.Active:=true;
QuickRepPol.Preview;
end;
end;
Форма "Список пациентов" (рис.2).
Запрос: select P.INomer_polisa as polis,count(PB.INomer_polisa) as kolpol
from Pacient P,Polis_bolezn PB
where P.INomer_polisa=PB.INomer_polisa
Group By P.INomer_polisa
Код:
unit UPacientBolezn;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, Mask, DBCtrls, Buttons;
type
TPacienti = class(TForm)
DSPacient: TDataSource;
DSBolezn: TDataSource;
DSPolis_bolezn: TDataSource;
DSVozrast: TDataSource;
DatabasePacient: TDatabase;
TPacient: TTable;
TBolezn: TTable;
TPolis_bolezn: TTable;
TVozrast: TTable;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
DBGridPolisBolezn: TDBGrid;
TPacientINomer_polisa: TIntegerField;
TPacientCFIO: TStringField;
TPacientNNomer_vozrasta: TSmallintField;
TPacientCYliza: TStringField;
TPacientCDom: TStringField;
TPacientCKvartira: TStringField;
TBoleznNNomer_bolezni: TSmallintField;
TBoleznCNazvanie_bolezni: TStringField;
TBoleznNNomer_gruppi: TSmallintField;
TPolis_bolezncBolezn: TStringField;
TPacientcVozrast: TStringField;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBFIO: TDBEdit;
DBNomerPolisa: TDBEdit;
DBDom: TDBEdit;
DBKvartira: TDBEdit;
DBYliza: TDBEdit;
Label6: TLabel;
GroupBoxPanel: TGroupBox;
BFirst: TButton;
BPrior: TButton;
BNext: TButton;
BLast: TButton;
BInsert: TButton;
BEdit: TButton;
BPost: TButton;
BDelete: TButton;
BitBtnPoisk: TBitBtn;
EditPoisk: TEdit;
Label7: TLabel;
TPacientCPol: TStringField;
DBComboBoxPol: TDBComboBox;
QueryPredel: TQuery;
DBEditRogdenie: TDBEdit;
Label8: TLabel;
TPacientDData_rogdenia: TDateField;
TPolis_boleznINomer_polisa: TIntegerField;
TPolis_boleznNNomer_bolezni: TSmallintField;
DBLookupComboBoxVozrast: TDBLookupComboBox;
procedure FormActivate(Sender: TObject);
procedure BFirstClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BInsertClick(Sender: TObject);
procedure BEditClick(Sender: TObject);
procedure BPostClick(Sender: TObject);
procedure BDeleteClick(Sender: TObject);
procedure BPriorClick(Sender: TObject);
procedure BNextClick(Sender: TObject);
procedure BLastClick(Sender: TObject);
procedure EditPoiskChange(Sender: TObject);
procedure DBGridPolisBoleznExit(Sender: TObject);
procedure TPolis_boleznBeforePost(DataSet: TDataSet);
procedure TPolis_boleznAfterDelete(DataSet: TDataSet);
procedure TPolis_boleznAfterPost(DataSet: TDataSet);
procedure TPolis_boleznBeforeDelete(DataSet: TDataSet);
procedure TPolis_boleznBeforeInsert(DataSet: TDataSet);
procedure DBNomerPolisaEnter(Sender: TObject);
private
{ Private declarations }
procedure Buttons(nextt,prior,first,last,insert,save,edit,del:boolean);
public
{ Public declarations }
end;
var
Pacienti: TPacienti;
implementation
{$R *.dfm}
{При активизации формы подключаются все НД}
procedure TPacienti.FormActivate(Sender: TObject);
begin
TPacient.Active:=true;
TBolezn.Active:=true;
TPolis_bolezn.Active:=true;
TVozrast.Active:=true;
QueryPredel.Active:=true;
TPacient.FindFirst;
Buttons(true,true,true,true,true,false,true,true);
DBComboBoxPol.ReadOnly:=true;
end;
{Кнопка "Первая"}
procedure TPacienti.BFirstClick(Sender: TObject);
begin
With TPacient do first;
Buttons(true,true,true,true,true,false,true,true);
if TPacient.bof=true then begin
Buttons(true,false,false,true,true,false,true,true);
end;
end;
{При закрытии формы все НД отключаются. Если есть не сохраненные данные, то они сохраняются}
procedure TPacienti.FormClose(Sender: TObject; var Action: TCloseAction);
begin
with TPolis_bolezn do
if (State=dsedit)or(State=dsinsert) then
begin
TPolis_bolezn.Post;
TPolis_bolezn.Close;
end
else
TPolis_bolezn.Close;
with TPacient do
if (State=dsedit)or(State=dsinsert) then
if messagedlg('Сохранить изменения в карточке больного?',mtwarning,[mbOK,mbCancel],0)=mrOK then
begin
TPacient.Post;
TPacient.Close;
end
else
TPacient.Close;
TBolezn.Close;
TVozrast.Close;
QueryPredel.Close;
end;
{Процедура кнопок управления для уменьшения кода программы}
procedure TPacienti.Buttons(nextt,prior,first,last,insert,save,edit,del:boolean);
begin
with Pacienti do begin
BNext.Enabled:=nextt;
BPrior.Enabled:=prior;
BFirst.Enabled:=first;
BLast.Enabled:=last;
BInsert.Enabled:=insert;
BPost.Enabled:=save;
BEdit.Enabled:=edit;
BDelete.Enabled:=del;
end;
end;
{Перед сохранением в табл. "Polis_bolezn" нужно подтвердить или отменить сохранение}
procedure TPacienti.TPolis_boleznBeforePost(DataSet: TDataSet);
begin
with TPolis_bolezn do
if (State=dsedit)or(State=dsinsert) then
if messagedlg('Записать изменения в таблицу "болезней пациента"?',mtwarning,[mbOK,mbCancel],0)=mrCancel then
begin
TPolis_bolezn.cancel;
TPolis_bolezn.prior;
TPolis_bolezn.next;
Abort;
end;
end;
{После удаления из табл. "Polis_bolezn" обновление НД}
procedure TPacienti.TPolis_boleznAfterDelete(DataSet: TDataSet);
begin
TPolis_bolezn.Refresh;
end;
{После сохранения в табл. "Polis_bolezn" обновление НД}
procedure TPacienti.TPolis_boleznAfterPost(DataSet: TDataSet);
begin
TPolis_bolezn.Refresh;
TPolis_bolezn.Last;
end;
{Перед удалением из табл. "Polis_bolezn" нужно подтвердить или отменить удаление}
procedure TPacienti.TPolis_boleznBeforeDelete(DataSet: TDataSet);
begin
if messagedlg('Удалить запись в полисе больного?',mtwarning,[mbOK,mbCancel],0)=mrCancel then
abort else
ShowMessage('Информация о полисе больного удалена!');
end;
{Перед сохранением в табл. "Polis_bolezn" нужно подтвердить или отменить сохранение}
procedure TPacienti.BInsertClick(Sender: TObject);
begin
if TPacient.canmodify=true then
begin
Buttons(false,false,false,false,false,true,false,false);
DBComboBoxPol.ReadOnly:=false;
TPacient.Append;
end
else
MessageDlg('Редактирование невозможно',mtInformation,[mbOK],0);
end;
{Кнопка "Редактирование" }
procedure TPacienti.BEditClick(Sender: TObject);
begin
if TPacient.canmodify=true then
begin
Buttons(false,false,false,false,false,true,false,false);
DBComboBoxPol.ReadOnly:=false;
TPacient.Edit;
end
else
MessageDlg('Редактирование невозможно',mtInformation,[mbOK],0);
end;
{Кнопка "Сохранение" }
procedure TPacienti.BPostClick(Sender: TObject);
begin
if messagedlg('Сохранить изменения?',mtconfirmation,[mbOK,mbCancel],0)=mrOK then
begin
Buttons(true,true,true,true,true,false,true,true);
DBComboBoxPol.ReadOnly:=true;
TPacient.Post;
TPacient.Refresh;
end
else begin
TPacient.Cancel;
Buttons(true,true,true,true,true,false,true,true);
DBComboBoxPol.ReadOnly:=true;
end;
end;
{Кнопка "Удаление" }
procedure TPacienti.BDeleteClick(Sender: TObject);
begin
if TPacient.canmodify=true then
begin
if messagedlg('Удалить запись о больном?',mtconfirmation,[mbOK,mbCancel],0)=mrOK then
begin
if TPolis_bolezn.Locate('INomer_polisa',TPacient.FieldByName('INomer_polisa').AsString,[])=true then
begin
showmessage('Нельзя удалить карточку больного!Есть сведения о болезнях.');
abort;
end
else
begin
TPacient.Delete;
TPacient.Refresh;
ShowMessage('Запись о больном удалена!');
end;
end
else
begin
TPacient.Cancel;
Buttons(true,true,true,true,true,false,true,true);
end;
end
else
MessageDlg('Изменение таблицы невозможно',mtInformation,[mbOK],0);
end;
{Кнопка "Предыдущая" }
procedure TPacienti.BPriorClick(Sender: TObject);
begin
With TPacient do prior;
Buttons(true,true,true,true,true,false,true,true);
if TPacient.bof=true then begin
Buttons(true,false,false,true,true,false,true,true);
end;
end;
{Кнопка "Следующая" }
procedure TPacienti.BNextClick(Sender: TObject);
begin
With TPacient do next;
Buttons(true,true,true,true,true,false,true,true);
if TPacient.eof=true then begin
Buttons(false,true,true,false,true,false,true,true);
end;
end;
{Кнопка "Последняя" }
procedure TPacienti.BLastClick(Sender: TObject);
begin
With TPacient do last;
Buttons(true,true,true,true,true,false,true,true);
if TPacient.eof=true then begin
Buttons(false,true,true,false,true,false,true,true);
end;
end;
{Поиск}
procedure TPacienti.EditPoiskChange(Sender: TObject);
begin
TPacient.FindNearest([EditPoisk.text]);
end;
{Перед выходом из таблицы программы "DBGridPolisBolezn" сохранение изменений в табл. "Polis_bolezn"}
procedure TPacienti.DBGridPolisBoleznExit(Sender: TObject);
begin
with TPolis_bolezn do
if (State=dsedit)or(State=dsinsert) then
begin
TPolis_bolezn.Post;
end;
end;
{Перед вставкой записи в НД "ТPolis_bolezn" проверка количества диагнозов}
procedure TPacienti.TPolis_boleznBeforeInsert(DataSet: TDataSet);
begin
QueryPredel.Close;
QueryPredel.SQL.Clear;
QueryPredel.SQL.Add('select P.INomer_polisa as polis,count(PB.INomer_polisa) as kolpol');
QueryPredel.SQL.Add('from Pacient P,Polis_bolezn PB ');
QueryPredel.SQL.Add('where P.INomer_polisa=PB.INomer_polisa');
QueryPredel.SQL.Add('Group By P.INomer_polisa ');
QueryPredel.open;
if QueryPredel.Locate('polis',TPacient.FieldByName('INomer_polisa').AsString,[])=true then
if QueryPredel.FieldByname('kolpol').AsInteger>20 then
begin
ShowMessage('Достигнут предел количества болезней!');
abort;
end;
end;
{При вводе в поле "DBNomerPolisa" проверка наличия диагнозов-если есть, то отменить ввод}
procedure TPacienti.DBNomerPolisaEnter(Sender: TObject);
begin
with TPacient do
if (State=dsedit) then
begin
if TPolis_bolezn.Locate('INomer_polisa',TPacient.FieldByName('INomer_polisa').AsString,[])=true then
begin
ShowMessage('Нельзя!Есть диагноз!');
DBFIO.SetFocus;
end;
end;
end;
end.
Форма "Болезни и группы болезней" (рис.3).
unit UGrBolezni;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, Grids, DBGrids, StdCtrls, DBTables;
type
TBolezni = class(TForm)
DSBolezn: TDataSource;
DSGruppa: TDataSource;
Database1: TDatabase;
TBolezn: TTable;
TGruppa: TTable;
GroupBoxBolezn: TGroupBox;
GroupBoxGrupa: TGroupBox;
DBGridGruppa: TDBGrid;
DBGridBolezn: TDBGrid;
TGruppaCNazv_gruppi: TStringField;
TGruppaNNomer_gruppi: TAutoIncField;
DSPolis: TDataSource;
TPolis: TTable;
procedure FormActivate(Sender: TObject);
procedure DBGridGruppaExit(Sender: TObject);
procedure DBGridBoleznExit(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure TBoleznAfterDelete(DataSet: TDataSet);
procedure TGruppaAfterDelete(DataSet: TDataSet);
procedure TGruppaAfterPost(DataSet: TDataSet);
procedure TBoleznAfterPost(DataSet: TDataSet);
procedure TBoleznBeforeDelete(DataSet: TDataSet);
procedure TGruppaBeforeDelete(DataSet: TDataSet);
procedure TGruppaBeforePost(DataSet: TDataSet);
procedure TBoleznBeforePost(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Bolezni: TBolezni;
implementation
{$R *.dfm}
{При активизации формы подключаются все НД}
procedure TBolezni.FormActivate(Sender: TObject);
begin
TBolezn.Active:=true;
TGruppa.Active:=true;
TPolis.Active:=true;
end;
{При выходе из таблицы программы "DBGridGruppa" сохранение изменений в табл. "Gruppa"}
procedure TBolezni.DBGridGruppaExit(Sender: TObject);
begin
with TGruppa do
if (State=dsedit)or(State=dsinsert) then
begin
TGruppa.Post;
end;
end;
{При выходе из таблицы программы "DBGridBolezn" сохранение изменений в табл. "Bolezn"}
procedure TBolezni.DBGridBoleznExit(Sender: TObject);
begin
with TBolezn do
if (State=dsedit)or(State=dsinsert) then
begin
TBolezn.Post;
end;
end;
{При закрытии формы все НД отключаются. Если есть не сохраненные данные, то они сохраняются}
procedure TBolezni.FormClose(Sender: TObject; var Action: TCloseAction);
begin
with TBolezn do
if (State=dsedit)or(State=dsinsert) then
begin
TBolezn.Post;
TBolezn.Close;
end;
with TGruppa do
if (State=dsedit)or(State=dsinsert) then
begin
TGruppa.Post;
TGruppa.Close;
end;
TGruppa.Close;
TBolezn.Close;
TPolis.Close;
end;
{После удаления из табл. "Bolezn" обновление НД}
procedure TBolezni.TBoleznAfterDelete(DataSet: TDataSet);
begin
TBolezn.Refresh;
end;
{После удаления из табл. "Gruppa" обновление НД}
procedure TBolezni.TGruppaAfterDelete(DataSet: TDataSet);
begin
TGruppa.Refresh;
end;
{После сохранения в табл. "Gruppa" обновление НД}
procedure TBolezni.TGruppaAfterPost(DataSet: TDataSet);
begin
TGruppa.Refresh;
TGruppa.Last;
end;
{После сохранения в табл. "Bolezn" обновление НД}
procedure TBolezni.TBoleznAfterPost(DataSet: TDataSet);
begin
TBolezn.Refresh;
TBolezn.Last;
end;
{Перед удалением из табл. "Bolezn" нужно подтвердить или отменить удаление}
procedure TBolezni.TBoleznBeforeDelete(DataSet: TDataSet);
begin
if messagedlg('Удалить запись в болезнях?',mtconfirmation,[mbOK,mbCancel],0)=mrOK then
begin
if TPolis.Locate('NNomer_bolezni',TBolezn.FieldByName('NNomer_bolezni').AsString,[])=true then
begin
showmessage('Нельзя удалить болезнь! Ею болеют пациенты.');
abort;
end
else
begin
ShowMessage('Информация о болезнях удалена!');
end;
end
else
abort;
end;
{Перед удалением из табл. "Gruppa" нужно подтвердить или отменить удаление}
procedure TBolezni.TGruppaBeforeDelete(DataSet: TDataSet);
begin
if messagedlg('Удалить запись в группе болезней?',mtconfirmation,[mbOK,mbCancel],0)=mrOK then
begin
if TBolezn.Locate('NNomer_gruppi',TGruppa.FieldByName('NNomer_gruppi').AsString,[])=true then
begin
showmessage('Нельзя удалить группу болезней!В ней остались болезни.');
abort;
end
else
begin
ShowMessage('Информация о группе болезней удалена!');
end;
end
else
abort;
end;
{Перед сохранением в табл. "Gruppa" нужно подтвердить или отменить сохранение}
procedure TBolezni.TGruppaBeforePost(DataSet: TDataSet);
begin
with TGruppa do
if (State=dsedit)or(State=dsinsert) then
if messagedlg('Записать изменения в таблицу "группы болезней"?',mtwarning,[mbOK,mbCancel],0)=mrCancel then
begin
TGruppa.cancel;
TGruppa.prior;
TGruppa.next;
Abort;
end;
end;
{Перед сохранением в табл. "Bolezn" нужно подтвердить или отменить сохранение}
procedure TBolezni.TBoleznBeforePost(DataSet: TDataSet);
begin
with TBolezn do
if (State=dsedit)or(State=dsinsert) then
if messagedlg('Записать изменения в таблицу "болезни"?',mtwarning,[mbOK,mbCancel],0)=mrCancel then
begin
TBolezn.cancel;
TBolezn.prior;
TBolezn.next;
Abort;
end;
end;
end.
3. Заключение
Спроектированная база данных полностью удовлетворяет заданию. Разработанные в результате проектирования таблицы находятся в нормальной форме Бойса-Кодда.
Разработанная программа для работы пользователя с базой данных обеспечивает:
* Ввод, редактирование и удаление записей таблиц базы данных без нарушения целостности данных, хранящихся в базе данных;
* Выборку данных по заданным условиям и предъявление выборки на экран в удобном для пользователя виде;
* Обработку данных по заданному алгоритму;
* Вывод обработанных данных в текстовый файл в заданном формате с возможностью просмотра файла и его печати;
* Защиту данных от аппаратных сбоев с помощью страхового копирования.
Интерфейс пользователя разработанной программы обеспечивает:
* Лёгкую адаптацию пользователя к приложению;
* Единообразие процедур и терминологии;
* Возможность получения углублённой информации в процессе работы;
* Возможность в любой момент прервать действия и вернуться к началу;
* Контроль вводимой информации и выдача необходимых сообщений в случае ошибочного ввода.
Литература
1. Попов А.А. Создание приложений для FoxPro 2.5/2.6 в DOS и WINDOWS.-
М.: Издательство "Калашников и КО", 1997. - 660 с.: илл. 2. Кузнецов С.Д. Введение в СУБД. Часть 4. СУБД, 4/95, с.114-122
ПРИЛОЖЕНИЕ
1
2
Документ
Категория
Рефераты
Просмотров
21
Размер файла
260 Кб
Теги
вариант
1/--страниц
Пожаловаться на содержимое документа