Лабораторная работа «Запросы на модификацию данных»
Теория
Рассмотрим формирование и выполнение запросов на модификацию данных в таблицах. К таким запросам относятся запросы:
INSERT – добавление записей;
DELETE – удаление записей;
UPDATE – обновление значений атрибутов записей.
Синтаксис запроса на добавление записей:
INSERT INTO <имя таблицы>[(<имя столбца>,...)]
{VALUES (<значение столбца>,…)}
| <выражение запроса SELECT >
Оператор INSERT вставляет новые записи в таблицу. При этом значения столбцов могут представлять собой литеральные константы, либо являться результатом выполнения другого запроса на выборку. В первом случае для вставки каждой строки используется инструкция VALUES; во втором случае – запрос на выборку SELECT, при этом может быть вставлено столько строк, сколько возвращается запросом.
Синтаксис запроса на удаление записей:
DELETE [имя-таблицы.*]
FROM имя-таблицы [AS псевдоним ]
[WHERE условие-отбора]
Удаляет одну или несколько строк из указанной после слова DELETE таблицы. Удаляются записи, которые удовлетворяют условию отбора в инструкции WHERE. Если слов WHERE отсутствует, то удаляются все записи таблицы.
Синтаксис запроса на обновление записей:
UPDATE имя-таблицы
SET имя-столбца1 = выражение1, имя-столбца2 = выражение2,...
[WHERE условие-отбора]
В указанной таблице обновляютсят выбранные столбцы (присваивая значение заданного выражения либо Null) во всех строках, удовлетворяющих условию отбора. Если в инструкции не используется предложение WHERE, то обновляются все строки таблицы или запроса.
Формирование запросов на модификацию данных с использованием технологии ADO выполняется аналогично запросам на выборку. Для этого используется компонент TADOQuery и его свойство SQL.Add(‘текст запроса’).
|
Для выполнения модифицирующего запроса используется метод ExecSQL. Целочисленное свойство RowsAffected возвращает количество записей, которых коснулся запрос.
Например,
ADOQuery1.SQL.Add(‘DELETE FROM Сотрудник WHERE Таб_номер=12’);
ADOQuery1. ExecSQL;
Showmessage(‘Удалено ’+ IntToStr(ADOQuery1. RowsAffected)+ ‘ записей’);
Данный запрос удаляет из таблицы Сотрудник запись о сотруднике с табельным номером, равным 12 и выводит на экран сообщение об этом. Если такая запись не будет найдена, то это не ошибка, и на экран будет выведено: «Удалено 0 записей».
Модификация таблицы «Отдел»
1. Создайте новое приложение Delphi, содержащее форму Form1 – форма «Отделы». На форму поместите компоненты доступа ADOConnection1 (связь с БД СОТРУДНИК- ОТДЕЛ), компонент ADOTable1 (таблица Отдел), источник DataSource1 (связь с набором данных ADOTable1).
2. Поместите на форму визуальные компоненты согласно рисунку 3.
3. На форме Form1 с информацией об отделах разместите компонент ADOQuery1. Установите его соединение с базой банных -ADOConnection1 из первой формы Form1. Теперь можно составлять запросы к таблицам указанной базы данных.
4. Для редактирования или добавления записей имеется панель Panel1. Необходимо удалить с панели компоненты DBEdit и разместить компоненты Edit, рис.1.
Рис.1
5. Задайте необходимые надписи и другие свойства компонентам. Свойство Panel1.Caption очистите. О чистите свойство Text у всех компонентов Edit.
Компонент Edit1 будет отображать номер отдела. Так как это значение нельзя пользователю редактировать, то следует сделать его недоступным для редактирования. Для этого задайте:
|
Edit1.Enabled:=False;
Сделайте недоступным для редактирования компонент DBGrid1 с помощью свойства ReadOnly=true.
6. Уберём из навигатора DBNavigator1 кнопки редактирования записей с помощью соответствующих опций свойства VisibleButtons, рис.2.
Рис.2
На форме уже имеются кнопки «Добавление», «Редактирование» и «Удаление», которые будут формировать и выполнять запросы на изменение данных.
Форма имеет вид, рис. 3.
Рис.3
7. Проверьте, как выглядит эта форма при запуске. Сделайте так, чтобы отсутствовал горизонтальный скроллинг у компонента DBGid1.
8. Сделайте невидимой панель Panel1.visible:=False или горизонтальный размер формы таким, чтобы панель сначала не было видно.
Панель Panel1 будет отображаться тогда, когда необходимо выполнить добавление или редактирование записи.
Запрос на добавление.
Предварительно объявите глобальную переменную k типа byte в разделе var текущей формы:
var
Form2: TForm2;
k: byte;
Она понадобится для того, чтобы определить режим работы с панелью: вставка (k=1) или изменение (k=2) записи.
При нажатии на кнопку «Добавление » должны произойти следующие действия:
1) Очистить поля ввода:
Edit1.Text:= ‘’; Edit2.Text:= ‘’; Edit3.Text:= ‘’;
2) Сделать панель видимой:
3) Переменной k задать значение 1, что соответствует режиму добавления новой записи:
k:=1;
Поместите на панели надпись, которая будет отражать режим работы: «Добавление отдела» или «Редактирование отдела».
Поместите эти действия в событие нажатия на кнопку «Добавление».
Определим действия, которые должны выполняться при нажатии на кнопку «Подтвердить ». Создайте обработчик события onClick для этой кнопки.
|
После заполнения полей следует выполнить запрос INSERT.
1) Проверка заполнения поля. В данном случае обязательным для заполнения является поле названия отдела. Поэтому необходимо проверить, чтобы оно было заполнено. Если поле пусто, то вывести сообщение и остановить процедуру:
if Edit2.Text='' then
begin
showmessage('Введите название отдела');
exit;
end;
Поместите этот фрагмент в начало процедуры.
2) Формирование запроса. Создадим текст запроса с использованием параметров:
ADOQuery1.SQL.Add ('INSERT INTO Отдел (Название, Телефон) VALUES (:pNazv,:pTel)');
3) Настройка параметров
ADOQuery1.Parameters.ParamByName('pNazv').Value:=Edit2.Text;
ADOQuery1.Parameters.ParamByName('pTel').Value:=Edit3.Text;
4) Выполнение запроса
ADOQuery1.execsql;
5) Скрытие панели
Panel1.Visible:=false;
6) Обновление набора данных – таблицы «Отдел»
ADOTable1.Close; ADOTable1.Open;
Нажатие на кнопку «Отменить » должно только скрыть панель без выполнения запроса. Создайте обработку этого события.
Проверьте работу приложения при добавлении нового отдела.
Запрос на обновление.
При нажатии на кнопку «Редактирование » должны произойти следующие действия:
4) Поля ввода заполнить значениями полей текущей записи.
Например,
Edit1.Text:=ADOTable1.FieldByName('Номер_отд').AsString;
Другие поля заполните аналогично.
5) Сделать панель видимой:
Panel1.visible:=True;
6) Переменной k задать значение 2, что соответствует режиму добавления новой записи:
k:=2;
Поместите эти действия в событие нажатия на кнопку «Редактирование ».
Необходимо отредактировать процедуру нажатия на кнопку «Подтвердить » так, чтобы в зависимости от режима работы пользователя, выполнялся бы запрос на добавление или на редактирование. Для этого используйте оператор выбора case переменной k:
case k of
1: begin
// формирование запроса на добавление записи
end;
2: begin
// формирование запроса на обновление записи
end;
end;
Запрос на обновление может касаться названия и телефона отдела для заданного номера отдела. Строка запроса:
'UPDATE Отдел SET Название=:pNazv, Телефон=:pTel WHERE Номер_отд=' + Edit1.text
Настройку параметров выполнить аналогично. Отладьте процедуру выполнения запросов.
Примечание. После редактирования позиционируйте измененную запись с помощью функции Locate.
Запрос на удаление.
При удалении текущей записи необходимо сформировать и выполнить запрос DELETE. Запросить подтверждение у пользователя данного действия с помощью функции MessageDlg() (см. лаб.раб.№2).
Удаление будет касаться текущей записи, поэтому строка запроса может иметь вид:
'DELETE FROM Отдел WHERE Номер_отд=:pNom'
Значение параметра:pNom' определите с помощью функции FieldByName() – номер отдела текущей записи.
Сформируйте событие нажатия на кнопку «Удаление », состоящее из подтверждения действия, формирования и выполнения запроса DELETE. Проверьте работу приложения.
Задание. Удалять можно только тот отдел, в котором нет ни одного сотрудника. Если же в отделе имеется хотя бы один сотрудник, то запретить удаление, а пользователю вывести сообщение: «Отдел удалить нельзя. Имеются сотрудники.»
Для этого сначала выполните запрос SELECT к таблице Сотрудник для выборки сотрудников данного отдела. Если в результате запроса будет найдена хотя бы одна запись, то запретить удаление отдела. Если результат поиска даст ноль записей, то у пользователя запросить подтверждение действия. И, если пользователь ответит положительно, то выполнить запрос на удаление.