
- •Раздел 1. Проектирование баз данных. 2
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi. 25
- •Раздел 1. Проектирование баз данных.
- •1.1. Основы построения баз данных. Модели данных.
- •1.1.1. Реляционная модель данных.
- •1.1.2. Нормализация базы данных.
- •1.2. Проектирование базы данных методом “сущность-связь”.
- •Раздел 2. Разработка приложений для работы с Базами Данных в среде Delphi.
- •2.1. Технология создания информационной системы.
- •2.1.1.Создание таблиц базы данных в Database Desktop.
- •2.1.2. Целостность базы данных.
- •Программа bde Administrator и модули данных.
- •Компоненты доступа и работы с данными. Тема: Наборы данных. Состояние и режимы наборов данных.
- •Тема: Объекты поля. Операции с полями.
- •Тема. Отображение и выбор значения поля.
- •Тема. Визуальные компоненты отображения записей из набора данных.
- •Закладки.
- •Тема. Ограничения на вводимые значения.
- •Тема. Сортировка набора данных.
- •Тема. Операции с таблицей базы данных.
- •Тема. Фильтрация записей.
- •Тема. Поиск записей.
- •Тема. Модификация набора данных.
- •Тема. Работа с отчетами
- •Отчет для связанных наборов данных
- •Составной отчет
- •Модули данных
- •Конструктор отчетов Rave Report
- •Реляционный способ доступа к данным.
- •Основные сведения о языке sql.
- •Оператор выбора Select.
- •Агрегирование и группирование записей.
- •Объединение таблиц.
- •Вложенные запросы.
- •Модификация записей.
- •Примеры баз данных
Тема. Модификация набора данных.
Модификация набора данных – это редактирование, добавление и удаление записей.
Свойства набора данных Table:
ReadOnly: Boolean; - для таблицы устанавливается режим доступа только для чтения. Изменять значение можно только для закрытого набора данных.
CanModify: Boolean; - (только для чтения) определяет, может ли приложение выполнять вставку, редактирование и удаление записей в таблице.
Например,
If not Table1.CanModify then begin
Showmessage(Записи нельзя изменять!);
Exit;
End;
Свойство источника данных DataSource:
AutoEdit:Boolean; - определяет, будет ли автоматически вызываться метод Edit набора данных при получении фокуса элементом управления, который ассоциирован с источником данных (DBGrid или DBEdit).
Редактирование записей заключается в изменении значений полей записей. Отредактировать можно только текущую запись. После установки указателя на нужную запись необходимо выполнить следующее:
перевести набор данных в режим редактирования;
изменить значения полей записи;
подтвердить сделанные изменения или отменить их.
Для различных визуальных компонентов перевод в режим редактирования осуществляется различными способами. Например, для компонентов DBGrid и DBEdit необходимо щелкнуть в нужном поле, или нажать алфавитно-цифровую клавишу, когда курсор находится в этом поле.
Изменение значений полей выполняется с помощью визуальных компонентов или программно с помощью операторов присваивания. Необходимо учитывать тип поля. Если набор данных является модифицируемым, то будут произведены следующие действия:
генерируется событие BeforeEdit, которое можно обработать;
из набора данных считывается текущая запись и временно для нее устанавливается доступ только для чтения;
если запись содержит вычисляемые поля, то они пересчитываются;
набор данных переводится в режим редактирования;
генерируется событие OnDataChange для связанного с набором данных источника данных;
генерируется событие AfterEdit.
Например,
TbTovar.FieldByName('T_Kol_vo').AsInteger:=StrToInt(Edit1.Text);
TbTovar.FieldByName(T_Nazv').AsString:= Edit2.Text;
Методы набора данных Table:
Edit; - переводит набор данных в режим редактирования, то есть в состояние dsEdit.
Post; override; - записывает измененную запись в базу данных и переводит набор данных в режим просмотра. Может вызываться только тогда, когда набор данных находится в состоянии dsEdit или dsInsert. Метод вызывается автоматически при перемещении курсора на новую текущую запись, если набор данных находится в состоянии dsEdit или dsInsert. Если при вызове этого метода набор данных не находился в режиме редактирования, то будет сгенерирована исключительная ситуация.
Cancel; - отменяет изменения, сделанные при редактировании до применения Post. Генерируются события BeforeCancel и AfterCancel. Отменить внесенные изменения можно также при работе с компонентом DBGrid, нажав клавишу Esc.
Refresh; - извлекает данные из базы данных для обновления набора данных,
SetFields (const Values: array of const); - устанавливает значения всем полям записи, используя порядок полей в таблице. Значения полей могут быть литералы, переменные, NULL или nil. Здесь Values – массив значений, которые присваиваются полям текущей записи, nil – без изменения значения. После выполнения метода набор данных переводится в режим просмотра.
!!! Ключевое слово nil означает отсутствие значения, а слово null подразумевает нулевое значение.
Например,
TbTovar.Edit;
TbTovar.SetFields([nil,Edit1.Text,100,nil,nil]);
TbTovar.Post;
Например.
// изменение данных в поле T_Cena таблицы Tovar.
if TbTovar.CanModify then begin
TbTovar.Edit; // перевод в режим редактирования
TbTovar.FieldByName('T_Cena').AsString:=Edit1.Text;
TbTovar.Post; // запись данных в физическую таблицу
TbTovar.Refresh; //обновление содержимого визуальных компонентов
end
else MessageDlg(Редактирование невозможно!!',
mtInformation,[mbOk],0);
Добавление записи возможно, если разрешена модификация набора данных. Подтверждение добавлений выполняется методом Post, а отмена методом Cancel.
Методы набора данных Table:
Insert; –переводит State в состояние dsInsert, вставляет новую пустую запись в позицию, на которой находится указатель текущей записи. Заполнить запись можно методом SetFields,
InsertRecord (const Values: array of const); - вставляет новую запись в текущую позицию курсора и одновременно задает значения всех или некоторых ее полей.
Append и AppendRecord аналогичны методам Insert и InsertRecord, только добавляют новую запись в конец набора данных.
Например,
TbTovar.Insert; // перевод набора в режим вставки
TbTovar.FieldByName('T_Nazv').AsString:=Edit1.text;
TbTovar.Post; // запись сделанных изменений
Например,
TbTovar.InsertRecord([EdTovar.text,EdCena.text, StrToInt(EdKol_vo.text),EdPrim.text]);
При использовании компонента DBGrid добавление новой записи можно выполнить двойным щелчком на записи, перед которой будет вставлена новая. После установки курсора нужно нажать клавишу Ins, и появиться пустая строка.
Удаление записи можно производить только из модифицируемого набора данных. Удаляется текущая запись с помощью метода:
Delete; - удаляет активную запись из базы данных, и перемещает курсор на следующую запись. Если в момент удаления набор данных не активен, то инициируется исключительная ситуация. При удалении записи выполняются обработчики событий BeforeDelete и AfterDelete.
Пример Модификация записей в БД “Pokupka”.
Добавление записи в таблицу Tovar
// проверка на наличие такой записи в наборе данных
If DM2.TbTovar.Locate('T_Nazv;T_Cena', VarArrayOf([LENazv.Text,LECena.Text]),[]) then ShowMessage('Такая запись уже есть!')
else Begin
// добавление записи
DM2.TbTovar.Append;
DM2.TbTovarT_Nazv.AsString:=LENazv.Text;
DM2.TbTovarT_Cena.AsVariant:=LECena.Text;
DM2.TbTovar.Post;
end;
Редактирование текущей записи в таблице Tovar
// проверка на наличие такой записи в наборе данных
If DM2.TbTovar.Locate('T_Nazv;T_Cena', VarArrayOf([LENazv.Text,LECena.Text]), [loCaseInsensitive,loPartialKey]) then ShowMessage ('Такая запись уже есть!')
else Begin
// сохранение отредактированной записи
DM2.TbTovar.Edit;
DM2.TbTovarT_Nazv.AsString:=LENazv.Text;
DM2.TbTovarT_Cena.AsVariant:=LECena.Text;
DM2.TbTovar.Post;
end;
Удаление текущей записи в таблице Tovar, каскадное удаление
var n:Variant;
begin
// определение кода названия товара
n:=DM2.TbTovarT_Code.AsVariant;
// проверка на наличие такой записи в наборе данных Pokupka
if DM2.TbPokupka.Locate('P_Tovar',VarArrayOf([n]),
[loCaseInsensitive,loPartialKey]) then begin
if MessageDlg('Соответствующая запись в таблице Pokupka есть!'+#13+'Выполнить каскадное удаление?',
mtConfirmation,[mbYes,mbNo],0)=mrYes then begin
// удаление соответствующих записей в таблице Pokupka
with DM2.TbPokupka do begin
First;
while not eof do begin
if FieldByName('P_Tovar').AsVariant=n then Delete
else Next;
end; end;
// удаление выбранной записи в таблице Tovar
DM2.TbTovar.Delete;
end end
else DM2.TbTovar.Delete; end;
Добавление новой записи в таблицу Pokupka
var cod:Variant;
begin
// определение кода названия товара
DM2.TbTovar.IndexFieldNames:='T_Nazv';
cod:=DM2.TbTovar.Lookup('T_Nazv',ComboBox1.Text,'T_Code');
// проверка на наличие такой записи в наборе данных
if DM2.TbPokupka.Locate('P_Tovar;P_Date;P_Kol_vo',
VarArrayOf([cod,DateTimePicker1.Date,LEKol_vo.Text]), [loCaseInsensitive,loPartialKey]) then ShowMessage('Такая запись уже есть!')
else Begin
DM2.TbPokupka.Append;
Dm2.TbPokupka.SetFields([nil,DateTimePicker1.Date, cod,StrToInt(LEKol_vo.Text)]);
DM2.TbPokupka.Post;
end; end;
Редактирование текущей записи в таблице Pokupka
var cod:Variant;
begin
// определение кода названия товара
DM2.TbTovar.IndexFieldNames:='T_Nazv';
cod:=DM2.TbTovar.Lookup('T_Nazv',ComboBox1.Text,'T_Code');
// проверка на наличие такой записи в наборе данных
if DM2.TbPokupka.Locate('P_Tovar;P_Date;P_Kol_vo',
VarArrayOf([cod,DateTimePicker1.Date,LEKol_vo.Text]), [loCaseInsensitive,loPartialKey]) then ShowMessage('Такая запись уже есть!')
else Begin
// сохранение отредактированной записи в наборе данных
DM2.TbPokupka.Edit;
DM2.TbPokupkaP_Date.AsVariant:=DateTimePicker1.Date;
DM2.TbPokupkaP_Kol_vo.AsVariant:=LEKol_vo.Text;
DM2.TbPokupkaP_Tovar.AsVariant:=cod;
DM2.TbPokupka.Post;
end;
end;
Удаление текущей записи из таблицы Pokupka
DM2.TbPokupka.Delete;