Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BD_Razrabotki_po_labam / БДлаб6.doc
Скачиваний:
7
Добавлен:
05.06.2015
Размер:
518.66 Кб
Скачать

Значения свойств полей для компонента 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.

Соседние файлы в папке BD_Razrabotki_po_labam