Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_БД.doc
Скачиваний:
28
Добавлен:
04.05.2019
Размер:
4.03 Mб
Скачать

Тема. Модификация набора данных.

Модификация набора данных – это редактирование, добавление и удаление записей.

Свойства набора данных Table:

ReadOnly: Boolean; - для таблицы устанавливается режим доступа только для чтения. Изменять значение можно только для закрытого набора данных.

CanModify: Boolean; - (только для чтения) определяет, может ли приложение выполнять вставку, редактирование и удаление записей в таблице.

Например,

If not Table1.CanModify then begin

Showmessage(Записи нельзя изменять!);

Exit;

End;

Свойство источника данных DataSource:

AutoEdit:Boolean; - определяет, будет ли автоматически вызываться метод Edit набора данных при получении фокуса элементом управления, который ассоциирован с источником данных (DBGrid или DBEdit).

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

  1. перевести набор данных в режим редактирования;

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

  3. подтвердить сделанные изменения или отменить их.

Для различных визуальных компонентов перевод в режим редактирования осуществляется различными способами. Например, для компонентов 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”.

  1. Добавление записи в таблицу 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;

  1. Редактирование текущей записи в таблице 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;

  1. Удаление текущей записи в таблице 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;

  1. Добавление новой записи в таблицу 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;

  1. Редактирование текущей записи в таблице 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;

  1. Удаление текущей записи из таблицы Pokupka

DM2.TbPokupka.Delete;