Цель работы: Изучить технологию доступа к данным ADO.
Задание:
Разработать простую базу данных (не менее 3-х таблиц) и клиент-серверное приложение для работы с ней, использующее возможности пакетной обработки данных технологии ADO. Приложение должно содержать форму для редактирования данных в таблице и форму для редактирования данных по одной записи (с использованием компонента TDBNavigator). Также приложение должно использовать либо связь master-detail, либо поля синхронного просмотра (lookup), либо вычисляемые поля, а также использовать либо возможности поиска, либо установки диапазонов, либо фильтрации. Приложение должно использовать не менее 5 запросов SQL (SELECT, INSERT, UPDATE, DELETE).
Примеры заданий:
- Форум (3 таблицы: Пользователи, Вопросы, ответы).
- Почтовая служба (таблицы Почтовый ящик, Папки ящика, Сообщения).
- Больница (Пациенты, Врачи, Истории болезней).
- Рабочие (Предприятие, Отдел, Рабочий).
- Детали (Тип детали, Марка детали, Параметры деталей).
- Поисковая система (Сайты, Ключевые слова, Текстовые фрагменты).
Примечание. Студентам рекомендуется спроектировать свою базу данных.
Текст модуля Main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids,Data, StdCtrls, ExtCtrls, DBCtrls, Mask, Menus,About; type TMainfrm = class(TForm) Workmannvg: TDBNavigator; Fieldgrb: TGroupBox; Surnamedbe: TDBEdit; Namedbe: TDBEdit; FatherNamedbe: TDBEdit; Addressdbe: TDBEdit; Salarydbe: TDBEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; JobTitlesdbg: TDBGrid; Keydbe: TDBEdit; AllJobTitlesdbg: TDBGrid; Addbtn: TButton; Removebtn: TButton; Refreshbtn: TButton; Minimumtxb: TEdit; Filterbtn: TButton; GroupBox1: TGroupBox; DBLookupListBox1: TDBLookupListBox; JobTitledbe: TDBEdit; MiminumSalarydbe: TDBEdit; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormResize(Sender: TObject); procedure WorkmannvgClick(Sender: TObject; Button: TNavigateBtn); procedure AddbtnClick(Sender: TObject); procedure RefreshbtnClick(Sender: TObject); procedure RemovebtnClick(Sender: TObject); procedure FilterbtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Mainfrm: TMainfrm; implementation {$R *.dfm} procedure TMainfrm.Button1Click(Sender: TObject); begin AboutBox.ShowModal end; procedure TMainfrm.FormResize(Sender: TObject); const SM=10;CountFields=5; begin { Mainfrm.Workmandbg.Top:=SM+Fieldgrb.Height; Mainfrm.Workmandbg.Left:=SM; Mainfrm.Workmandbg.Width :=Mainfrm.ClientWidth-Mainfrm.Workmandbg.Left-SM; Mainfrm.Workmandbg.Height:=Mainfrm.ClientHeight-Mainfrm.Workmandbg.Top-Mainfrm.Workmannvg.ClientHeight-SM; Mainfrm.Workmannvg.Top:=Workmandbg.Top+Workmandbg.Height ; Fieldgrb.ClientWidth:=Workmandbg.ClientWidth ; Surnamedbe.Left:=10; namedbe.Left:=Round(Fieldgrb.Width /CountFields); Fathernamedbe.Left:=Round(Fieldgrb.Width /CountFields*2); Addressdbe.Left:=Round(Fieldgrb.Width /CountFields*3); Salarydbe.Left:=Round(Fieldgrb.Width /CountFields*4); Surnamedbe.Width:=Round(Fieldgrb.Width/Countfields); namedbe.Width:=Round(Fieldgrb.Width/Countfields); Fathernamedbe.Width:=Round(Fieldgrb.Width/Countfields); ADdressdbe.Width:=Round(Fieldgrb.Width/Countfields); Salarydbe.Width:=Round(Fieldgrb.Width/Countfields)-10; } end; procedure TMainfrm.WorkmannvgClick(Sender: TObject; Button: TNavigateBtn); var str1,str2,str3:String; begin str1:=' SELECT ДОЛЖНОСТИ.Работник, ДОЛЖНОСТИ.Должность,ДОЛЖНОСТЬ.Название FROM ДОЛЖНОСТИ, ДОЛЖНОСТЬ WHERE ДОЛЖНОСТИ.Работник='; str3:= ' AND ДОЛЖНОСТЬ.Код=ДОЛЖНОСТИ.Должность'; str2:=IntToStr(Keydbe.Field.AsInteger); Datafrm.JobTitlesqry.SQL[0]:=str1+str2+str3; Datafrm.JobTitlesqry.Open; end; procedure TMainfrm.AddbtnClick(Sender: TObject); var str1,str2,str3,str4:String; reckey:integer; Last,n:integer; begin reckey:=Integer(Datafrm.AllJobTitlesqry.FieldValues['Код']); last:=Datafrm.JobTitlesqry.RecNo; with datafrm do begin for n:=1 to jobTitlesqry.RecordCount do begin Jobtitlesqry.RecNo:=n; if (JobTitlesqry.FieldValues['Должность']=reckey)then begin MessageBox(Mainfrm.Handle,'Один работник не может работать на двух одинаковых работах.','ERROR',MB_ICONERROR); Exit; end; end; JobTitlesqry.RecNo:=last; end; str1:='INSERT INTO ДОЛЖНОСТИ (Работник, Должность) VALUES('; str2:=Keydbe.Field.AsString; str3:=', '+AllJobTitlesdbg.Fields[0].AsString+')'; str4:=str1+str2+str3; Datafrm.Addqry.SQL[0]:=str4; Datafrm.Addqry.ExecSQL; Datafrm.JobTitlesqry.Active:=FALSE; Datafrm.JobTitlesqry.Active:=TRUE; end; procedure TMainfrm.RefreshbtnClick(Sender: TObject); var str1,str2,str3,str4:String; begin str1:=' SELECT ДОЛЖНОСТИ.Работник, ДОЛЖНОСТИ.Должность,ДОЛЖНОСТЬ.Название FROM ДОЛЖНОСТИ, ДОЛЖНОСТЬ WHERE ДОЛЖНОСТИ.Работник='; str3:= ' AND ДОЛЖНОСТЬ.Код=ДОЛЖНОСТИ.Должность'; str2:=IntToStr(Keydbe.Field.AsInteger); Datafrm.JobTitlesqry.SQL[0]:=str1+str2+str3; Datafrm.JobTitlesqry.Open; end; procedure TMainfrm.RemovebtnClick(Sender: TObject); var str1,str2,str3,str4:string; begin if (Datafrm.JobTitlesqry.IsEmpty) Then begin messageBox(mainfrm.Handle,'Таблица итак уже пуста...','Ошибка',MB_ICONERROR); exit; end; str1:='DELETE FROM ДОЛЖНОСТИ WHERE ДОЛЖНОСТИ.Работник='; str2:=IntToStr(Datafrm.JobTitlesqry.FieldValues['Работник'])+'AND ДОЛЖНОСТИ.Должность='; str3:=IntToStr(datafrm.JobTitlesqry.FieldValues['Должность']); Datafrm.Removeqry.SQL[0]:=str1+str2+str3; Datafrm.Removeqry.ExecSQL; Datafrm.JobTitlesqry.Active:=FALSE; Datafrm.JobTitlesqry.Active:=TRUE; end; procedure TMainfrm.FilterbtnClick(Sender: TObject); var str1:String; n,Code:integer; begin with Datafrm do begin AllJobtitlesqry.Filtered:=FALSE; Val(Minimumtxb.Text,n,Code); str1:=IntToStr(n); if (Code<>0) then begin MessageBox(Mainfrm.Handle,'Поле минимальный оклад содержит некорректное значение!!!','ОШИБКА',MB_ICONERROR); exit; end; AllJobTitlesqry.Filter:='Минимальный_оклад<'+str1; AllJobtitlesqry.Filtered:=TRUE; end; end; end. |
Текст модуля Data:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
unit Data; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, DBClient; type TDatafrm = class(TForm) ADOConnection: TADOConnection; Workmantbl: TADOTable; Workmandst: TDataSource; Workmanqry: TADOQuery; NursingAnimalsqry: TADOQuery; NursingAnimalsdsr: TDataSource; NursingAnimalstbl: TADOTable; JobTitlesqry: TADOQuery; JobTitlesdsr: TDataSource; AllJobTitlesqry: TADOQuery; AllJobTitlesdsr: TDataSource; Addqry: TADOQuery; Adddsr: TDataSource; Removeqry: TADOQuery; Removedsr: TDataSource; Refreshqry: TADOQuery; Refreshdsr: TDataSource; JobTitles: TClientDataSet; procedure FormActivate(Sender: TObject); procedure FormCreate(Sender: TObject); procedure WorkmanqryCalcFields(DataSet: TDataSet); procedure JobTitlesqryCalcFields(DataSet: TDataSet); private { Private declarations } public { Public declarations } end; var Datafrm: TDatafrm; implementation {$R *.dfm} procedure TDatafrm.FormActivate(Sender: TObject); begin Workmanqry.Active :=TRUE; end; procedure TDatafrm.FormCreate(Sender: TObject); begin Workmanqry.Active :=TRUE; NursingAnimalsqry.Active:=TRUE; AllJobTitlesqry.Active:=TRUE; end; procedure TDatafrm.WorkmanqryCalcFields(DataSet: TDataSet); begin with Workmanqry do begin end; end; procedure TDatafrm.JobTitlesqryCalcFields(DataSet: TDataSet); begin JobTitlesqry.FieldValues['CalcField1']:=1000; end; end. |
Окно программы:
Вывод: Технология ADO является эффективным средством доступа к данным для программирования доступа к дан
Архив с исходными кодами к лабораторной работе № 2 по визуальному программированию