
lec_05_7_8_2007.ppt
- Количество слайдов: 56
Разработка клиентской части 1. Определить количество рабочих мест и характер выполняемых функций. 2. Определить тип создаваемых приложений. 3. Разграничить права доступа из клиентских приложений к базе данных и возможность модификации данных. Пример: 1. Для примера рассмотрим клиентское приложение имеющее полный набор функций: добавление, изменение и удаление данных; формирование отчетных форм; отображение данных. 2. Тип клиентского приложения определим как многодокументный интерфейс. 1
Разработка приложения (создание форм): 1. Основная форма: - свойство Form. Style = fs. MDIForm; - компоненты: Main. Menu 1 Структура меню: Файл (данные об успеваемости, выход) Справочники (студенты, предметы, оценки) Отчеты (отчет № 1, отчет № 2) О программе 2. Вторая форма Data. Module 2 На ней необходимо расположить следующие компоненты: a) ADOConnection: 2
Connection. String – позволяет установить соединение с базой (необходимо задать имя сервера и базы данных); Login. Promt – False (не запрашивать логин и пароль); Name – имя ( в нашем случае ADOCUs). б) TADOTable – (используется для соединения с таблицами базы данных) 5 компонента для связи с просмотрами Connection – ADOCUs; Table. Name – имя таблицы или просмотра; Index. Name – значение индекса если в таблице созданы дополнительные индексы помимо первичного ключа 3
Active – false (если существует необходимость активизировать соединение с таблицей во время разработки приложения то данное свойство необходимо установить в true); Для всех компонентов которые мы будем использовать для отображения табличных данных, необходимо задать переменные которые будут ассоциироваться с полями таблицы или полями просмотра (дважды щелкнуть на компоненте и выбрать add fields). После отображения полей задайте каждому название поля в свойстве Display. Label, которое будет отображаться на форме. Замечание: Название ассоциируемых переменных генерируется автоматически Названиекомпонента. Названиеполя и прописывается в классе TData. Module. 4
в) TData. Source – компонент служащий для обмена информацией между компонентами – наборами данных и компонентами визуализации. Data. Set – имя компонента TADOTable; Name - имя Data. Source. г) TADOStoret. Proc – компонет для связи с хранимыми процедурами. Connection – ADOCUs; Procedure. Name – имя хранимой процедуры; Active – false (значение true будет означать выполнение хранимой процедуры, данное значение можно устанавливать если все передаваемые параметры определены). 5
В результате получим следующую структуру: 6
Все последующие формы не должны создаваться автоматически. 3. Форма для отображения справочников: Border. Style – bs. Tool. Window; Form. Style – fs. MDIChild. Компоненты: TDBGrid - компонент для визуализации данных. В виду того что одна форма будет использоваться для отображения различных справочных таблиц, то задание свойств компонента будет осуществляться программно. 4 TButton – (добавить, изменить, удалить и закрыть) 7
В результате получим следующую форму: 8
4. Формы для добавления или изменения данных При разработке этих форм нужно учесть все типы полей которые будут отображаться на форме. Для таблицы студенты необходимо использовать: 3 – TEdit для отображения фамилии, имени и отчества студента; 1 - TDate. Time. Picker - для отображения даты и 1 TCombo. Box – для выбора курса из значений 1. . 5. Для Изменения данных в таблице Оценки и Предметы можно использовать имеющуюся форму а можно создать дополнительную на которой будет расположен компонент Tedit. 9
В результате получим следующую форму: Форма будет открываться в модальном режиме. 10
5. Форма для отображения данных об успеваемости студентов. Как и третья форма. Можно совместить третью и пятую форму, но при этом необходимо помнить, что для отображения общих данных требуется больше места. В этом случае программным способом, при создании формы, надо увеличить ее размеры. 6. Форма для изменения и редактирования данных об успеваемости. 3 - TDBLookup. Combo. Box – для связи с просмотром FIO и таблицами предметы и оценки. 1 - TDate. Time. Picker – для выбора даты. 11
Свойства: List. Source – компонент TData. Source; Key. Field – первичный ключ из набора данных; List. Field - отображаемое поле. В результате получим следующую форму: 12
7. Форма для формирования отчетов. На форме необходимо расположить следующие компоненты. 1 - TWord. Application – для связи с сервером Word; 1 - TDBLookup. Combo. Box – для выбора данных необходимых при формировании отчета; 2 - TButton - для формирование отчета и закрытия формы. Форма будет открываться в модальном режиме. 13
8. Форма о программе. Форма будет открываться в модальном режиме. 14
Описание обработчиков событий. 1. Основная форма: Для отслеживания создания дочерних форм создадим глобальную переменную: b: array[1. . 4] of boolean; {три справочных формы и одна основная} В разделе uses необходимо прописать все модули. При создании формы устанавливаем значение глобальной переменной: procedure TForm 1. Form. Create(Sender: TObject); var i: byte; begin for i: =1 to 4 do b[i]: =false; end; 15
Определяем активные соединения: procedure TForm 1. Form. Show(Sender: TObject); begin with Data. Module 2 do begin V_Student. Active: =true; V_Ocenki. Active: =true; V_Predmet. Active: =True; V_SUsp. Active: =true; V_FIO. Active: =true; end; 16
Отображение данных об успеваемости: procedure TForm 1. N 5 Click(Sender: TObject); var FUsp: TForm 5; {объявляем переменную типа дочерняя форма} begin if not b[1] then {если дочерняя форма «Данные об успеваемости» не создана, то создаем ее} begin FUsp: =TForm 5. Create(Application); FUsp. Show; FUsp. DBGrid 1. Data. Source: = Data. Module 2. DS_SUsp; Fusp. Tag: =1; {DBGrid 1 присваиваем набор данных для отображения} b[1]: =true; {определяем что дочерняя форма данного вида уже создана} end; 17
Отображение данных справочных таблиц: procedure TForm 1. N 6 Click(Sender: TObject); var cpr: TForm 3; begin if not b[2] then begin cpr: =TForm 3. Create(Application); cpr. Caption: ='Справочник "Студенты"'; cpr. Show; cpr. DBGrid 1. Data. Source: = Data. Module 2. DS_Student; cpr. tag: =2; b[2]: =true; end; 18
Формирование отчета № 1: procedure TForm 1. N 11 Click(Sender: TObject); begin Application. Create. Form(TForm 7, Form 7); With Form 7 do begin Caption: ='Отчет № 1'; Button 1. Caption: ='Excel'; DBLookup. Combo. Box 1. List. Source: = Data. Module 2. DS_Ocenki; DBLookup. Combo. Box 1. List. Source. Data. Set: = Data. Module 2. T_Ocenki; DBLookup. Combo. Box 1. Key. Field: ='NOc'; DBLookup. Combo. Box 1. List. Field: ='Ocenka'; DBLookup. Combo. Box 1. Key. Value: =1; Show. Modal; end; 19
Формирование отчета № 2 : procedure TForm 1. N 21 Click(Sender: TObject); begin Application. Create. Form(TForm 7, Form 7); With Form 7 do begin Caption: ='Отчет № 2'; Button 1. Caption: ='Word'; DBLookup. Combo. Box 1. List. Source: = Data. Module 2. DS_FIO; DBLookup. Combo. Box 1. List. Source. Data. Set: = Data. Module 2. V_FIO; DBLookup. Combo. Box 1. Key. Field: ='NSt'; DBLookup. Combo. Box 1. List. Field: ='FIO'; DBLookup. Combo. Box 1. Key. Value: =1; Show. Modal; end; 20
Создание формы о программе: procedure TForm 1. N 4 Click(Sender: TObject); begin Application. Create. Form(TForm 8, Form 8); Form 8. Caption: ='О программе'; Form 8. Show. Modal; end; 21
2. Форма отображения справочных таблиц Закрытие формы procedure TForm 3. Button 4 Click(Sender: TObject); begin close; end; procedure TForm 3. Form. Close(Sender: TObject; var Action: TClose. Action); begin if TForm 3. Tag=2 then b[2]: =False; if TForm 3. Tag=3 then b[3]: =False; if TForm 3. Tag=4 then b[4]: =False; Action: =ca. Free; end; 22
Кнопки добавления и изменения данных: procedure TForm 3. Button 1 Click(Sender: TObject); begin Application. Create. Form(TForm 4, Form 4); Form 4. Caption: ='Добавление данных'; Form 4. Show. Modal; end; procedure TForm 3. Button 2 Click(Sender: TObject); begin Application. Create. Form(TForm 4, Form 4); Form 4. Caption: ='Изменение данных'; Form 4. Show. Modal; end; 23
Удаление данных: procedure TForm 3. Button 3 Click(Sender: TObject); begin if TForm 3. Tag=2 then with Data. Module 2. Del_Styd do try Data. Module 2. ADOCUS. Begin. Trans; Parameters. Param. By. Name('@NSt'). Value: = Data. Module 2. T_Student. NSt. Value; Exec. Proc; Data. Module 2. ADOCUS. Commit. Trans; Data. Module 2. T_Student. Active: =false; Data. Module 2. T_Student. Active: =true; Show. Message('Данные удалены'); 24
Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end; if b[3] then ; if b[4] then ; end; 25
3. Форма добавления или редактирования справочных таблиц. Определение начальных данных: procedure TForm 4. Form. Show(Sender: TObject); begin if TForm 3. Tag=2 then begin Label 1. Visible: =True; Label 1. Caption: ='Фамилия'; Label 2. Visible: =True; Label 2. Caption: ='Имя'; Label 3. Visible: =True; Label 3. Caption: ='Отчество'; Label 4. Visible: =True; Label 4. Caption: ='Дата рождения'; Label 5. Visible: =True; Label 5. Caption: ='Курс'; 26
Edit 1. Visible: =True; Edit 2. Visible: =True; Edit 3. Visible: =True; Combo. Box 1. Visible: =True; Date. Time. Picker 1. Date: =Date; if Caption='Изменение данных' then begin Edit 1. Text: =Data. Module 2. T_Student. Fam. Value; Edit 2. Text: =Data. Module 2. T_Student. Imya. Value; Edit 3. Text: =Data. Module 2. T_Student. Otch. Value; Date. Time. Picker 1. Date: = Data. Module 2. T_Student. Data. R. Value; Combo. Box 1. Text: = Data. Module 2. T_Student. Kurs. Value; end; 27
if Form 3. DBGrid 1. Data. Source=Data. Module 2. DS_Predmet then begin Label 1. Visible: =True; Label 1. Caption: ='Предмет'; Edit 1. Visible: =True; if Caption='Изменение данных' then Edit 1. Text: =Data. Module 2. T_Predmet. Pred. Value; end; if Form 3. DBGrid 1. Data. Source=Data. Module 2. DS_Ocenki then begin Label 1. Visible: =True; Label 1. Caption: ='Осенка'; Edit 1. Visible: =True; if Caption='Изменение данных' then Edit 1. Text: =Data. Module 2. T_Ocenki. Ocenka. Value; end; 28
Добавление или изменение данных: procedure TForm 4. Button 1 Click(Sender: TObject); begin if TForm 3. Tag=2 then if Caption='Добавление данных' then begin If (Edit 1. Text='') or (Edit 2. Text='') or (Edit 3. Text='') or (Combo. Box 1. Text='')or (Date. To. Str(Date. Time. Picker 1. Date)='') then begin Show. Message('Не все поля заполнены!'); exit; end; try Data. Module 2. ADOCUS. Begin. Trans; 29
with Data. Module 2. Ins_Styd do begin Parameters. Param. By. Name('@Fam'). Value: = Edit 1. Text; Parameters. Param. By. Name('@Imya'). Value: = Edit 2. Text; Parameters. Param. By. Name('@Otch'). Value: = Edit 3. Text; Parameters. Param. By. Name('@Data. R'). Value: = datetostr(Date. Time. Picker 1. Date); Parameters. Param. By. Name('@Kurs'). Value: = strtoint(Combo. Box 1. Text); Exec. Proc; end; 30
Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные добавлены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end else begin If (Edit 1. Text='') or (Edit 2. Text='') or (Edit 3. Text='') or (Combo. Box 1. Text='')or (Date. To. Str(Date. Time. Picker 1. Date)='') then begin Show. Message('Не все поля заполнены!'); exit; end; 31
try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Edit_Styd do begin Parameters. Param. By. Name('@NSt'). Value: = Data. Module 2. T_Student. NSt. Value; Parameters. Param. By. Name('@Fam'). Value: = Edit 1. Text; Parameters. Param. By. Name('@Imya'). Value: = Edit 2. Text; Parameters. Param. By. Name('@Otch'). Value: = Edit 3. Text; Parameters. Param. By. Name('@Data. R'). Value: = datetostr(Date. Time. Picker 1. Date); Parameters. Param. By. Name('@Kurs'). Value: = strtoint(Combo. Box 1. Text); 32
Exec. Proc; end; Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные изменены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end; 33
if b[3] then if Caption='Добавление данных' then begin If (Edit 1. Text='') then begin Show. Message('Не все поля заполнены!'); exit; end; try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Ins_Pred do begin Parameters. Param. By. Name('@Pred'). Value: = Edit 1. Text; Exec. Proc; end; 34
Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные добавлены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end else begin If (Edit 1. Text='') then begin Show. Message('Не все поля заполнены!'); exit; end; 35
try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Edit_Pred do begin Parameters. Param. By. Name('@NPr'). Value: = Data. Module 2. T_Predmet. NPr. Value; Parameters. Param. By. Name('@Pred'). Value: = Edit 1. Text; Exec. Proc; end; Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные изменены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); 36 end;
if b[4] then if Caption='Добавление данных' then begin If (Edit 1. Text='') then begin Show. Message('Не все поля заполнены!'); exit; end; try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Ins_Oc do begin Parameters. Param. By. Name('@Ocenka'). Value: =Edi t 1. Text; Exec. Proc; end; 37
Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные добавлены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end else begin If (Edit 1. Text='') then begin Show. Message('Не все поля заполнены!'); exit; end; 38
try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Edit_Oc do begin Parameters. Param. By. Name('@NOc'). Value: = Data. Module 2. T_Ocenki. NOc. Value; Parameters. Param. By. Name('@Ocenka'). Value: = Edit 1. Text; Exec. Proc; end; Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные изменены'); 39
Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end; 40
Обновление данных перед закрытием формы: procedure TForm 4. Form. Close(Sender: TObject; var Action: TClose. Action); begin {перед закрытием обновляем таблицы успеваемость} if TForm 3. Tag=2 then begin Data. Module 2. T_Student. Active: =false; Data. Module 2. T_Student. Active: =true; end; if then ; end; 41
4. Форма отображения данных об успеваемости Закрытие формы: procedure TForm 5. Button 4 Click(Sender: TObject); begin close; end; procedure TForm 5. Form. Close(Sender: TObject; var Action: TClose. Action); begin Action: =ca. Free; b[1]: =False; end; 42
Добавление и редактирование данных: procedure TForm 5. Button 1 Click(Sender: TObject); begin Application. Create. Form(TForm 6, Form 6); Form 6. Caption: ='Добавление данных'; Form 6. Show. Modal; end; procedure TForm 5. Button 2 Click(Sender: TObject); begin Application. Create. Form(TForm 6, Form 6); Form 6. Caption: ='Изменение данных'; Form 6. Show. Modal; end; 43
Удаление данных: procedure TForm 5. Button 3 Click(Sender: TObject); begin with Data. Module 2. Del_Usp do try Data. Module 2. ADOCUS. Begin. Trans; Parameters. Param. By. Name('@NUs'). Value: = Data. Module 2. V_SUsp. NUs. Value; Exec. Proc; Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные удалены'); Data. Module 2. V_SUsp. Active: =false; Data. Module 2. V_SUsp. Active: =true; Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); 44 end;
5. Форма Добавления и редактирования данных об успеваемости. Установка начальных значений: procedure TForm 6. Form. Show(Sender: TObject); begin Date. Time. Picker 1. Date: =date; if Caption='Изменение данных' then {Если изменяем то устанавливаем значение активной записи} With Data. Module 2 do begin Ftor. Kluch. Parameters. Param. By. Name ('@NUs'). Value: =V_SUsp. NUs. Value; Ftor. Kluch. Active: =True; DBLookup. Combo. Box 1. Key. Value: = Ftor. Kluch. NFSt. Value; 45
DBLookup. Combo. Box 2. Key. Value: = Ftor. Kluch. NFPred. Value; DBLookup. Combo. Box 3. Key. Value: = Ftor. Kluch. NFOc. Value; Date. Time. Picker 1. Date: =V_SUsp. Data. Oc. Value; Ftor. Kluch. Active: =False; end; Закрытие формы: procedure TForm 6. Form. Close(Sender: TObject; var Action: TClose. Action); begin Data. Module 2. V_SUsp. Active: =false; Data. Module 2. V_SUsp. Active: =true; {перед закрытием обновляем таблицу успеваемость} end; 46
Добавление и изменение данных: procedure TForm 6. Button 1 Click(Sender: TObject); begin if Caption='Добавление данных' then begin If (DBLookup. Combo. Box 1. Text='') or (DBLookup. Combo. Box 2. Text='') or (DBLookup. Combo. Box 3. Text='')or (Date. To. Str(Date. Time. Picker 1. Date)='') then begin Show. Message('Не все поля заполнены!'); exit; end; try Data. Module 2. ADOCUS. Begin. Trans; 47
with Data. Module 2. Ins_Usp do begin Parameters. Param. By. Name('@Data. Oc'). Value: =dat etostr(Date. Time. Picker 1. Date); Parameters. Param. By. Name('@NFSt'). Value: =DBLo okup. Combo. Box 1. Key. Value; Parameters. Param. By. Name('@NFPred'). Value: =DB Lookup. Combo. Box 2. Key. Value; Parameters. Param. By. Name('@NFOc'). Value: =DBL ookup. Combo. Box 3. Key. Value; Exec. Proc; end; Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные добавлены'); 48
Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end else begin If (DBLookup. Combo. Box 1. Text='') or (DBLookup. Combo. Box 2. Text='') or (DBLookup. Combo. Box 3. Text='')or (Date. To. Str(Date. Time. Picker 1. Date)='') then begin Show. Message('Не все поля заполнены!'); exit; end; 49
try Data. Module 2. ADOCUS. Begin. Trans; with Data. Module 2. Edit_Ups do begin Parameters. Param. By. Name('@NUs'). Value: = Data. Module 2. V_SUsp. NUs. Value; Parameters. Param. By. Name('@Data. Oc'). Value: = datetostr(Date. Time. Picker 1. Date); Parameters. Param. By. Name('@NFPred'). Value: = DBLookup. Combo. Box 2. Key. Value; Parameters. Param. By. Name('@NFOc'). Value: = DBLookup. Combo. Box 3. Key. Value; Parameters. Param. By. Name('@NFSt'). Value: = DBLookup. Combo. Box 1. Key. Value; Exec. Proc; end; 50
Data. Module 2. ADOCUS. Commit. Trans; Show. Message('Данные изменены'); Except Data. Module 2. ADOCUS. Rollback. Trans; Show. Message('Невозможно выполнить. Повторите. '); end; 51
6. Форма для формирования отчетов. Для работы с объектами ком необходимо прописать в разделе uses модуль comobj. procedure TForm 7. Button 1 Click(Sender: TObject); var XL: Ole. Variant; i: Integer; begin if Form 7. Caption='Отчет № 1' then begin XL: =Create. Ole. Object('excel. application'); xl. workbooks. add; XL. Visible: =true; With Data. Module 2 do begin SP_Otchet 1. Parameters. Param. By. Name ('@Param 1'). Value: =DBLookup. Combo. Box 1. Key. Value; 52
SP_Otchet 1. Active: =true; SP_Otchet 1. First; i: =1; xl. workbooks[1]. worksheets[1]. cells[i, 1]: = 'Фамилия'; xl. workbooks[1]. worksheets[1]. cells[i, 2]: ='Имя'; xl. workbooks[1]. worksheets[1]. cells[i, 3]: = 'Отчество'; xl. workbooks[1]. worksheets[1]. cells[i, 4]: = 'Кол-во оценок'; while not SP_Otchet 1. Eof do begin inc(i); xl. workbooks[1]. worksheets[1]. cells[i, 1]: = SP_Otchet 1 Fam. As. String; xl. workbooks[1]. worksheets[1]. cells[i, 2]: = SP_Otchet 1 Imya. As. String; 53
xl. workbooks[1]. worksheets[1]. cells[i, 3]: = SP_Otchet 1 Otch. As. String; xl. workbooks[1]. worksheets[1]. cells[i, 4]: = SP_Otchet 1 Kol. As. String; SP_Otchet 1. Next; end; SP_Otchet 1. Active: =False; end else begin Word. Application 1. Documents. Add( Empty. Param, Empty. Param); Word. Application 1. Visible: =true; 54
with Data. Module 2 do begin SP_Otchet 2. Active: =false; SP_Otchet 2. Parameters. Param. By. Name ('@Param'). Value: = DBLookup. Combo. Box 1. Key. Value; SP_Otchet 2. Active: =true; SP_Otchet 2. First; Word. Application 1. Selection. Insert. After ('Табель успеваемости'+#13); Word. Application 1. Selection. Insert. After ('Студент: '+DBLookup. Combo. Box 1. Text+#13); while not SP_Otchet 2. Eof do begin Word. Application 1. Selection. Insert. After (SP_Otchet 2 Pred. As. String+' '); 55
Word. Application 1. Selection. Insert. After (SP_Otchet 2 Ocenka. As. String+#13); SP_Otchet 2. Next; end; SP_Otchet 2. Active: =False; end; Word. Application 1. Disconnect; end; 56
lec_05_7_8_2007.ppt