- •Проектирование и создание прикладной системы для работы с базой данных
- •Теоретические сведения Методика построения прикладной системы для работы с базой данных
- •Использование методики для выполнения учебного задания
- •Формы, обеспечиваюшие пользовательский интерфейс
- •Свойства пунктов главного и дополнительных меню
- •Свойства компонентов tSpeedButton
- •Свойства компонентов, расположенных на форме fmEditflat и в модуле данных
- •Значения свойств компонентов tTable
- •Значения свойств компонентов tDataSource
- •Значения свойств полей для компонента taHave_d
- •Значения общих cвойств визуальных компонентов
- •Лабораторное задание и порядок выполнения работы
- •Требования к отчету
Значения свойств полей для компонента taHave_d
FieldName |
Key Fields |
Dataset |
Lookup Keys |
Result Field |
DisplayLabel |
Visible |
Source |
Id |
taPROFIT |
Id |
Source |
Источник |
True |
Size |
Id |
taPROFIT |
Id |
Moneys |
Размер |
True |
Comment |
|
|
|
|
Пояснение |
True |
Nom |
|
|
|
|
Nom |
False |
Id |
|
|
|
|
Id |
False |
Таблица 11
Значения общих cвойств визуальных компонентов
Name |
DataSource |
DataField |
Name |
DataSource |
DataField |
teNom |
dsPERSON |
Nom |
deSumD |
dsPERSON |
SumD |
deFIO |
dsPERSON |
FIO |
deNtel |
dsPERSON |
Ntel |
deRdate |
dsPERSON |
Rdate |
grHAVE_D |
dsHAVE_D |
|
dcPol |
dsPERSON |
Pol |
naHAVE_D |
dsHAVE_D |
|
lcAdr |
dsPERSON |
Adr |
|
|
|
Для компонента naHAVE_D дополнительно устанавливается значение свойства VisibleButtons=[nbFirst,nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel]. Для информирования пользователя о назначении кнопок навигатора можно установить его свойство ShowHint=True и задать русскоязычные подсказки к кнопкам в свойстве Hints.
С помощью компонента lcAdr значение поля Adr таблицы taPERSON устанавливается путем выбора из списка возможных значений, хранящихся в таблице taFLAT; список появляется при щелчке на кнопке со стрелкой. Для настройки компонента lcAdr нужно задать значения свойств DataSource и DataField, указанные в табл.12, а также значения свойств LookupSource, LookupField, LookupDisplay, необходимые для связи с таблицей taFLAT: LookupSource=dsFLAT (DataSource, соответствующий таблице taFLAT); LookupField=Adr (ключевое поле таблицы taFLAT, значение которого должно соответствовать значению поля, указанного в свойстве DataField); LookupDisplay=Adr (поле таблицы taFLAT, значение которого отображается на экране в компоненте lcAdr).
Примечание. Компонент TDBLookupCombo обеспечивает равенство значений полей DataField и LookupField в таблицах, доступных через свойства DataSource и LookupSource соответственно, и позволяет отображать значение поля LookupDisplay на экране в компоненте TDBLookupCombo.
В компоненте grHAVE_D должны отображаться виды доходов жителя, номер которого выводится в области компонента teNom. Для этого между таблицами taPERSON и taHAVE_D необходимо установить связь главная/подчиненная (master/detailed), задав следующие значения свойств подчиненной таблицы taHAVE_D: MasterSource=dsPERSON; MasterFields=Nom. Строки (записи) в подчиненной таблице должны быть упорядочены с помощью существующего индекса по значениям полей, соответствующих полям, указанным в свойстве MasterFields. Для таблицы taHAVE_D действует первичный индекс с составным ключом (Nom, Id), обеспечивающим автоматическую сортировку по значениям поля Nom, поэтому специального указания об используемом индексе не требуется, хотя для полной ясности можно было бы установить свойство IndexFieldNames=Nom.
Для вычисления общего дохода жителя и записи его в поле SumD таблицы taPERSON поместим в модуль данных компонент TQuery из группы BDE палитры компонентов и зададим его свойства Name=quSumD, DatabaseName=dbTUTOR. Затем дважды щелкнем на свойстве SQL и в появившемся окне String List editor наберем запрос на языке SQL, с помощью которого будет вычисляться общий доход жителя, помещаемый в поле Summa компонента quSumD (листинг 6).
Листинг 6.SQL-запрос для вычисления общего дохода
select SUM(PROFIT.Moneys) Summa, HAVE_D.Nom
from HAVE_D, PROFIT
where HAVE_D.Id=PROFIT.Id and HAVE_D.Nom=:Nom
group by Nom
Параметром SQL-запроса является величина :Nom, обозначающая номер жителя. Для получения списка параметров SQL-запроса нужно дважды щелкнуть по свойству Params компонента quSumD. Тип параметра (ftInteger) задается как значение свойства DataType параметра Nom, выделенного в списке параметров SQL-запроса. С помощью редактора полей для компонента quSumD следует сформировать набор полей, включив в него поле Summa.
SQL-запрос должен выполняться каждый раз после записи новой строки в таблицу taHAVE_D или после удаления строки из нее, т.е. при наступлении события AfterPost или AfterDelete. Текст процедуры обработки события AfterPost приведен на листинге 7.
Листинг 7. Процедура вычисления общего дохода
void __fastcall TdmPERSPROF::taHAVE_DAfterPost(TDataSet *DataSet)
{
if (quSumD->Active) quSumD->Close(); // Закрыть таблицу
quSumD->ParamByName("Nom")->AsInteger // Задать значение параметра
= dmPERSPROF->taPERSONNom->AsInteger;
quSumD->Open(); // Выполнить SQL-запрос
taPERSONSumD->Value = dmPERSPROF->quSumDSumma->Value;// Записать общий доход
}
Эта же процедура должна выполняться при наступлении события AfterDelete. Чтобы использовать ее повторно, нужно для таблицы taHAVE_D в окне инспектора объектов на странице событий выделить строку, соответствующую событию AfterDelete, щелкнуть в этой строке на кнопке со стрелкой и выбрать из появившегося списка имя процедуры taHAVE_DAfterPost.
Строка, добавляемая в таблицу taHAVE_D, должна содержать в поле Nom номер жителя, сведения о котором вводятся или редактируются в данный момент в форме fmEDITPERS. Автоматическая запись этого номера в добавляемую строку должна обеспечиваться процедурой обработки события AfterInsert для таблицы taHAVE_D, приведенной на листинге 8.
Листинг 8. Процедура формирования номера жителя в строке с данными о доходе жителя
void __fastcall TdmPERSPROF::taHAVE_DAfterInsert(TDataSet *DataSet)
{
if (((taPERSON->State==dsEdit)||(taPERSON->State==dsInsert))
&& taPERSON->Modified) //Если действует режим редактирования
{ //или дополнения и строка изменялась,
taPERSON->Post(); //то сохранить изменения,
//чтобы зафиксировать значение поля Nom.
taPERSON->Edit(); //Перевести запись в режим редактирования
}
taHAVE_D->Edit(); //Перевести запись в режим редактирования, чтобы
taHAVE_DNom->Value = taPERSONNom->Value;//записать значение в поле Nom
}
В процедуре учтена та особенность полей типа Autoincrement, что при добавлении новой строки в таблицу taPERSON методом Append или Insert значение в поле этого типа заносится только после выполнения метода Post для таблицы.
Теперь перейдем к компонентам TButton создаваемой формы. Для кнопок Отмена и Выход процедуры обработки события OnClick во многом сходны с ранее рассмотренными (см. листинг 3) и приведены на листинге 9.
Листинг 9. Процедуры обработки события OnClick для кнопок Отмена и Выход
void __fastcall TfmEDITPERS::buCancelClick(TObject *Sender)
{
dmPERSPROF->taPERSON->Cancel(); //Отменить изменения,
dmPERSPROF->taPERSON->Edit(); // но
dmPERSPROF->taHAVE_DAfterPost(dmPERSPROF->taHAVE_D);//вычислить и
dmPERSPROF->taPERSON->Post(); //запомнить общий доход
fmEDITPERS->Close();
}
void __fastcall TfmEDITPERS::buExitClick(TObject *Sender)
{
dmPERSPROF->taPERSON->Post(); //Сохранить изменения
fmEDITPERS->Close();
}
Процедура обработки события OnClick для кнопки Сведения о квартире активизирует форму fmEDITFLAT для просмотра, изменения или регистрации сведений о квартире (листинг 10).
Листинг 10. Процедуры обработки события OnClick для кнопки Сведения о квартире
void __fastcall TfmEDITPERS::buEditFlatClick(TObject *Sender)
{
fmEDITFLAT->Editing = True;
fmEDITFLAT->ShowModal();
}
Процедура обработки события OnClickдля кнопкиСведения о телефонеактивизирует формуfmEDITPHONдля просмотра, изменения или регистрации сведений о телефоне (листинг 11).
Листинг 11. Процедура обработки события OnClick для кнопки Сведения о телефоне
void __fastcall TfmEDITPERS::buEditPhoneClick(TObject *Sender)
{
fmEDITPHON->Editing = True;
fmEDITPHON->ShowModal();
}
Кнопки навигатора naHAVE_D используются для перемещения по строкам таблицы taHAVE_D, в которых содержится информация об источниках дохода жителя, а также для добавления, удаления, редактирования строк и отмены сделанных в строке изменений. При добавлении новой строки номер жителя записывает в нее процедурой, приведенной на листинге 8, а идентификатор источник дохода записывается в эту строку после выбора названия источника из списка, который становится доступен после двух щелчков в добавленной строке по полю с названием источника.
Создаваемая форма может вызываться в режимах регистрации или изменения сведений о жителе. При активизации формы fmEDITPERS необходимо задать соответствующий заголовок формы и обеспечить доступ к нужной записи таблицы taPERSON. Эти действия выполнит процедура обработки события OnActivate, текст которой приведен на листинге 12.
Листинг 12. Процедура обработки события OnActivate
void __fastcall TfmEDITPERS::FormActivate(TObject *Sender)
{
if (Editing)
{
Caption = "Изменение сведений о жителе";
dmPERSPROF->taPERSON->Edit(); // Режим редактирования
}
else
{
Caption = "Регистрация сведений о жителе";
dmPERSPROF->taPERSON->Append(); // Режим дополнения
}
}
В этой и других процедурах используется признак режима Editing типа Boolean, который следует объявить в разделе public класса TfmEDITPERS.
Создаваемая форма активизирует формы fmEDITFLAT и fmEDITPHON. Чтобы они были доступны, к создаваемой форме следует подключить модули EDITFLAT и EDITPHON, воспользовавшись командой File | Use Unit.
Сохраним созданную форму и проект командой File | Save All, указав в качестве имени модуля созданной формы имя EDITPERS. На этом создание формы fmEDITPERS завершается.
Остается связать ее с пунктом меню Житель в главной форме и кнопкой sbNewPerson на панели быстрого доступа аналогично тому, как подобные связи устанавливались для формы fmEDITFLAT.
Сохранив изменения командой File | Save All, можно проверить работоспособность проекта, осуществив активизацию созданной формы из меню или кнопкой на панели быстрого доступа и убедившись в правильном функционировании формы fmEDITPERS.