Главная » C++, C++ Builder » Отслеживаем  изменения БД в CBuilder

0

Теперь, когда панель состояния находится на форме, надо отследить индивидуальные изменения, сделанные пользователем в записях базы данных. Для того чтобы что-то отследить, нам надо кое- что узнать о том, когда и какие события происходят в «жизни» записи.

Когда пользователь нажимает кнопку + объекта TDBNavigator, расположенно го на форме, новая запись добавляется в базу данных. Изменение существующей записи происходит, когда пользователь переходит к какой-либо записи, используя одну из кнопок перемещения объекта TDBNavigator, и изменяет ее перед тем, как перезаписать в базу. В обоих  случаях  событие, которое возникает в базе данных, называется Post (прописывание). Событие Post возникает всякий раз, когда запись пишется в базу данных, вне зависимости от того, в первый раз или после изменения.

Если посмотреть на список событий, возможных для объекта-таблицы, ассоциированного с формой, то в нем не найдется различных событий для обновления и добавления записи. Вместо этого есть события AfterInsert (после добавления) и  AfterPost  (после  записи).  Событие AfterInsert возникает после того, как по нажатию пользователем кнопки Insert (+) новая запись добавляется в базу. Мы не можем определить, вызывается ли Post в результате добавления новой

или обновления существующей записи, поэтому мы будем отслеживать предшествующее действие— добавление или перемещение по базе. Для этого мы добавим в нашу форму флаг состояния . Заодно давайте добавим счетчики количества добавлений, изменений и удалений за текущий сеанс работы программы.

Измените заголовочный файл формы, добавив в описание формы новые переменные, как показано ниже. Заодно обратите внимание на переменные, уже добавленные туда мастером форм. Немало работы он за вас проделал, не правда ли?

private; // private declarations int FnNumAdds;

int FnNumUpdates;

int FnNumDeletes; bool FbUpdateMode;

void UpdateStatusBar(void);

Не  удивляйтесь, что здесь же находится функция UpdateStatusBar (обновить панель состояния),

— мы собираемся использовать ее для переноса новых данных в блоки панели состояния формы.

Следующим шагом будет инициализация всех переменных в конструкторе формы. Все счетчики, естественно, устанавливаются в 0, но флаг режима (FbUpdateMode) установлен в значение false. Почему? Когда вы изначально откроете форму, CBuilder добавит новую запись для введения данных. Если пользователь переместится к какой-нибудь другой записи и изменит ее, мы это все равно отследим. Вот полный код для конструктора:

__fastcall TForm2::TForm2(TComponent *Owner)

: TForm(Owner)

{

FnNumAdds = 0;

FnNumUpdates = 0;

FnNumDeletes = 0; FbUpdateMode = false;

}

После того как все значения инициализированы, мы добавим алгоритм для логической функции обновления панели состояния. Вот код, в котором мы просто присваиваем каждой секции (panel) панели состояния новые данные по отображаемой ей информации:

void  TForm2::UpdateStatusBar(void)

{

StatusBar1->Panels->Items[0]->Text  =

"Добавлено записей: " + AnsiString(FnNumAdds); StatusBar1->Panels->Items[1]->Text  =

"Удалено записей: "+ AnsiString(FnNumDeletes); StatusBar1->Panels->Items[2]->Text  =

"Изменено записей: " + AnsiString(FnNumUpdates);

}

Итак, счетчики инициализированы и отображены на экране. Пора начинать обрабатывать события базы данных, которые должны повлечь за собой изменения у нас на экране. Сначала мы обработаем изменение записи в базе данных как таковое, а потом перейдем к добавлению и изменению записей. Если у нас есть запись, которая была вновь добавлена или изменена и потом

зависимости от того, произошло добавление  новой  или  изменение  существующей  записи. Почему? Когда вы делаете добавление в базу данных, в ней создается новая пустая запись. При редактировании изменяется запись, содержащая данные. В любом случае мы лишь обновляем уже существующую запись, и база данных не знает (точнее, не хочет знать), имеем мы дело с только что добавленной пустой записью или с записью, уже содержавшей данные.

Чтобы обработать факт того, что произошло событие Post (а это все, что нам  надо  сделать), добавьте обработчик события AfterPost (по факту записи) объекта TTable. В этот обработчик добавьте следующий код:

void __fastcall TForm2::Table1AfterPost(TDataSet *DataSet)

{

if (FbUpdateMode) FnNumUpdates++; else FnNumAdds++; UpdateStatusBar();

}

Если пользователь добавляет новую запись в базу данных, объектом TTable генерируется событие AfterInsert (по факту вставки). Между прочим, для каждого события After (по факту, после) есть соответствующее событие Before (перед, до). Таким образом, если бы вы захотели обработать события BeforeInsert или BeforePost (к которому мы вскоре обратимся), вы могли бы добавить обработчики и для них.

Добавьте следующий  код в  обработчик события AfterInsert, чтобы отследить факт добавления новой записи в базу:

void __fastcall TForm2::Table1AfterInsert(TDataSet *DataSet)

{

FbUpdateMode = false;

}

Здесь мы делаем не так и много — нам надо только запомнить, что последнее действие, которое совершил пользователь, — добавил новую запись. Точно так же, если пользователь изменяет существующую запись, происходит событие AfterEdit. Мы можем использовать это событие для того, чтобы дать знать форме, что мы находимся в режиме редактирования. А вот и необычайной сложности код для обработчика события AfterEdit:

void __fastcall TForm2::Table1AfterEdit(TDataSet *DataSet)

{

FbUpdateMode = true;

}

И последнее событие, которое нам надо отловить, — это событие,  возникающее,  когда пользователь удаляет запись из базы данных. Надеюсь, вам не покажется странным, что  это событие AfterDelete (по факту удаления). Также, думаю, следующий код для обработчика события AfterDelete вас тоже не удивит:

void __fastcall TForm2::Table1AfterDelete(TDataSet *DataSet)

{

FnNumDeletes ++; UpdateStatusBar();

}

Обратите внимание, что при удалении мы обновляем панель состояния. Это потому, что в базе данных больше нет изменений, связанных с удалением, которые можно было бы  отследить. Удалив однажды, вы удаляете навсегда, и с этим вам придется считаться. В случае добавления или обновления, однако,  никаких действий на самом деле не будет производиться до тех пор, пока пользователь не зафиксирует изменения в базе, что вызовет событие Post. Поэтому нам надо отследить событие Post и соответствующим образом обновить панель состояния. Вот код для обработчика события AfterPost:

void __fastcall TForm2::Table1AfterPost(TDataSet *DataSet)

{

if (FbUpdateMode) FnNumUpdates++; else FnNumAdds++; UpdateStatusBar;

}

Вот и все, что касается обновления панели состояния. Теперь вы можете добавлять, изменять и удалять записи сколько душе угодно, наблюдая на панели состояния количество изменений, которые вы внесли в базу данных.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии