Глава V. Поиск записей в наборе данных. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Глава V. Поиск записей в наборе данных.



Поиск записей

Поиск записи, удовлетворяющей определенным условиям, означает переход на эту запись.

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

Для поиска записей используют функцию

Locate (const KeyField:String, const KeyValues:Variant, Options:TLocateOptions):Boolean – ищет запись с заданными значениями полей.

Указатель устанавливается на первую встреченную запись, удовлетворяющую условию поиска.

Если запись найдена, то Locate=true, если нет, то Locate=false.

В параметре KeyField указывается список полей (через ;),по которым ведется поиск;

KeyValues – указывается значение полей для поиска;

Options – задает значения, которые обычно используются для поиска строк.

Параметр Options может принимать комбинацию значений:

1. loCaseInsensitive – регистр букв не учитывается (Петров=ПеТрОв=петров= …);

2. loPartialKey – допускается частичное совпадение значений (петров=п=петр=…).

1. и 2. записываются в [].

Пример.

table1.Locate (‘Kod’, 123, []); – в результате выполнения оператора указатель записи установится на запись, у которой в поле Kod число123.

Поиск записей по нескольким полям.

В методе Locate параметр KeyValues является массивом Variant, в котором содержится несколько значений.

Функция VarArrayOf – приводит к типу вариантного массива.

Значения функции разделяются « и заключаются в []; порядок значений соответствует порядку полей параметра KeyField.

Пример

table1.Locate (Tovar;Kolvo,Vararrayof([ Шоколад, 24 ]),[loCaseInsensitive, loPartialKey]);

 

Практическая работа

Пользователь может осуществлять поиск по полям Tovar (Название товара) и Cena (Цена товара), которые выбираются в компонентах CheckBox.

 

procedure TForm1.BitBtn1Click(Sender: TObject);

var keyfields:string; keyvalues:variant; options:tlocateoptions;

Begin

if not (checkbox1.Checked or checkbox2.Checked) then

Begin

messagedlg('не заданы условия поиска',mtinformation,[mbok],0);

exit;

end;

 

if checkbox1.Checked and checkbox2.Checked then

Begin

keyfields:='tovar;cena';

keyvalues:=vararrayof([edit1.Text,edit2.Text]);

End

Else

Begin

if checkbox1.Checked then

Begin

keyfields:='tovar';

keyvalues:=edit1.Text;

end;

if checkbox2.Checked then

Begin

keyfields:='cena';

keyvalues:=edit2.Text;

end;

end;

options:=[locaseinsensitive,lopartialkey];

table1.Locate(keyfields,keyvalues,options);

if not table1.Locate(keyfields,keyvalues,options) then

begin

Beep;

messagedlg('Запись не найдена!',mtinformation,[mbok],0);

exit;

end;

end;

 


Глава VI. Модификация набора данных

Модификация НД представляет собой редактирование, добавление и удаление его записей. Модифицируемость НД зависит от различных условий. Можно разрешить или запретить изменение НД с помощью соответствующих свойств. Управлять возможностью изменения НД Table можно с помощью свойства ReadOnly типа Boolean. Если значение этого свойства = True, то изменения записей запрещаются. По умолчанию свойство ReadOnly имеет значение False, и НД можно модифицировать.

Для проверки, можно ли изменять НД, предназначено свойство CanModify типа Boolean. Если это свойство имеет значение True, то НД изменять можно, а если False, то изменения в НД запрещены.

 

Редактирование записей

 

Редактирование записей заключается в изменении значений их полей. Отредактированой может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняют операции по поиску и перемещению на требуемую запись. После того, как указатель текущей записи установлен на нужную запись и НД находится в режиме просмотра, для редактирования записи следует:

§ перевести НД в режим редактирования;

§ изменить значения полей записи;

§ подтвердить сделанные изменения или отказаться от них, в результате чего НД снова перейдет в режим просмотра.

НД переводится в режим редактирования вызовом метода Edit, например Table1.Edit – редактирование текущей записи НД Table1.

Редактирование записей осуществляется для модифицируемого НД, поэтому перед вызовом метода Edit следует выполнять проверку на возможность редактирования записи (например, путем анализа свойства CanModify).

Пример:

If Table1.CanModify then Table1.Edit;

Если редактирование осуществляется с помощью управляющих компонентов, не связанных с НД, например кнопок Button или переключателей CheckBox, программист должен самостоятельно кодировать действия по предотвращению попыток редактирования немодифицируемого НД. Вот пример осуществления такой блокировки:

procedure TForm1.Button1Click(Sender: TObject);

Begin

if not Table1.CanModify then

Begin

Beep;

MessageDlg ('Редактирование запрещено!', mtInformation, [mbOk], 0);

Exit;

end;

Table1.Edit;

end;

Здесь переход в режим редактирования осуществляется при нажатии кнопки Button, которая может иметь название «Редактировать» или «Edit». Перед переводом в этот режим выполняется проверка, можно ли изменять записи НД Table1, и если нет, то процедура выдает соответствующее сообщение и завершается.

Блокировка попыток пользователя изменить немодифицируемый НД должна выполняться также при добавлении и удалении записей.

При выполнении метода Edit непосредственно перед переводом НД в режим редактирования возникает событие BeforeEdit, которое можно использовать для проверки возможности перехода в этот режим. Например, при попытке пользователя редактировать запись ему может быть предложено подтвердить свои действия:

procedure TForm1.Table1BeforeEdit (DataSet: TDataSet);

Begin

if MessageDlg ('Выполнить редактирование?',

mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Abort;

end;

После выполнения метода Edit вызывается обработчик события AfterEdit.

Для проверки, вносились ли изменения в запись, можно проанализировать свойство Modified типа Boolean. Если свойство имеет значение True, то было изменено значение как минимум одного поля текущей записи.

После ввода информации сделанные изменения должны быть или подтверждены, или отменены.

Метод Post сохраняет изменения записи в таблице БД (например, Table1.Post), снимает блокировку записи и переводит НД в режим просмотра (Table1.Browse).

Перед его выполнением автоматически вызывается обработчик события BeforePost, а сразу после выполнения – обработчик события AfterPost. Используя событие BeforePost, можно проверить сделанные изменения и при необходимости отменить их.

При работе с компонентом DBGrid изменения закрепляются при переходе к другой записи или нажатии клавиши [Enter], а в компоненте DBNavigator можно нажать кнопку Post Edit (Утвердить изменения).

Метод Cancel отменяет изменения, выполненные в текущей записи (например, Table1.Cancel), и возвращает НД в режим просмотра. При выполнении метода Cancel вызываются обработчики событий BeforeCancel и AfterCancel.

При работе с сеткой DBGrid изменения отменяются нажатием клавиши [Esc], а в компоненте DBNavigator – нажатием кнопки Cancel Edit (Отменить изменения).

 

Добавление записей

Добавлять записи можно только к модифицируемому НД.

Для добавления записи нужно выполнить следующие действия:

§ перевести НД в режим вставки;

§ задать значения полей текущей записи;

§ подтвердить сделанные изменения или отказаться от них, после чего НД снова переходит в режим просмотра.

Метод Insert переводит НД в режим вставки и добавляет к нему новую пустую запись. Новая запись вставляется перед текущей записью. При необходимости перед вызовом метода Insert необходимо выполнить перемещение текущего указателя на ту запись НД, перед которой вставляется новая запись.

Метод Append вставляет новую запись в конец НД.

Для компонента DBGrid новая запись добавляется к НД при нажатии клавиши [Insert] или при переходе на последнюю запись. Если на форме находится компонент DBNavigator, то новая запись добавляется при нажатии кнопки Insert Record (Вставить запись).

 

Удаление записей

Удаление текущей записи выполняет метод Delete, который работает только с модифицируемым НД. В случае успешного удаления записи текущей становится следующая запись, если же удалялась последняя запись, то курсор перемещается на предыдущую запись, которая после удаления становится последней.

При удалении записи генерируются события BeforeDelete и AfterDelete.

Если при удалении записи требуется подтверждение удаления, то можно написать следующий обработчик события OnClick для кнопки Button «Удалить запись»:

procedure TForm1.Button1Click(Sender: TObject);

Begin

if MessageDlg ('Удалить запись?',

mtConfirmation, [mbYes, mbNo], 0) = mrYes then

Table1.Delete;

end;

Удаление нескольких последовательно расположенных записей имеет особенность, связанную с тем, что при вызове метода Delete в цикле по перебору удаляемых записей не нужно вызывать методы, перемещающие указатель текущей записи. после удаления текущей записи указатель автоматически перемещается на соседнюю (обычно следующую) запись. Так можно удалить все записи НД:

procedure TForm1.Button1Click(Sender: TObject);

var n:longint;

Begin

Table1.Last;

For n:= Table1.RecordCount downto 1 do Table1.Delete;

end;

В примере перебор записей выполняется с конца НД. После удаления текущей записи указатель снова оказывается на последней записи.

Перед удалением записи часто предварительно выполняется поиск записи, удовлетворяющей заданным условиям. Для отбора группы удаляемых записей используется фильтрация. Метод Delete позволяет удалить записи, видимые в НД. Поэтому с помощью фильтрации можно временно оставить в НД записи, которые подлежат удалению, а после удаления фильтрацию отключить.

Практическая работа

 

Создадим приложение для добавления, вставки, удаления записей таблицы Chitateli.db. В программе предусмотреть блокировку изменения записей.

Расположите на форме компоненты в соответствии с рисунком:

 

Для блокировки редактирования НД используется компонент CheckBox1 «Редактирование НД запрещено». Если флажок компонента установлен, то в НД невозможно внести какие-либо изменения. Для компонента CheckBox1 напишите следующий обработчик события OnClick:

procedure Tform1.CheckBox1Click(Sender: TObject);

Begin

if CheckBox1.Checked then

Begin

Table1.Active:=False;

Table1.ReadOnly:=True;

Table1.Active:=True;

End

Else

begin

Table1.Active:=False;

Table1.ReadOnly:=False;

Table1.Active:=True;

end;

end;

 

 

При щелчке по кнопке Добавить запись в конец НД будет появляться дополнительное окно формы в модальном режиме для добавления новой записи:

 

Для этого добавьте к проекту новую форму. Перейдите на первую форму. Выберите в главном меню Delphi пункт меню File, в этом пункте команду Use unit… В появившемся окне выберите Unit2. Нажмите ОК. В окне кода программы появится следующий раздел:

 

Implementation

uses Unit2;

 

Перейдите на вторую форму и выполните аналогичные действия. В окне кода программы появится аналогичный раздел:

Implementation

uses Unit1;

Разместите на второй форме четыре компонента DBEdit. Этот компонент представляет собой поле, в котором возможно отображение и изменение его значений.

Расположите на второй форме две кнопки BitBtn. В процессе ввода пользователь может утвердить ввод, нажав кнопку «Ввод», или отменить его, нажав кнопку «Отмена». После закрытия модальной формы ввода проверяется, какая кнопка нажата. Если «Ввод», то сделанные изменения принимаются, в противном случае – нет.

Для окна формы напишите обработчик события OnCreate:

procedure TForm2.FormCreate(Sender: TObject);

Begin

DBEdit1.DataSource:=Form1.DataSource1;

DBEdit1.DataField:='Fio';

DBEdit2.DataSource:=Form1.DataSource1;

DBEdit2.DataField:='DataR';

DBEdit3.DataSource:=Form1.DataSource1;

DBEdit3.DataField:='Adres';

DBEdit4.DataSource:=Form1.DataSource1;

DBEdit4.DataField:='NomerChit';

BitBtn1.ModalResult:=mrOk;

BitBtn2.ModalResult:=mrCancel;

end;

Для кнопки «Добавить запись в конец НД » напишите обработчик события OnClick:

procedure TForm1.BitBtn1Click(Sender: TObject);

Begin

if table1.ReadOnly=False then

Begin

Table1.Append;

if Form2.ShowModal=mrOk then

Table1.Post

Else

Table1.Cancel;

End

Else

ShowMessage('Редактирование записей запрещено!');

end;

 

Для кнопки «Вставить запись» – следующую процедуру:

procedure TForm1.BitBtn2Click(Sender: TObject);

Begin

if table1.ReadOnly=False then

Begin

Table1.Insert;

if Form2.ShowModal=mrOk then

Table1.Post

Else

Table1.Cancel;

End

Else

ShowMessage('Редактирование записей запрещено!');

end;

Для кнопки «Удалить запись»:

procedure TForm1.BitBtn3Click(Sender: TObject);

Begin

if table1.ReadOnly=False then

Begin

if Messagedlg('Удалить запись?',

mtConfirmation,[mbYes, mbNo],0)=mrYes then

Table1.delete;

End

Else

ShowMessage('Редактирование записей запрещено!');

end;

 

 

После щелчка по этой кнопке на экране появляется окно, в котором происходит подтверждение или отказ от удаления текущей записи:


Глава VII. Работа со связанными таблицами

7.1. Организация связей между таблицами

В частном случае БД может состоять из одной таблицы. Однако, обычно реляционная БД (позволяет обрабатывать различные типы информации совместно) состоит из взаимосвязанных таблиц. Организация связи (отношений) между таблицами называется связыванием или соединением таблиц.

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

Связь между таблицами определяет отношение подчиненности, при котором одна таблица является главной (родительской, или мастером), а другая – подчиненной (дочерней, или детальной). Саму связь (отношение) называют связь «главный-подчиненный», «мастер-детальный».

Для связывания таблиц используются поля связи («совпадающие поля»). Поля связи обязательно должны быть индексированными. В подчиненной таблице для связи с главной таблицей состав полей индекса должен полностью или частично совпадать с составом полей индекса главной таблицы. Значения полей связи в главной и подчиненной таблицах должны совпадать (то есть в этих таблицах должны быть одинаковые поля).

Существуют следующие виды связи:

§ отношение «один-к-одному»;

§ отношение «один-ко-многим»;

§ отношение «много-к-одному»;

§ отношение «много-ко-многим».

Отношение «один-к-одному» означает, что одной записи в главной таблице соответствует одна запись в подчиненной таблице. Такое отношение используется при разбиении таблицы с большим числом полей на несколько таблиц.

Отношение «один-ко-многим» означает, что одной записи главной таблицы в подчиненной таблице может соответствовать несколько записей, в частном случае ни одной. Этот вид отношения встречается наиболее часто. При перемещении в главной таблице текущего указателя на какую-либо запись в подчиненной таблице автоматически становятся доступными записи, значения полей которых равны значению поля связи текущей записи главной таблицы. Такой отбор записей в подчиненной таблице является своего рода фильтрацией.

Отношение «много-к-одному» отличается от отношения «один-ко-многим» только направлением. Если на отношение «один-ко-многим» посмотреть со стороны подчиненной таблицы, а не главной, то оно превращается в отношение «много-к-одному».

Отношение «много-ко-многим» имеет место, когда одной записи главной таблице может соответствовать несколько записей подчиненной таблицы и одновременно одной записи подчиненной таблицы – несколько записей главной таблицы. На практике такое отношение используется достаточно редко.

Работа со связанными таблицами имеет следующие особенности:

§ При изменении (редактировании) поля связи может нарушиться связь между записями двух таблиц, поэтому при редактировании поля связи записи главной таблицы нужно соответственно изменять и значения поля связи всех подчиненных записей.

§ При удалении записи главной таблицы нужно удалять и соответствующие ей записи в подчиненной таблице (каскадное удаление).

§ При добавлении записи в подчиненную таблицу значение поля связи формируется автоматически по значению поля связи главной таблицы.

При разработке приложения программист должен обеспечить следующее:

§ организация связи между таблицами;

§ контроль (запрет) редактирования полей связи;

§ организация каскадного удаления записей.

§

Практическая работа

Организация учета книг в библиотеке.

Создайте две таблицы в Database Desktop:

1. Таблица карточек читателей (фамилия, имя, отчество читателя (поле FIO), дата рождения (поле DataR), адрес (поле Adres), номер читательского билета (поле NomerChit)). Сохраните таблицу под именем Chitateli.db на диске С: в папке Baza.

2. Таблица выдачи книг (автор книги (Avtor), название книги (NameBook), номер читательского билета (NomerChit), дата выдачи (DataV), срок возврата книги (SrokV)). Сохраните таблицу под именем Book.db на диске С: в папке Baza.

Между таблицами нужно установить связь «мастер-детальный», при которой таблица Chitateli.db будет главной, а таблица Book.db – подчиненной. Для организации связи в качестве поля связи главной таблицы выберем поле NomerChit, которое необходимо сделать ключевым, т.е. чтобы значения в этом поле не повторялись. В подчиненной таблице Book.db полем связи будет поле NomerChit. Проиндексируйте обе таблицы по полям NomerChit (одинаковое поле в таблицах). Назовите индексные файлы indNomer.

В верхней части формы установите и свяжите между собой компоненты для работы с таблицей Chitateli.db, в нижней – компоненты для работы с таблицей Book.db. Переименуйте поля таблиц, присвоив им русские заголовки.

Для организации связи между таблицами в подчиненной таблице для компонента Table2 нужно установить следующие свойства:

§ MasterSource – источник данных главной таблицы (выбор главной таблицы) – Table1;

§ IndexName – текущий индекс подчиненной таблицы – indNomer;

§ MasterFields – поле или поля связи индекса главной таблицы. При выборе этого свойства на экране появляется окно специального Редактора полей связи (Field Link Designer). В списке Detail Fields выбирается поле подчиненной таблицы, а в списке Master Fields – поле главной таблицы. После нажатия кнопки Add выбранные поля связываются между собой, что отображается в списке Joined Fields. Заполнение свойства MasterFields происходит после закрытия окна при нажатии кнопки OK.

 

После установки всех нужных для связывания таблиц свойств запустите программу и заполните первую запись таблицы Chitateli.db, затем перейдите к заполнению таблицы Book.db (несколько записей, потому что один читатель может взять несколько книг), затем снова к заполнению таблицы Book.db и так далее. В таблице Chitateli.db должно быть не меньше 5 записей. Следите за тем, чтобы у связанных записей совпадали номера читательских билетов.

Пример работы программы показан на рисунке

Создадим главное меню программы, как показано на рисунке:

Для этого нужно к проекту добавить еще три формы. На второй форме создать главное меню программы согласно рисунка. На третью форму скопируйте компоненты для работы с таблицей Chitateli.db. В заголовке формы – Таблица «Читатели». На четвертую форму скопируйте компоненты для работы с таблицей Book.db. В заголовке формы – Таблица «Книги». Для каждого пункта меню напишите обработчики событий, чтобы при выборе пункта на экране появлялось окно с выбранными таблицами. Например:

procedure TForm2.N2Click(Sender: TObject);

Begin

Form3.Show;

end;

Оставшиеся процедуры напишите самостоятельно.

Чтобы можно было при выборе пунктов главного меню второй формы (содержит главное меню) показывать на экране другие формы, нужно подключить модули форм ко второй форме. Это можно выполнить следующим образом. Перейти на вторую форму, выполнить команду File\Use Unit… В появившемся окне выделить имена модулей остальных форм и нажать ОК. В модуле второй формы после слова implementation (раздел реализаций) автоматически пропишется следующее:

uses Unit3, Unit4, Unit1;

Работа готовой программы показана на рисунке:

 

Самостоятельная работа

Создать БД «Музыкальная картотека» по примеру предыдущей практической работы



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 486; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.24.134 (0.115 с.)