- •Уо «витебский государственный политехнический колледж» основы алгоритмизации и программирования Методическое пособие по курсовому проектированию
- •Создание приложения с базой данных (информационно-поисковой системы либо автоматизированного рабочего места)
- •Подключение базы данных ms Access к приложению Borland Delphi 7
- •Навигация по записям базы данных
- •Организация поиска записей в таблице
- •Работа с рисунками
- •Создание файла справки
Навигация по записям базы данных
Настроив внешний вид таблицы, займемся навигацией по ней. Простейшим средством для этого служит компонент DBNavigator с вкладки Data Controls. Он позволит переходить по записям, добавлять и удалять записи. DBNavigator так же, как и компоненты ранее, следует подключить к соответствующему DataSourse (через свойство DataSet).
Однако можно организовать навигацию и самостоятельно. Для этого на форму помещаются кнопки (Button, BitBtn, SpeedButton) и пишется соответствующая обработка на их нажатие. Кнопки можно заменить картинками – Image, и организовать обработку по тому же событию OnClick.
Следует помнить, что работаем мы с записями таблицы в базе данных, т.е. не с DBGrid, а с компонентом ADOTable или ADOQuery. Переход на запись вперед осуществляется командой Next, на запись назад - командой Prior. Команды Last и First выполняют переход на последнюю и первую запись в таблице соответственно.
Для работы с информацией в таблице нужно переводить ее в соответветствующий режим. Так, для добавления новой записи следует сначала вставить в имеющуюся таблицу пустую строку, а затем в эту строку уже сохранить внесенные данные. Для вставки пустой строки служат методы Insert и Append (напоминаю, что мы работаем с ADOTable или ADOQuery). Первый вставляет пустую строку в текущую позицию, а второй – в конец списка записей.
Для сохранения внесенной информации служит метод Post.
Если же нам нужно внести изменения в имеющиеся данные в таблице, нужно перевести ее в режим редактирования командой Edit, а по завершению редактирования сохранить изменения все тем же методом Post.
Для удаления записи служит метод Delete. Данный метод автоматически переводит указатель на следующую за удаленной запись. Поэтому, если вы хотите удалить, к примеру, все записи, это делает следующий код:
while not ADOTable1.Eof do begin ADOTable1.Delete; end;
Организация поиска записей в таблице
Поиск (выборку записей по заданному критерию) можно осуществить 2 способами: через компонент ADOQuery с помощью свойства SQL и через компонент ADOTable, например, с помощью свойства Filter.
Немного теории.
Свойство Filter компонента ADOTable.
Filter – это строка, которая служит для задания критерия, по которому производится выборка записей. В ней нужно указать имя поля, по которому идет фильтрация, затем = ( если нужно полное совпадение) либо LIKE (если мы хотим организовать поиск и по части слова) и само значение, по которому выбираются записи.
Допустим, есть таблица с полями Фамилия, Имя, Отчество. Нужно фильтровать данные по одному из полей (на выбор), т.е. пользователь должен иметь возможность выбрать по какому из полей фильтровать данные. Задача стоит такая отсеивать данные по мере ввода искомой строки в Edit.
Расположим на форме компоненты Combobox и Edit. Combobox будет использоваться для выбора столбца, а в Edit будет вводится искомое слово. Заполняем свойство Items в Combobox именами столбцов. Затем в обработчике события Edit1Change пишем следующее:
procedure TForm1.Edit1Change(Sender: TObject); begin if Length(Edit1.Text) > 0 then begin ADOTable1.Filtered:=false; ADOTable1.Filter:=Combobox1.Text + ' LIKE ' + #39 + Edit1.Text + '%' + #39; ADOTable1.Filtered:=true; end else ADOTable1.Filtered:=false; end;
Прокомментирую код: если Edit не пустой (при пустом вылетит ошибка), отключаем фильтрацию, формируем строку фильтра, запускаем фильтрацию, если Edit пустой - отключаем фильтрацию. В самом простом случае, если не нужно давать возможность выбора определенного столбца, а фильтровать по одному конкретному полю(например "ФАМИЛИЯ"), строка фильтра выглядела бы следующим образом: ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ #39 + Edit1.Text + '%' + #39;
|
Строка-условие фильтра означает следующее - выбрать те записи из столбца 'ФАМИЛИЯ', которые начинаются с тех же символов, что и набраны в Edit1.Text.
Особое внимание обратите на пробелы - "потеряете" пробел - не будет работать.
Ключевое слово LIKE позволяет по заданному шаблону сравнивать строки. При этом нужно знать следующее:
символ '_' (подчеркивание) – заменяет любой одиночный символ,
символ '%' (процент) – заменяет любую последовательность из символов.
Знак #39 - означает номер символа ' (одинарная кавычка) в кодовой таблице ASCII. Дело в том, что значение на фильтрацию нужно указывать в одинарных кавычках, а так как одинарные кавычки используются в Delphi для ограничения строк, то чтобы внутри строки поставить одинарную кавычку, её нужно поставить дважды. Конструкция #39 + Edit1.Text + '%' + #39 идентична '''' + Edit1.Text + '%' + ''''.
Если, например, нужно искать любое вхождение искомой строки в записях, а не начиная с первого символа, то строка фильтра выглядела бы следующим образом:
ADOTable1.Filter:='ФАМИЛИЯ LIKE ' + #39 + '%' + Edit1.Text + '%' + #39;
Заметили '%' перед Edit1.Text? Переводится так - выбрать те записи из столбца 'ФАМИЛИЯ', в которых есть последовательность символов, которые набраны в Edit1.Text.
Часто нужно фильтровать по нескольким столбцам. Тут применяется немного иная конструкция.
Добавим еще два компонента Edit на форму. Combobox использовать не будем, его можно удалить, т.к. у нас каждое поле (Edit) будет отвечать за ввод информации по определенному столбцу. Еще добавим кнопочку, она будет запускать фильтрацию. Казалось бы, следующая конструкция должна корректно работать:
procedure TForm1.Button1Click(Sender: TObject); begin ADOTable1.Filtered:=false; ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ #39 + Edit2.Text + '%' + #39 +' AND ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39 + ' AND ' + 'ОТЧЕСТВО LIKE ' + #39 + Edit4.Text + '%' + #39; ADOTable1.Filtered:=true; end;
Она и работает, но только в том случае, если данные введены во все три поля. Если одно из полей ввода(Edit) пустое - вылетает ошибка "Аргументы имеют неверный тип". Впрочем, есть способ с этим бороться. Сначала код:
procedure TForm1.Button1Click(Sender: TObject); var filtr, // формируемая строка фильтра add: string; begin ADOTable1.filtered:=false; filtr:=''; if length(edit2.text) > 0 then filtr:= 'ФАМИЛИЯ LIKE '+ #39 + Edit2.Text + '%' + #39; if length(edit3.text) > 0 then begin if length(filtr) > 0 then add:= ' and ' else add:=''; filtr:=filtr + add + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39; end; if length(edit4.text) > 0 then begin if length(filtr) > 0 then add:= ' and ' else add:=''; filtr:=filtr + add + 'ОТЧЕСТВО LIKE '+ #39 + Edit4.Text + '%' + #39; end; if length(filtr) > 0 then begin ADOTable1.Filter:= filtr; ADOTable1.filtered:=true; end else Showmessage('Все поля пусты!'); end;
Смысл такой: нужно провести проверку, пустое поле ввода или нет, а затем уже формировать строку фильтра. Причем начиная со второго поля ввода нужно проверять и строку фильтра. Это нужно для последующего правильного формирования строки.
Например, если поле Edit2 (Фамилия) пустое, то соответственно и строка фильтра будет пуста (filtr:='') , а, например, поле Edit3 (ИМЯ) заполнено, это значит, строка фильтра должна иметь вид 'ИМЯ LIKE ' + #39 + Edit3.Text + '%' + #39 , а не ' and ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39 , (т.е. без ' and ' вначале). Следующий фрагмент кода это и выполняет:
..... if length(edit3.text) > 0 then begin if length(filtr) > 0 then add:= ' and ' else add:=''; filtr:=filtr + add + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39; end; .....
Если Edit3 не пустое, то проверяем строку фильтра(filtr) если она не пуста, то прибавляем к сторке фильтра ' and ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39, если пуста, то просто 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39.
Присваиваем сформированную строку(filtr) свойству ADOTable1.Filter и запускаем фильтрацию.
..... if length(filtr) > 0 then begin ADOTable1.Filter:= filtr; ADOTable1.filtered:=true; end else Showmessage('Все поля пусты!'); .....
Соответственно, если на этом этапе filtr='', значит, ни одно из полей не было заполнено, о чем и выводим соответствующую надпись.
Кроме операции and можно использовать и другие логические операции or, not, xor, при формирования строки-условия фильтрации по нескольким столбцам, хотя такая необходимость возникает достаточно редко.
Теперь рассмотрим организацию поиска через ADOQuery. Поиск можно осуществлять как на текущей, так и на другой форме.
Приступим к организации самого поиска. Для этого нам нужен компонент ADOQuery. Предварительно не забудьте «познакомить» формы и юниты друг с другом (см. рисунок ниже).
После этого в свойстве Connection компонента ADOQuery станет доступен компонент ADOConnection с формы1.
Следующее свойство, самое важное, отвечающее за сам поиск – свойство SQL. В него мы должны внести запрос, формирующий результирующую таблицу. К примеру, запрос на рисунке выбирает все поля из таблицы base, в которых значение поля price равно 55000. Последнее свойство, которое нужно указать – свойство Active устанавливаем в true.
Для отображения результата поиска нужны еще 2 компонента: DataSource (в свойстве DataSet указываем ADOQuery) для привязки результата к сетке таблицы на форме и сама таблица DBGrid (в свойстве DataSource указываем тот DataSource, который только что поместили на форму). Результат должен уже отобразиться в таблице.
Если вы хотите осуществлять несколько видов поиска, не обязательно для каждого из них делать отдельную форму и использовать отдельный компонент ADOQuery. К примеру, можно организовать это следующим образом:
Т.е. вносить значение в свойство SQL не вручную, а программно, по нажатию на кнопку ИСКАТЬ, в зависимости от выбранной радиокнопки. Это можно сделать при помощи команды ADOQuery.SQL.Add(…). В скобках указывается строка запроса.
