- •Оглавление
- •Часть 1. Краткое описание Delphi 8
- •Часть 2. Технология ado для баз данных access 186
- •9.1. Общие сведения 289
- •Введение
- •Часть 1. Краткое описание Delphi
- •1. Работа со средой delphi
- •1.1. Ознакомление с delphi
- •1.2. Вкладка дизайнера формы (design)
- •1.3. Вкладка редактора кода программы
- •1.4. Окно object inspector
- •1.5. Окно project manager
- •1.6. Окно палитры инструментов
- •1.7. Создание первого проекта приложения
- •1.8. Сохранение проекта
- •1.8. Сохранение проекта
- •1.9. Компиляция
- •2. Основа языка delphi
- •2.1. Основные понятия языка
- •2.1.1. Элементы языка
- •2.1.2. Пример простой программы
- •2.1.3. Типы данных
- •2.1.4. Операции и выражения
- •2.1.5. Стандартные функции
- •2.1.6. Ввод и вывод на дисплей
- •2.1.7. Оператор присваивания
- •2.2. Операторы языка паскаль
- •2.2.1. Составной оператор
- •2.2.2. Условный оператор
- •2.2.3. Сложные условия
- •2.2.4. Оператор выбора case
- •2.2.5. Оператор цикла for
- •2.2.6. Оператор цикла while
- •2.2.7. Оператор цикла repeat
- •2.2.8. Вложенные циклы
- •2.2.9. Прочие операторы
- •2.3. Общая структура программы
- •2.3.1. Перечень разделов программы
- •2.4. Массивы
- •2.4.1. Одномерные массивы
- •2.4.2. Сортировка массивов и поиск элемента в массиве
- •2.4.3. Многомерные массивы
- •2.5. Функции и процедуры
- •2.5.1. Описание функций
- •2.5.2. Обращение к функции
- •2.5.3. Процедуры
- •2.5.4. Параметры-значения и параметры-переменные
- •2.5.5. Локальные и глобальные переменные
- •2.5.6. Pекурсия
- •2.6. Строки символов
- •2.6.1. Задание строк
- •Var имя: string[длина];
- •2.6.2. Функции и процедуры для обработки строк
- •2.7. Порядковые типы данных
- •2.7.1. Перечисляемый тип данных
- •2.7.2. Интервальный тип данных
- •2.7.3. Порядковые типы данных
- •2.7.4. Дополнение:тип данных tDateTime (дата-время)
- •2.8. Множества
- •2.8.1. Значения типа множество
- •2.8.2. Операции на множествах
- •2.9. Записи
- •2.9.1. Поля записи
- •2.9.2. Оператор with
- •2.9.3. Последовательный поиск в массиве записей
- •2.9.4. Двоичный поиск в массиве записей
- •2.10. Файлы
- •2.10.1. Основные свойства файлов
- •2.10.2. Типизированные файлы
- •2.10.3. Текстовые файлы
- •2.10.4. Поиск файлов
- •2.11. Динамическая память
- •2.11.1. Динамические переменные и указатели
- •2.11.2. Динамические списки
- •2.11.3. Деревья
- •2.12. Программные модули
- •2.12.1. Модули, формируемые пользователем
- •2.12.2. Стандартные модули
- •2.12.3. Примеры программ
- •3. Главная форма
- •3.1. Свойства главной формы
- •3.2. События главной формы
- •4. Описание некоторых компонентов
- •4.1. Компонент tpanel (панели)
- •4.2. Компонент tbutton (кнопка)
- •4.3. Дополнительные кнопки
- •4.4. Компонент tlabel (надписи)
- •4.5. Компонент tedit (Строки ввода)
- •4.6. Компонент тМето (многостроч. Поле ввода)
- •4.7. Свойства и методы класса tstrings
- •4.8. Компонент checkbox (флажок)
- •4.9. Компонент tradiobutton (кнопки выбора)
- •4.10. Компонент MainMenu (главное меню программы)
- •4.11. Компонент timage
- •4.12. Компонент tstringgrid (сетка)
- •4.13. Компонент ttimer(таймер)
- •5. Отладка программ
- •5.1. Типы ошибок
- •5.2. Отладка программы
- •5.2.1. Трассировка программы
- •5.2.2. Точки останова программы
- •5.2.3. Наблюдение значений переменных
- •Часть 2. Технология ado для баз данных access
- •6. Создание баз данных access
- •6.1. Определение понятия баз данных
- •6.2. Интерфейс программы access
- •6.3. Создание базы данных в access 2007
- •6.3.1. Создание двухтабличной базы данных
- •6.3.2. Создание базы данных с вычисляемыми полями
- •6.4. Выбop формата для новой базы данных
- •6.5. Создание пустой базы данных
- •6.6. Открытие и закрытие базы данных
- •6.7. Создание таблиц в режиме конструктора
- •6.7.1. Выбор первичного ключа
- •6.7.2. Изменение полей и таблиц
- •6.7.3. Копирование полей
- •6.7.4. Перемещение полей
- •6.7.5. Удаление полей
- •6.7.6. Операции с таблицами
- •6.8. Создание базы данных в access 2003
- •6.9. Установление связей между таблицами
- •6.10. Обеспечение целостности записей в базе данных
- •6.11. Редактирование и удаление связей
- •7. Система доступа к данным ado
- •7.1. Общие сведения
- •7.2. Компонент adoConnection
- •7.2.1. Свойства компонента adoConnection.
- •7.2.2. Методы компонента adoConnection
- •7.3.Компонент аdоТable
- •7.3.1. Свойства компонента tadoTable
- •7.3.2. Методы компонента tadoTable
- •7.4. Компонент adoQuery
- •7.5. Компонент adoDataSet
- •7.5.1.Свойства компонента adoDataSet
- •7.5.2. Методы компонента adoDataSet
- •7.5.3. Cобытия компонента adoDataSet
- •7.6. Компонент DataSource
- •7.7.Комнонент DataGrid
- •7.7.1 Cвойства компонента DataGrid
- •7.7.2. Методы и события компонента DataGrid
- •7.8. Компонент adocommand
- •8. Управление базами данных
- •8.1. Приложение для управления базами данных
- •8.2. Свойства полей базы данных
- •8.3. Редактирование базы данных
- •8.4. Сортировка данных
- •8.5. Поиск данных в базе
- •8.5.1. Фильтрация данных в базе
- •8.5.2. Нахождения информации методом Locate
- •9.1. Общие сведения
- •9.2. Основные операторы запроса
- •9.2.1. Агрегатные функции
- •9.2.2. Подзапросы
- •9.3. Операторы наполнения баз данных sql
- •9.3.1. Ввод значений
- •9.3.2. Удаление значений
- •9.3.3. Изменение значений
- •9.4. Операторы создания баз данных sql
- •9.4.1. Команда создания таблицы.
- •9.4.2. Первичные ключи таблицы
- •9.4.3. Индексы таблицы
- •9.4.4. Добавление в таблицу новых столбцов
- •10. Реализация sql- запросов
- •10.1. Компонент tadoQuery для sql- запросов
- •10.2. Форма для реализация sql-запроса
- •11. Генератор отчетов Quick Reports
- •11.1.Описание Quick Reports
- •11.2. Печать записи с помощью Quick Reports
- •11.3. Печать таблиц с помощью Quick Reports
- •394026 Воронеж, Московский просп., 14
10.2. Форма для реализация sql-запроса
Создав компонент для SQL-запроса, реализуем теперь поиск с помощью SQL-запроса.
Для этого в нашем приложении создадим новую форму, в которой будет отображаться результат поиска.
Назовем новую форму FindResultForm и изменим у нее следующие свойства:
Caption — изменим на Результат поиска;
Position - - установим в poMainFormCenter, чтобы наше окно отображалось по центру главного окна.
Чтобы окно видело таблицы, к нему надо подключить модуль данных —DataModuleUnit вручную или используя уже знакомое меню File | Use Unit.
Далее установим на форму ceтку DBGrid, с вкладки Data Controls палитры инструментов, и растянем ее по всей форме.
Перейдем в объектный инспектор и изменим свойство DataSource на DataModulel.FindSource, чтобы увидеть в сетке результат запроса.
Теперь сохраним форму под ранее названным именем FindResultUnit.
Не всегда заранее известно, по каким полям нужно будет производить поиск.
Улучшим нашу главную форму так, чтобы можно было производить поиск по двум произвольным полям.
Для этого в левом верхнем углу главной формы установим рядом два компонента Label (Надписи) с текстами Имя 1-го поля и Имя 2-го поля.
Так как имена всех полей обеих таблиц заранее известны, то выбор имен полей будем делать с помощью компонента ComboBox.
Кроме этого, вторая таблица имеет поле Оценка, значения которого также заранее известны. Таким образом, В случае выбора имени этого поля, для задания его значения также можно использовать компонент ComboBox.
Таким образом, ниже компонентов Label (Надписи) установим рядом два компонента ComboBox.
Еще ниже установим рядом два компонента Label (Надписи) с текстами Значение 1-го поля и Значение 2-го поля и под ними рядом слева установим еще один компонент Edit и и рядом с ним справа один компонент ComboBox, который можно использовать по прямому назначению, если вторым полем выбрано имя Оценка, в других случаях он используется как обычный компонент Edit.
И, наконец, под ними установим компонент SpeedButton (кнопка с рисунком), назвав ее Найти список.
Поиск можно производить и по одному полю (первому), задав имя и значение только этого поля.
Общий вид окна Главной формы показан на рис 10.2.
Из этого рисунка видно, что прежде чем нажать кнопку Найти список, нужно выбрать из предложенных списков имена первого и второго полей, задать значение первого поля (номер учебной группы) и выбрать из предложенного списка значение второго поля (оценки).
Рис. 10.2
Рассмотренный вариант поиска подразумевает выбор некоторого списка и поэтому для создания обработчика событий onClick кнопки Найти список метод Locate не подходит.
Для события onClick кнопки Найти список создадим следующий код в виде SQL-запроса:
DataModule1.FindQuery.Active:=False;
DataModule1.FindQuery.SQL.Clear;
DataModule1.FindQuery.SQL.Add('select*');
DataModule1.FindQuery.SQL.Add('FROM Итоги');
DataModule1.FindQuery.SQL.Add('WHERE '+ ComboBox1.Text + ' LIKE '+''''+Edit4.Text+'''');
if ComboBox2.Text <> '' then
DataModule1.FindQuery.SQL.Add(' AND '+ ComboBox2.Text + ' LIKE '+''''+ ComboBox3.Text+'''');
DataModule1.FindQuery.SQL.Add('ORDER by 2’);
DataModule1.FindQuery.Active:=true;
FindResultForm.ShowModal;
В первой строке кода мы делаем компонент запроса неактивным.
После надо заполнить свойство sql компонента FindQuery запросом на поиск данных. Это свойств имеет тип TStrings.
Но прежде чем заполнять новыми значениями свойство sql, нужно очистить его от старого запроса, который мог остаться после последнего вызова. Для очистки свойства sql вызываем метод Clear.
Далее идет заполнение свойства sql текстом запроса. Нам нужно внести следующий запрос:
SELECT *
FROM Список
WHERE '+ ComboBox1.Text + ' LIKE '+''''+Edit4.Text+'''');
(и если компонент ComboBox2 (Имя 2-го поля)заполнен, т.е.)
if ComboBox2.Text <> '' then
DataModule1.FindQuery.SQL.Add(' AND '+ ComboBox2.Text + ' LIKE '+''''+ ComboBox3.Text+'''');
DataModule1.FindQuery.SQL.Add('ORDER by 2’);
DataModule1.FindQuery.Active:=true;
FindResultForm.ShowModal;
Здесь написано примерно следующее — выбрать все поля из таблицы Список, где поле ComboBox1.Text равно значению, указанному в компоненте Edit4.Text.
Параметр-значение, с которым происходит сравнение (текст из Edit4) должен быть заключен в одинарные кавычки. Но так как одинарные кавычки используются в Delphi для ограничения строк, то чтобы внутри строки поставить одинарную кавычку, ее нужно поставить дважды. Более подробно смотри подраздел 8.5.1.
Далее с помощью оператора if идет проверка заполнения поля ComboBox1.Text, и если да, то выполняется следующий оператор, в противном случае он пропускается.
Строка
DataModule1.FindQuery.SQL.Add('ORDER by 2’);
позволяет сортировать данные запроса по второй колонке запрашиваемых данных.
Следующая строка запроса делает компонент FindQuery активным, чтобы запрос мог выполняться.
И, наконец, чтобы отобразить результат, в последней строке запроса вызываем окно FindResultForm которое будет главным при печати результатов с помощью QuickReport.
Для выполнения запроса чаще всего достаточно сделать компонент FindQuery активным. Это прекрасно работает, если вы запрашиваете данные из таблицы базы данных. Но если в запросе удаляются строки или изменяется структура таблицы (в запросе есть такие операторы, как Insert, UpDate, Delete или CreateTable), необходимо вызывать метод ExecSQL компонента FindQuery.
Определить, когда для выполнения запроса достаточно сделать компонент FindQuery активным, а когда запрос нужно выполнять с помощью метода ExecSQL просто — если запрос возвращает данные, то достаточно активировать компонент, а если запрос изменяет данные, то запрос нужно выполнять с помощью метода ExecSQL.