Практическая работа №11 Тема: Модификация набора данных. Цели: Изучить процесс модификации данных в БД программным способом. Изучить процедуры Edit, Post, Insert, Append, Delete и их назначение. Научиться программно модифицировать НД: добавление, удаление записей. I. Теоретическая часть Модификация НД представляет собой редактирование, добавление и удаление его записей. Модифицируемость НД зависит от различных условий. Можно разрешить или запретить изменение НД с помощью соответствующих свойств. Управлять возможностью изменения НД Table можно с помощью свойства ReadOnly типа Boolean. Если значение этого свойства = True, то изменения записей запрещаются. По умолчанию свойство ReadOnly имеет значение False, и НД можно модифицировать. Для проверки, можно ли изменять НД, предназначено свойство CanModify типа Boolean. Если это свойство имеет значение True, то НД изменять можно, а если False, то изменения в НД запрещены. 1. Редактирование записей Редактирование записей заключается в изменении значений их полей. Отредактированой может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняют операции по поиску и перемещению на требуемую запись. После того, как указатель текущей записи установлен на нужную запись и НД находится в режиме просмотра, для редактирования записи следует: перевести НД в режим редактирования; изменить значения полей записи; подтвердить сделанные изменения или отказаться от них, в результате чего НД снова перейдет в режим просмотра. НД переводится в режим редактирования вызовом метода 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 (Отменить изменения). 2. Добавление записей Добавлять записи можно только к модифицируемому НД. Для добавления записи нужно выполнить следующие действия: перевести НД в режим вставки; задать значения полей текущей записи; подтвердить сделанные изменения или отказаться от них, после чего НД снова переходит в режим просмотра. Метод Insert переводит НД в режим вставки и добавляет к нему новую пустую запись. Новая запись вставляется перед текущей записью. При необходимости перед вызовом метода Insert необходимо выполнить перемещение текущего указателя на ту запись НД, перед которой вставляется новая запись. Метод Append вставляет новую запись в конец НД. Для компонента DBGrid новая запись добавляется к НД при нажатии клавиши [Insert] или при переходе на последнюю запись. Если на форме находится компонент DBNavigator , то новая запись добавляется при нажатии кнопки Insert Record (Вставить запись). 3. Удаление записей Удаление текущей записи выполняет метод 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 позволяет удалить записи, видимые в НД. Поэтому с помощью фильтрации можно временно оставить в НД записи, которые подлежат удалению, а после удаления фильтрацию отключить. II. Практическая часть Создадим приложение для добавления, вставки, удаления записей таблицы 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; После щелчка по этой кнопке на экране появляется окно, в котором происходит подтверждение или отказ от удаления текущей записи. III. Контрольные вопросы 1. 2. 3. 4. 5. Для чего используются процедуры Edit, Post, Insert, Append, Delete? Как программно выполнить редактирование записи? Как добавить запись? Как программно выполнить удаление записи? Как очистить таблицу БД?