Обработка баз данных с помощью языка SQL

advertisement
Министерство инфраструктуры Украины
Государственная служба связи
ОДЕССКАЯ НАЦИОНАЛЬНАЯ АКАДЕМИЯ СВЯЗИ им. А.С.ПОПОВА
Кафедра информационных технологий
Курсовая работа
Обработка баз данных
с помощью языка SQL
Задание и методические
указания по выполнению
модуль 1
для студентов
технических специальностей академии
Одесса – 2011
УДК 043.43
План УМИ 2011 г.
Методическое пособие разработали:
И.Г. Швайко, Л.М. Буката, Н.В. Северин, Д.Г. Ларин
Методическое пособие рассмотрено и рекомендовано к печати на
заседании кафедры ИТ, протокол № 7 от 1 февраля 2011 г.
Зав. каф.
Леонов Ю.Г.
Методическое пособие одобрено методическим советом факультета
Информационных систем, протокол № 8 от 3 февраля 2011 г.
Декан факультета
Стрелковская И.В.
Утверждено:
Методическим советом
академии связи
Протокол №8 от 11.02.2011г.
2
ВСТУПЛЕНИЕ
Методическое пособие содержит теоретические сведения и указания по
выполнению курсовой работы дисциплины „Базы данных”, а также 30
вариантов индивидуальных заданий, которые позволят всесторонне усвоить
работу, связанную с созданием, редактированием баз данных и созданием
запросов к базе данных, используя язык SQL. Для самостоятельного
выполнения курсовой работы, в пособии приведена последовательность
выполнения этой работы на компьютере.
Пособие предназначено для приобретения
практических навыков
создания и обработки баз данных студентами всех специальностей академии,
которые изучают дисциплину „Базы данных”.
Пособие будет также полезным для всех, кто стремится самостоятельно
изучить теоретический материал для работы с системой управления базами
данных MS Access и научиться квалифицированно обрабатывать базы данных,
используя язык структурированных запросов SQL.
3
Тема Обработка баз данных с помощью языка SQL
Цель: Спроектировать базу данных в соответствии со своим
индивидуальным вариантом. Приобрести практические навыки по обработке
базы данных, спроектированной в СУБД Access, а также при работе с базами
данных в среде C++ Builder и создании запросов, модификации и управления
данными в реляционных базах данных, используя язык SQL.
Указания по оформлению.
Курсовая работа оформляется на листах формата А4, в состав которой
должны входить следующие разделы:
1. Титульный лист с указанием названия курсовой работы и Ф.И.О.
исполнителя.
2. Содержание.
3. Краткие теоретические сведения.
4. Текст задания курсовой работы, согласно индивидуального варианта.
5. Таблицы базы данных и связи между спроектированными таблицами в
Access.
6. Создание запроса с использованием компонента ADOQuery в среде C++
Builder.
7. Использование компонента ADODataSet как для редактирования
данных, так и для создания запросов.
8. Создание отчетов в С++Builder средствами палитры компонентов
Qreport.
9. Анализ полученных результатов.
10. Список литературы.
Содержание задания курсовой работы
1. Спроектировать структуру таблиц данных в соответствии с вариантом
индивидуального задания.
2 . Создать в Access таблицы базы данных с реляционной структурой.
3 . Используя язык SQL, создать различные запросы к базе данных.
4 . Настроить визуальные компоненты в С++Builder для отображения
созданной базы данных.
5 . Создать запрос, используя компоненты ADOQuery.
6 . Используя разные режимы работы компонента ADODataSet, представить
данные для их редактирования, а также для создания запросов.
7 . С помощью компонента ADODataSet, обеспечить отображения связи
между таблицами.
8 . Предусмотреть возможность создания запросов во время обработки
данных.
4
Краткие теоретические сведения
Под базой данных (БД) понимается совокупность специальным образом
организованных данных, хранящихся в памяти вычислительной системы и
отображающих состояние объектов и их взаимосвязей в рассматриваемой
предметной области.
БД – это модель определенной предметной области, представленная в
виде совокупности связанных между собой двумерных таблиц, отчётов и
запросов к ним.
Задача БД состоит в хранении всех представляющих интерес данных в
одном или нескольких местах, причем таким способом, который заведомо
исключает ненужную избыточность. В хорошо спроектированной БД
избыточность данных исключается, и вероятность сохранения противоречивых
данных минимизируется. Создание БД преследует две основные цели: понизить
избыточность и повысить надежность.
Требования к БД:
 БД должна удовлетворять всем требованиям пользователей к
содержимому БД. Перед проектированием БД необходимо провести обширные
исследования требований пользователей к функционированию БД;
 БД должна гарантировать непротиворечивость и целостность данных.
При проектировании таблиц нужно определить правила, ограничивающие
возможность ввода ошибочных данных, их дублирования и т.д.;
 БД должна обеспечивать естественное, легкое структурирование
информации. Качественное построение БД позволяет делать запросы к базе
более «прозрачными» и легкими для понимания; следовательно, снижается
вероятность внесения некорректных данных и улучшается качество
сопровождения БД;
 БД
должна
удовлетворять
требованиям
пользователей
к
производительности БД.
Этапы проектирования БД:
 определить информационные потребности БД (всю информацию разбить
на несколько таблиц по смыслу);
 проанализировать объекты реального мира, которые необходимо отразить
в БД; описать эти объекты, определить их характеристики и сформировать
списки объектов (определить поля каждой таблицы);
 привести в соответствие характеристики объектов и столбцы таблиц с
учётом выбранной СУБД (Paradox, xBase, Access и др.);
 определить атрибуты, которые уникальным образом идентифицируют
каждый объект;
 выбрать правила, которые будут поддерживать целостность данных;
 установить связи между объектами, провести нормализацию таблиц;
 спланировать вопросы надежности данных и, при необходимости,
сохранения секретной информации.
5
Виды СУБД
Создают БД и обрабатывают запросы к ним системы управления базами
данных – СУБД.
СУБД – это комплекс языковых программных средств, предназначенный
для создания, ведения и совместного использования БД многими
пользователями.
Известно множество СУБД, различающихся своими возможностями или
обладающих примерно равными возможностями и конкурирующими друг с
другом: Paradox, dBase, Ms Access, FoxPro, Oracle, InterBase и др. Разные СУБД
по-разному организуют и хранят БД. Например, Paradox и dBase используют
для каждой таблицы отдельный файл. В этом случае база данных – это каталог,
в котором хранятся файлы таблиц. В Ms Access и в InterBase несколько таблиц
хранится как один файл. Системы типа клиент-сервер, такие, как серверы
SyBase или Microsoft SQL, хранят все данные на отдельном компьютере.
Создание БД в MS Access 2010
При
запуске
MS
Access
2010
открывается
представление
MicrosoftOfficeBackstage (рис. 1), в котором можно получить сведения о
текущей базе данных, создать новую базу данных, открыть существующую
базу данных и просмотреть справочные материалы с веб-сайта Office.com. В
представлении Backstage также доступны команды настройки, обслуживания и
совместного использования баз данных. Как правило, команды в представлении
Backstage применяются ко всей базе данных, а не к отдельным ее объектам.
Рисунок 1– Рабочее окно MS Access 2010
6
Создание базы данных с помощью шаблона
В Ms Access имеется большое количество шаблонов, позволяющих
ускорить создание базы данных. Шаблон – это готовая база данных,
содержащая все таблицы, запросы, формы и отчеты, необходимые для
выполнения определенной задачи. Например, существуют шаблоны,
используемые для отслеживания проблем, управления контактами или записи
расходов. Некоторые шаблоны содержат несколько образцов записей, чтобы
продемонстрировать их использование. Шаблоны баз данных можно
использовать как есть или настроить в соответствии с конкретными
требованиями.
Создание базы данных с помощью шаблона Access 2010
1. Запустите приложение Access 2010.
2. На вкладке Создание в представлении Backstage нажмите кнопку
Образцы шаблонов.
3. Выберите в разделе Доступные шаблоны нужный шаблон.
4. В поле Имя файла введите имя файла.
5. Также можно щелкнуть значок папки рядом с полем Имя файла и
указать расположение, в котором необходимо создать базу данных. Если
расположение не указано, база данных создается в расположении по
умолчанию (отображается под полем Имя файла).
6. Нажмите кнопку Создать.
Приложение Access создаст базу данных и откроет ее (рис. 2).
Рисунок 2 – Набор шаблонов в MS Access 2010
7
В MS Access 2010 можно выбрать один из двух типов баз данных:
стандартную базу данных для настольных компьютеров или веб-базу данных.
Для обоих типов баз данных обычно необходимо выполнить одно из
указанных ниже действий.
1 Создание таблиц и ввод данных в таблицы.
Импорт данных из других источников с созданием таблиц в процессе
импорта.
2 Создание пустой базы данных
Запустите Ms Access.
На вкладке Создание в представлении Backstage нажмите кнопку
Новая база данных или Пустая веб-база данных.
Примечание. От выбранного варианта зависит, какие функции будут
доступны для работы с базой данных. Базы данных для настольных
компьютеров нельзя опубликовать в Интернете, а веб-базы данных не
поддерживают некоторые функции баз данных для настольных компьютеров,
например итоговые запросы.
3 В поле Имя файла справа введите имя базы данных.
Чтобы изменить расположение, в котором будет создан файл, нажмите
кнопку Обзор
рядом с полем Имя файла, выберите новое расположение и
нажмите кнопку ОК.
4 Нажмите кнопку Создать.
Ms Access создаст базу данных (рис. 3), а затем откроет пустую таблицу с
именем «Таблица1», в режиме таблицы (Режим таблицы). В режиме таблицы
поддерживается изменение значений полей, добавление или удаление данных и
поиск данных.
Рисунок 3 – Окно новой БД с созданием таблицы в Режиме таблицы
8
5 Приложение Ms Access автоматически разместит курсор в первой
пустой ячейке столбца, который называется Щелкните для добавления
(рис. 4) новой таблицы.
Рисунок 4 – Типы поддерживаемых данных (добавление нового столбца)
Чтобы добавить данные, начните их вводить или вставьте данные из
другого источника, в разделе Вставка данных из другого источника в таблицу
Ms Access.
Структура таблицы создается при вводе данных. Каждый раз при
добавлении в таблицу нового столбца определяется новое поле, тип которого
определяется вводимым значением (Тип данных). Характеристика поля,
определяющая тип данных, который может содержать это поле. Существуют
следующие типы данных: Boolean, Integer, Long, Currency, Single, Double, Date,
String и Variant (по умолчанию). Тип поля задается на основе типа введенных
данных. Например, если в столбец введены только значения дат, его типом
данных будет «Дата/время». Если впоследствии попытаться ввести в это поле
значение другого типа (например, имя или номер телефона), появится
сообщение о том, что значение не соответствует типу данных столбца. По
возможности следует планировать таблицу таким образом, чтобы каждый
столбец содержал данные одного типа (текст, даты, номера и т.д.). Это
позволит значительно упростить создание запросов, форм и отчетов, для
которых будут выбираться только необходимые данные.
Если на этом этапе вводить данные не требуется, нажмите кнопку
Закрыть. Если закрыть таблицу «Таблица1» без сохранения, она будет
удалена.
9
Добавление таблицы
Можно добавить новую таблицу в существующую базу данных с помощью
инструментов в группе Таблицы на вкладке Создание.
Независимо от того, в каком режиме начата работа, всегда можно
переключиться в другой режим с помощью кнопок режимов в строке состояния
окна Access.
Создание пустой таблицы в режиме таблицы
В режиме таблицы можно начать вводить данные немедленно, при этом
структура таблицы будет создана Access автоматически. Имена полей задаются
номерами («Поле1», «Поле2» и т. д.), а тип данных поля определяется на основе
типа вводимых данных.
Для создания таблицы необходимо:
 На вкладке Создание в группе Таблицы нажмите кнопку Таблица.
Приложение Access создаст таблицу и поместит курсор в первую
пустую ячейку столбца Щелкните, чтобы добавить.
 Чтобы добавить данные, начните вводить их в первую, пустую
ячейку, либо вставьте данные из другого источника.

Рисунок 5 – Создание таблицы в режиме Таблица
10
Для переименования столбца (поля) дважды щелкните заголовок столбца
и введите новое имя.
Чтобы переместить столбец, выделите его, щелкнув заголовок столбца, а
затем перетащите в новое место. Можно также выделить несколько смежных
столбцов и перетащить их все в новое место.
Чтобы добавить в таблицу дополнительные поля, начните вводить данные
в столбец, который назывется Щелкните для добавления в режиме таблицы
или воспользуйтесь командами в группе Добавление и удаление на вкладке
Поля.
Создание таблицы в режиме конструктора.
В режиме конструктора сначала следует создать структуру новой
таблицы. Затем для ввода данных следует переключиться в режим таблицы или
воспользоваться каким-либо другим способом, например, ввести данные с
помощью формы.
На вкладке Создание в группе Таблицы нажмите кнопку Конструктор
таблиц.
Для каждого поля в таблице введите имя в столбце Имя поля, а затем в
списке Тип данных выберите тип данных.
1.
При желании введите в столбце Описание дополнительные
сведения для каждого поля. Это описание отображается в строке состояния,
если курсор находится в данном поле и используется в качестве текста строки
состояния, для любых элементов управления, создаваемых путем
перетаскивания поля из области Список полей в форму или отчет.
2.
После добавления всех полей сохраните таблицу и нажмите на
вкладке Файл кнопку Сохранить.
3.
Чтобы начать вводить данные в таблицу, переключитесь в режим
таблицы, и щелкните первую пустую ячейку. Кроме того, можно вставить
данные из другого источника, как описано в следующем разделе.
Рисунок 6 – Создание таблицы в режиме Конструктор таблиц
11
Добавление полей в таблицу в режиме конструктора
1. Откройте таблицу в режиме конструктора (Конструктор).
Представление, в котором отображается структура следующих объектов базы
данных: таблицы, запросы, формы, отчеты и макросы. В режиме конструктора
можно создавать новые объекты базы данных или изменять структуру
существующих.
2. Чтобы вставить в таблицу поле, щелкните строку, над которой его
нужно поместить, и нажмите кнопку Добавить строки
на панели
инструментов. Чтобы добавить поле в конец таблицы, щелкните первую
пустую строку.
3. Щелкните ячейку в столбце Имя поля и введите уникальное имя поля.
4. В столбце Тип данных можно оставить настройку по умолчанию
(Текстовый) или выбрать из раскрывающегося списка, другой тип данных.
5. В столбце Описание введите описание данных, которые будет
содержать это поле. Текст описания будет выводиться в строке состояния
(Строка состояния).
Добавление поля (столбца) в таблицу в режиме таблицы
1. В меню Вставка выберите команду Столбец.
2. Дважды щелкните заголовок нового столбца и введите его уникальное
имя. Откройте таблицу в режиме таблицы. Режим таблицы − это представление,
в котором данные из таблицы отображаются в формате строк и столбцов. В
режиме таблицы поддерживается изменение значений полей, добавление или
удаление и поиск данных.
3. Щелкните столбец, слева от которого требуется добавить новый
столбец.
Установка типа объединения по умолчанию для связей
между двумя таблицами
Объединение − связь между полем одной таблицы или запроса и полем
другой таблицы или запроса, имеющим тот же тип данных.
Для создания связей между таблицами базы данных нужно выполнить
следующие действия.
1.
Нажмите кнопку Схема данных
на панели инструментов, чтобы
открыть окно схемы данных.
2.
Дважды щелкните среднюю часть линии объединения двух таблиц,
чтобы открыть окно Изменение связей (рис. 7).
12
Рисунок 7 – Окно изменения связей
3. Нажмите кнопку Объединение и выберите требуемый тип
объединения.
Среди свойств связей, наиболее важными являются:
 Обеспечение целостности данных дает возможность избежать
ошибки при вводе информации в связанные таблицы и удалении записей с
исходной таблицы;
 Каскадное обновление данных возможно, если включено
Обеспечение целостности данных, и дает возможность автоматически
изменять данные в связанной таблице, если они были изменены в исходной
таблице;
 Каскадное удаление данных автоматически удаляет данные в
связанной таблице в случае удаления их в исходной таблице.
Для подтверждения установки связей необходимо нажать кнопку ОК.
Рассмотрим базу данных «МТС (Междугородняя телефонная станция)».
Структурные схемы и связи между спроектированными таблицами
Таблица 1 – Типы полей таблицы «Тарифы»
Имя поля
Тип данных
Код_тарифа
Числовой
Наименование_тарифа
Текстовый
Стоимость
Денежный
Характер_тарифа
Поле МЕМО
13
Таблица 2 – «Тарифы»
Код_тарифа
21
Наименов_тарифа
Наилучший
Стоимость
0,39
122
Рождественский
0,45
243
Безлимитный
0,35
204
Друзья
0,15
25
Единая цена
0,25
Характер_тарифа
Внутри сети без платы за
соединение
Внутри сети без платы за
соединение
Внутри сети без платы за
соединение
Внутри сети без платы за
соединение
Единая цена на звонки
абонентам всех операторов
мобильной и фиксированной связи Украины
Создадим спроектированную таблицу Тарифы в Access в режиме
Таблица (рис. 8).
Рисунок 8 – Создание таблицы Тарифы в режиме Таблица
Таблица 3 – Типы полей таблицы «Абоненты»
Имя поля
Тип данных
Код_абонента
Числовой
ФИО
Текстовый
Сведения_о_клиенте
Поле МЕМО
14
Таблица 4 – «Абоненты»
Код_абонента
ФИО
11
Иванов А.М.
12
Тимофеев О.В.
13
Гуляев А.В.
14
Николаев М.В.
15
Ильенко С.В.
Сведения_о_клиенте
0935341713, ул. Маршала Жукова, 5а,
кв. 21, г. Одесса
0952371838, ул. Комсомольская, 42, кв.
13, г. Одесса
0970034917, ул. Гагарина, 17, кв. 9, г.
Одесса
0987296143, ул. Львовская, 15, кв. 38, г.
Одесса
0988210645, ул. Толстого, 3, кв. 16, г.
Одесса
Таблицу Абоненты создадим в режиме Конструктора таблиц (рис. 9).
Рисунок 9 – Создание таблицы Абоненты в режиме Конструктор таблиц
Таблица 5 – Типы полей таблицы «Абонплата»
Имя поля
Тип данных
Код_абонплаты
Счетчик
Код_тарифа
Числовой
Код_абонента
Числовой
Начало_переговора
Дата/время
Конец_переговора
Дата/время
Длительность
Числовой
Страна
Текстовый
15
Таблица 6 – «Абонплата»
Код_або
нплаты
Код_т Код_або
арифа нента
1
21
15
2
25
13
3
204
12
4
21
15
5
204
12
Начало_пе
реговора
Конец_переговора
19.11.2010
17:35:00
20.11.2010
8:33:00
20.11.2010
12:20:00
21.11.2010
9:05:00
21.11.2010
11:15:00
19.11.2010
17:50:00
20.11.2010
8:55:00
20.11.2010
12:55:00
21.11.2010
9:30:00
21.11.2010
11:45:00
Длительность
Страна
15
Украина
22
Украина
35
Россия
25
Украина
30
Россия
Рисунок 10 – Создание таблицы Абонплата в режиме Конструктор таблиц
Рисунок 11 – Схема данных, показывающая реляционную модель данных
16
Технология ADO
Данные
OLE DB
ADO-
ADO
PROVIDER
Connection
QUERY
ADO
Визуальные компоненты
ADOTable
Компоненты TDataSource
Технология ADO (ActiveX Data Objects) развивается корпорацией
Microsoft. На основе этой технологии созданы соответствующие компоненты –
наборы TADOTable, TADOQuery, TADOStoredProc, повторяющие в
функциональном отношении аналогичные компоненты, разработанные фирмой
BORLAND, основу которых составляет технология BDE – Borland Database
Engine.
Основным достоинством технологии ADO является ее естественная
ориентация на создание «облегченного» клиента. Это связано с тем, что с
развитием технологии Интернета и с расширением потребностей конечных
пользователей в получении доступа через сеть к любым видам информации
потребовалось создать новую концепцию работы с данными. Что и было
воплощено корпорацией Microsoft.
Развитие OLE технологии, получившее название OLE DB, позволило
получить доступ к информации, организованной произвольным способом, а
также работать с данными, доступ к которым в сети не всегда существует.
Чтобы обрабатывать некоторую структуру данных универсальным
способом, для нее должна быть написана программа – поставщик и обработчик
этих данных в соответствии с требованиями OLE DB. Такая программа
называется OLE DB PROVIDER.
Непосредственно работать с OLE DB достаточно сложно, поэтому
появилась настройка ADO, использующая поставщиков OLE DB.
Реализация технологии ADO в Builder можно представить следующей
упрощенной схемой, приведенной на рис. 12.
STOREDPROC
Рисунок 12 – Схема технологии ADO
Согласно терминологии ADO, любой источник данных (база данных,
электронная таблица, файл) называется хранилищем данных, с которым при
17
помощи провайдера данных взаимодействует приложение. Минимальный
набор компонентов приложения может включать объект соединения, объект
набора данных, объект процессора запросов.
В системе программирования С++ Builder компоненты, используемые для
создания приложений по технологии ADO находятся на закладке ADO, С++
Builder, версия 6.0 или закладке dbGo более высоких версий С++ Builder. Эти
компоненты представлены на рис.2: ADOConnection, ADODataSet, ADOQuery,
ADOStoredProc.
Рисунок 13 – Компоненты для работы с ADO
Название
компонента
ADOConnection
ADOCommand
ADODataSet
ADOTable
ADOQuery
ADOStoredProc
18
Обзор компонентов для работы с ADO
Назначение компонента
Используется для связи с набором данных ADO. Может
работать с несколькими компонентами наборов данных как
диспетчер выполнения их команд.
Используется в основном для выполнения команд SQL, не
возвращающих множество результатов. Может также
совместно с другими компонентами использоваться для
работы с таблицами. Может связываться с набором данных
непосредственно через ADOConnection.
Универсальный
компонент
связи
с
набором
данных, который может работать в различных режимах.
Может
связываться
с
одной
или
множеством
таблиц. Связь осуществляется непосредственно через
ADOConnection.
Используется
для
работы
с
одной
таблицей.
Может связываться с ней непосредственно, или через
ADOConnection.
Используется для работы с набором данных с
помощью запроса SQL, включая такие запросы языка
как DDL (data definition language), как Create Table.
Может связываться с набором данных непосредственно,
или через ADOConnection.
Используется для выполнения процедур, хранимых на
сервере. Может связываться с набором данных
непосредственно, или через ADOConnection.
Компонент ADOConnection
Компонент ADOConnection предназначен для настройки соединения с
сервером или с локальной базой данных. Соединение должно быть отражено в
свойстве ConnectionString этого компонента. Соединение с базой данных может
быть указано двумя способами: либо через файл связи к данным (файл в формате Microsoft Data Link, расширение UDL), либо прямым заданием параметров
соединения. Будем использовать простой способ соединения с базой данных,
для чего вызывается редактор свойств, нажав на кнопку «...» свойства ConnectionString (рис. 14).
Рисунок 14 – Окно выбора соединения
При выборе Use Connection String и нажатии на кнопку Build...
появится диалоговое окно Data Link Properties (Свойства канала
передачи данных см. рис. 15). B этом окне выбирается тип базы или провайдер
доступа к базе данных Provider, местоположение базы и параметры соединения.
Для работы с базой данных, разработанной в Access (с чем мы и будем
работать), используются как Microsoft Jet OLE DB Provider, так и Microsoft Jet
OLE DB Provider for ODBC. Рекомендуем работать с Microsoft Jet 4.0 OLE DB
Provider, т.е. с последней версией этого драйвера.
Рисунок 15 – Окно выбора провайдера доступа к безе данных
19
После выбора требуемого OLE DB Provider, нажимаем кнопку Next
(Далее) и переходим на закладку Connection (Соединение) см. рис. 16. B этом
окне надо ввести имя (а при необходимости и путь) базы данных в строке Select
or enter а database name (Выберите или введите имя базы данных).
Рисунок 16 – Окно настройки параметров соединения
Кроме этого можно заполнить и другие поля:
 User name – имя пользователя, можно оставить по умолчанию, если не
задано другое при создании базы в MS Access;
 Password – пароль. Если база имеет пароль, то его необходимо ввести;
 Blank password - пустой пароль. Если пароль не нужен, то необходимо
поставить «галочку».
 Allow saving password – разрешить сохранение пароля. Если отметить
это поле, то пароль будет сохранен.
После завершения настройки можно нажать на кнопку Test Connection
(Проверить соединение) для проверки теста соединения с базой. Если все
правильно, то появится сообщение «Test connection succeeded» (Проверка
соединения выполнена) рис. 17, после чего закрыть все окна создания соединения, а в целом, закончить работу с редактором свойства ConnectionString.
Рисунок 17 – Сообщение об успешной проверке соединения
20
Теперь в свойстве компонента ADOConnection рекомендуется отключить
свойство LoginPrompt, установив значение этого свойства в False (это позволит
не выводить окно ввода пароля при каждом обращении к базе). По завершении
настройки необходимо свойство Connected установить в значение True для
обеспечения связи с базой.
Если компонент ADOConnection, и другие невизуальные компоненты,
устанавливаются на вспомогательном модуле-контейнере DataModule, то этот
модуль необходимо подключить для основной (рабочей) формы, для чего выполняют команду File - Include Unit Hdr...
Компонент ADOTable
Компонент ADOTable предназначен для работы с одной из таблиц базы
данных. Для настройки этого компонента в инспекторе объектов имеются следующие свойства:
- Connection;
- TableName;
- Active.
B этом списке перечислены минимально необходимые свойства, которые
позволяют работать с одной из таблиц базы данных: добавлять, изменять и
удалять записи в таблице базы данных.
Свойство Connection позволяет обеспечить связь с базой, поэтому
единственным значением в списке свойств будет ADOConnection1, с помощью
которого мы установили связь с базой данных при настройке компонента
TADOConnection.
Свойство TableName позволяет выбрать нужную таблицу для работы с
данными. Значение этого свойства должно отображать одну из таблиц базы
данных.
Свойство Active контролирует правильность заданных свойств и
открывает или закрывает набор данных таблицы базы данных. Поэтому
значение этого свойства для открытия набора следует установить в True.
Остальные компоненты ADO и их назначение будут рассмотрены по мере
необходимости.
Компонент DataSource
Данные из базы становятся доступны пользователю, если они отображены
на визуальных компонентах (и не только). Основные визуальные компоненты
расположены на панели компонентов Data Controls. Чтобы отразить данные на
визуальных компонентах, необходимо показать, какие из них будут
использоваться для работы с набором данных. Поэтому, визуальный компонент
должен содержать данные из конкретной таблицы.
Звено, которое обеспечивает соединение набора данных с одним из визуальных компонентов, называется компонент DataSource, который расположен
на панели компонентов Data Access. Основное свойство этого компонента 21
DataSet. Значение этого свойства следует установить (связать) с конкретной
таблицей базы данных, которая выбрана с помощью компонента ADOTable.
Таким образом, компоненту DataSource необходимо указать, какую таблицу он
будет отображать на визуальных компонентах.
Все выше перечисленные компоненты можно разместить на DataModule –
вспомогательном контейнере для невизуальных компонентов (рис. 18). Этот
контейнер необходимо подключить к основной форме: File->IncludeUnitHdr.
Рисунок 18 – Контейнер DataModule
Самый простой способ отобразить данные из таблицы – установить на
форму визуальный компонент dbGrid (рис. 19), который находится на закладке
DataControls. Этот компонент может отражать данные в виде таблицы, здесь
можно добавлять, удалять и редактировать данные. Для того чтобы связать
компонент dbGrid с выбранной таблицей, необходимо в свойстве DataSource
этого компонента указать DataSource1, который связан с компонентом
ADOTable1.
Рисунок 19 – Компонент dbGrid
Можно установить компонент dbNavigator (рис. 20), который
предназначен для удобства управления таблицей. Он состоит из 10 кнопок, их
назначение представлено в табл. 1.
Рисунок 20 – Компонент dbNavigator
22
Таблица 1 – Кнопки dbNavigator
Название
Назначение кнопки
nbFirst
Перемещение к первой записи
nbPrior
Перемещение к предыдущей записи
nbNext
Перемещение к следующей записи
nbLast
Перемещение к последней записи
nbInsert
Вставить новую запись перед текущей
nbDelete
Удалить текущую запись
nbEdit
Редактировать текущую запись
nbPost
Сохранить изменения в записи
nbCancel
Отменить изменения в текущей записи
nbRefresh
Очистить буфер, связанный с набором данных
Пользуясь свойством компонента VisibleButtons, можно убрать любые
ненужные кнопки.
Прежде чем приступить к созданию проекта, в котором будем строить
запросы, рассмотрим основные сведения о языке SQL по созданию запросов.
Основы языка SQL в C++ Builder
SQL (Structured Query Language) — Структурированный Язык Запросов
— стандартный язык запросов по работе с реляционными БД. Язык SQL
появился после реляционной алгебры, и его прототип был разработан в конце
70-х годов в компании IBM Research. В дальнейшем этот язык применялся во
многих коммерческих СУБД и в силу своего широкого распространения
постепенно стал стандартом "де-факто" для языков манипулирования данными
в реляционных СУБД. C помощью SQL − запросов, можно создавать
реляционные базы данных и работать с ними.
Запрос − это некоторый алгоритм решения конкретной задачи, которую
мы формулируем заранее на естественном языке. И оттого, что наша задача
решается всего одним оператором языка SQL, она не становится примитивной.
Мощность языка SQL и состоит в том, что он позволяет одним предложением
сформулировать ответы на достаточно сложные запросы, для реализации
которых на традиционных языках понадобилось бы писать большую
программу.
SQL может быть двух типов: интерактивный и вложенный. Первый − это
отдельный язык, который сам выполняет запросы и сразу показывает результат
работы. Второй − это когда SQL язык вложен в другой, например в C++ Builder.
Общие правила синтаксиса SQL языка очень просты. Язык не
чувствителен к регистру, если используется программа из нескольких
операторов языка, то в конце каждого оператора ставится точка с запятой « ; ».
Для одного оператора точку с запятой ставить в конце оператора не
23
обязательно. Комментарии записываются в стиле Си: /* комментарий */.
Оператор может быть записан в одной или в нескольких строках.
Язык SQL представляет собой совокупность операторов. Операторы SQL
делятся на:
- операторы определения данных (Data Definition Language, DDL)
- операторы манипуляции данными (Data Manipulation Language, DML)
- операторы определения доступа к данным (Data Control Language, DCL)
- операторы управления транзакциями (Transaction Control Language, TCL) .
Все запросы на получение практически любого количества данных из
одной или нескольких таблиц выполняются с помощью единственного
предложения SELECT.
Оператор выбора SELECT
Язык запросов (Data Query Language) в SQL состоит из единственного
оператора SELECT. Этот единственный оператор поиска реализует все
операции реляционной алгебры. Однако писать запросы на языке SQL
(грамотные запросы) сначала совсем не просто. Один и тот же запрос может
быть реализован несколькими способами, и, будучи все правильными, они, тем
не менее, могут существенно отличаться по времени исполнения, и это
особенно важно для больших баз данных.
Синтаксис оператора SELECT имеет следующий вид:
SELECT[ALL|DISTINCT](<Список полей>|*)
FROM <Список таблиц>
[WHERE <Предикат-условие выборки или соединения>]
[GROUP BY <Список полей результата>]
[HAVING <Предикат-условие для группы>]
[ORDER BY <Список полей, по которым упорядочить вывод>]
Здесь ключевое слово ALL означает, что в результирующий набор строк
включаются все строки, удовлетворяющие условиям запроса. Значит, в
результирующий набор могут попасть одинаковые строки. И это нарушение
принципов теории отношений (в отличие от реляционной алгебры, где по
умолчанию предполагается отсутствие дубликатов в каждом результирующем
отношении). Ключевое слово DISTINCT означает, что в результирующий
набор включаются только различные строки, то есть дубликаты строк
результата не включаются в набор.
Символ * (звездочка) означает, что в результирующий набор включаются
все поля из исходных таблиц запроса.
В разделе FROM задается перечень исходных отношений (таблиц)
запроса.
В разделе WHERE задаются условия отбора строк результата или
условия соединения записей исходных таблиц, подобно операции условного
соединения в реляционной алгебре.
В разделе GROUP BY задается список полей группировки.
24
В разделе HAVING задаются предикаты – условия, накладываемые на
каждую группу.
В части ORDER BY задается список полей упорядочения результата, то
есть список полей, который определяет порядок сортировки в результирующем
отношении. Например, если первым полем списка будет указана Фамилия, а
вторым Номер группы, то в результирующем отношении сначала будут
собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то
они будут расположены в порядке возрастания номеров групп.
В выражении условий раздела WHERE могут быть использованы
следующие предикаты:
 Предикаты сравнения { =, <>, >,<, >=,<= }, которые имеют
традиционный смысл.
 Предикат Between A and B — принимает значения между A и B.
Предикат истинен, когда сравниваемое значение попадает в заданный диапазон,
включая границы диапазона. Одновременно в стандарте задан и
противоположный предикат Not Between A and B, который истинен тогда,
когда сравниваемое значение не попадает в заданный интервал, включая его
границы.
 Предикат вхождения в множество IN (множество) истинен тогда,
когда сравниваемое значение входит в множество заданных значений. При этом
множество значений может быть задано простым перечислением или
встроенным подзапросом. Одновременно существует противоположный
предикат NOT IN (множество), который истинен тогда, когда сравниваемое
значение не входит в заданное множество.
 Предикаты сравнения с образцом LIKE и NOT LIKE. Предикат LIKE
требует задания шаблона, с которым сравнивается заданное значение, предикат
истинен, если сравниваемое значение соответствует шаблону, и ложен в
противном случае. Предикат NOT LIKE имеет противоположный смысл.
По стандарту в шаблон могут быть включены специальные символы:
− символ подчеркивания ( _ ) – может быть любой символ или ни
одного;
− символ процента (%) – означает, что на его месте может быть любое
количество символов или ни одного;
− остальные символы, заданные в шаблоне, обозначают самих себя.
 Предикат сравнения с неопределенным значением IS NULL. Понятие
неопределенного значения было внесено в концепции баз данных позднее.
Неопределенное значение интерпретируется в реляционной модели как
значение, неизвестное на данный момент времени. Это значение при появлении
дополнительной информации в любой момент времени может быть заменено на
некоторое конкретное значение. При сравнении неопределенных значений не
действуют стандартные правила сравнения: одно неопределенное значение
никогда не считается равным другому неопределенному значению. Для
выявления равенства значения некоторого атрибута неопределенному,
применяют специальные стандартные предикаты:
25
<имя атрибута>IS NULL и <имя атрибута> IS NOT NULL.
Если в данном кортеже (в данной строке) указанный атрибут имеет
неопределенное значение, то предикат IS NULL принимает значение "Истина"
(TRUE), а предикат IS NOT NULL — "Ложь" (FALSE), в противном случае
предикат IS NULL принимает значение "Ложь", а предикат IS NOT NULL
принимает значение "Истина". Наличие неопределенных (NULL) значений
повышает гибкость обработки информации, хранящейся в БД.
Предикаты существования EXISTS и несуществования NOT EXISTS.
Эти предикаты относятся к вложенным подзапросам, и подробнее мы
рассмотрим их, когда коснемся вложенных подзапросов.
Рассмотрим детально первые три строки оператора SELECT:
SELECT − ключевое слово, которое сообщает СУБД, что эта команда
− запрос. Все запросы начинаются этим словом с последующим пробелом. За
ним может следовать способ выборки − с удалением дубликатов (DISTINCT)
или без удаления (ALL, подразумевается по умолчанию). Затем следует список
перечисленных через запятую столбцов, которые выбираются запросом из
таблиц, или символ '*' (звездочка) для выбора всей строки. Любые столбцы, не
перечисленные здесь, не будут включены в результирующее отношение,
соответствующее выполнению команды. Это, конечно, не значит, что они будут
удалены или их информация будет стерта из таблиц, потому что запрос не
воздействует на информацию в таблицах − он только показывает данные.

FROM − ключевое слово, подобно SELECT, которое должно быть
представлено в каждом запросе. Оно сопровождается пробелом и затем
именами таблиц, используемых в качестве источника информации. В случае,
если указано более одного имени таблицы, неявно подразумевается, что над
перечисленными таблицами осуществляется операция декартова произведения.
Таблицам можно присвоить имена-псевдонимы, что бывает полезно для
осуществления операции соединения таблицы с самой собою или для доступа
из вложенного подзапроса к текущей записи внешнего запроса (вложенные
подзапросы здесь не рассматриваются).

WHERE − ключевое слово, за которым следует предикат − условие,
налагаемое на запись в таблице, которому она должна удовлетворять, чтобы
попасть в выборку, аналогично операции селекции в реляционной алгебре.

Все последующие разделы оператора SELECT являются
необязательными.
B приведенном ниже примере рассмотрим синтаксис языка для наиболее
часто используемого оператора SQL − оператора выбора SELECT.
Одна из форм оператора выбора имеет следующий синтаксис:
SELECT <список имен полей>
FROM <таблица>
WHERE <условие отбора>
ORDER BY <список имен полей>

26
Если необходимо показать все поля таблицы, то оператор выбора будет
иметь следующий вид:
SELECT * FROM <таблица>
Элементы оператора WHERE и ORDER BY не являются обязательными.
Как видно из описания оператор WHERE определяет условие отбора записей, а
ORDER BY − определяет упорядочивание возвращаемых записей.
Условие отбора может включать имена полей (кроме вычисляемых
полей), константы, логические выражения, содержащие арифметические
операции, логические операции AND, OR, NOT и операции отношения, в том
числе и дополнительные условия отбора:
LIKE
Наличие заданной последовательности символов
BETWEEN ... AND
Диапазон значений
IN
Соответствие элементу множества
Операция LIKE имеет синтаксис:
<поле> LIKE ‘<последовательность символов>’. Эта операция
применима к полям типа строка и возвращает значение TRUE, если встретился
фрагмент, заданный в строке <последовательность символов>. Заданным
символам может предшествовать символ «%», который означает любое
количество символов. Можно также использовать символы «?», «*», «#».
«?» − в позиции, указанной этим символом может стоять один любой
символ или ни одного;
«#» − в указанной позиции может стоять только цифра;
«*» − может быть сколько угодно символов.
Операция BETWEEN ... AND имеет синтаксис:
<поле> BETWEEN <значение1> AND <значение2>
Операция IN имеет синтаксис:
<поле> IN <множество> она отбирает записи, в которых значение
указанного поля является одним из элементов указанного множества.
Условие выбора даты и времени требует использование предшествующих
и завершающих символов «#».
Агрегатные функции
Стандартом языка SQL предусмотрены следующие агрегатные функции:
COUNT(*)
возвращает количество строк источника записей;
COUNT
возвращает количество значений в указанном поле;
SUM
возвращает сумму значений в указанном поле;
AVG
возвращает среднее значение в указанном пол;
MIN
возвращает минимальное значение в указанном поле;
MAX
возвращает максимальное значение в указанном поле.
Все эти функции возвращают единственное значение. При этом функции
COUNT, MIN и MAX применимы к данным любого типа, в то время как SUM и
AVG используются только для данных числового типа. Разница между
функцией COUNT(*) и COUNT(имя поля | выражение) состоит в том, что
27
вторая (как и остальные агрегатные функции) при подсчете не учитывает
NULL−значения.
Рассмотрим базу данных "Компьютерная фирма"
Схема БД состоит из четырех таблиц (рис. 21).
Product(maker, model, type)
PC(code, model, speed, ram, hd, cd, price)
Laptop(code, model, speed, ram, hd, screen, price)
Printer(code, model, color, type, price)
Рисунок 21 − База данных «Компьютерная фирма»
Рисунок 22 − Примеры таблиц Product
28
Рисунок 23 − Примеры таблиц РС
Рассмотрим несколько примеров создания запросов.
Пример 1 Найти минимальную и максимальную цену на персональные
компьютеры:
Решение:
SELECT MIN(price) AS Min_price, MAX(price) AS Max_price
FROM PC;
// Оператор AS в SQL-запросах используется для изменения имени поля
Ответ
Пример 2 Найти имеющееся в наличии количество компьютеров,
выпущенных производителем B
Решение:
SELECT COUNT(*) AS Qty FROM PC
WHERE model IN(SELECT model FROM Product WHERE maker = 'B' );
Ответ
Пример 3 Если же нас интересует количество различных моделей,
выпускаемых производителем А, то запрос можно сформулировать следующим
образом (пользуясь тем фактом, что в таблице Product номер модели − столбец
model − является первичным ключом и, следовательно, не допускает
повторений):
29
Решение:
SELECT COUNT(model) AS Qty_model FROM Product
WHERE maker = 'A';
Ответ
Пример 4 Найти количество имеющихся различных моделей,
выпускаемых производителем B.
Примечание. Запрос похож на предыдущий, в котором требовалось
определить общее число моделей, выпускаемых производителем B. Здесь же
требуется найти число различных моделей в таблице РС (то есть имеющихся в
продаже). Для того, чтобы при получении статистических показателей
использовались только уникальные значения, при аргументе агрегатных
функций можно применить параметр DISTINCT. Другой параметр − ALL −
задействуется по умолчанию и предполагает подсчет всех возвращаемых (NOT
NULL) значений в столбце.
Решение:
SELECT DISTINCT COUNT(model) AS Qty FROM PC
WHERE model IN (SELECT model FROM Product WHERE maker = 'B');
Ответ
Если же нам требуется получить количество моделей ПК, производимых
каждым производителем, то потребуется использовать предложение GROUP
BY, синтаксически следующего после предложения WHERE.
Если предложение WHERE определяет предикат для фильтрации строк,
то предложение HAVING применяется после группировки, для определения
аналогичного предиката, фильтрующего группы по значениям агрегатных
функций. Это предложение, необходимо для проверки значений, которые
получены с помощью агрегатной функции не из отдельных строк источника
записей, определенного в предложении FROM, а из групп таких строк.
Поэтому, такая проверка не может содержаться в предложении WHERE.
30
Пример 5 Получить количество ПК и среднюю цену для каждой
модели, средняя цена которой менее $800
Решение:
SELECT model,COUNT(model) AS Qty_model,AVG(price) AS Avg_price
FROM PC
GROUP BY model
HAVING AVG(price) < 800;
Ответ
Заметим, что в предложении HAVING нельзя использовать псевдоним
(Avg_price), используемый для именования значений агрегатной функции в
предложении SELECT. Дело в том, что предложение SELECT формирующее
выходной набор запроса, выполняется предпоследним перед предложением
ORDER BY. Ниже приведен порядок обработки предложений в операторе
SELECT:
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
Этот порядок не соответствует синтаксическому порядку общего
представления оператора SELECT, который ближе к естественному языку:
SELECT [DISTINCT | ALL]{*
| [<выражение для столбца> [[AS] <псевдоним>]] [,…]}
FROM <имя таблицы> [[AS] <псевдоним>] [,…]
[WHERE <предикат>]
[[GROUP BY <список столбцов>]
[HAVING <условие на агрегатные значения>] ]
[ORDER BY <список столбцов>]
Следует отметить, что предложение HAVING может использоваться и
без предложения GROUP BY. При отсутствии предложения GROUP BY
агрегатные функции применяются ко всему выходному набору строк запроса,
т.е. в результате мы получим всего одну строку, если выходной набор не пуст.
Таким образом, если условие на агрегатные значения в предложении
HAVING будет истинным, то эта строка будет выводиться, в противном случае
мы не получим ни одной строки.
31
Пример 6 Найти максимальную, минимальную и среднюю цену на
персональные компьютеры.
Решение этой задачи дает следующий запрос:
SELECT MIN(price) AS min_price, MAX(price) AS max_price, AVG(price)
AS avg_price
FROM PC;
Ответ
Если же мы добавим в условие ограничение, например, на среднюю цену,
то получим следующий пример.
Пример 7 Найти максимальную, минимальную и среднюю цену на
персональные компьютеры при условии, что средняя цена не превышает $500:
SELECT MIN(price) AS min_price, MAX(price) AS max_price, AVG(price)
AS avg_price
FROM PC
HAVING AVG(price) <= 500;
То ответ – пустое значение, т.к. условие не выполняется.
Ответ
Объединения
Одна из наиболее мощных черт реляционных баз данных – возможность
объединения в запросе двух или более таблиц, в результате чего создается
новая таблица (или набор записей), содержащая информацию из обеих таблиц.
Таблицы соединяются, согласно отношениям между ними, чаще всего между
первичным ключем одной таблицы и соответствующим внешним ключем
другой таблицы. В зависимости от того, как таблицы соединяются, можно
получить следующие виды объединений, которые представлены в табл. 2
32
Таблица 2 – Виды объединений
Объединение
Описание
(операция SQL)
Внутреннее объединение. Записи из обеих таблиц
INNER JOIN
включаются в объединение только тогда, когда значение
специфицированного поля первой таблицы совпадает со
значением специфицированного поля второй таблицы или
когда значения в связанных полях удовлетворяют
определенному условию. Т.е., при объединении таблиц,
отбираются только записи, имеющие совпадающие
значения в связанных таблицах.
Левое внешнее объединение. В результирующий
LEFT JOIN
набор запроса включаются все записи первой таблицы (на
левой стороне операции LEFT JOIN) плюс записи из
второй
таблицы
с
совпадающими
значениями
специфицированных полей. Записи из второй таблицы (на
правой стороне) комбинируются с записями из таблицы на
левой стороне только в том случае, когда в записях на
правой стороне объединения имеются совпадающие
значения в связанных полях.
Правое внешнее объединение. В результирующий
RIGTH JOIN
набор запроса на объединение включаются все записи
второй таблицы (на правой стороне операции RIGTH
JOIN) плюс записи из первой таблицы (на левой стороне)
с совпадающими значениями специфицированных полей.
Записи из таблицы на левой стороне комбинируются с
записями из таблицы на правой стороне только в том
случае, когда в записях на левой стороне объединения
имеются совпадающие значения в связанных полях.
Внутреннее объединение − INNER JOIN
Для создания запроса, возвращающего только записи, у которых данные в
соответствующих полях совпадают, имеет следующий синтаксис:
From таблица1 INNER JOIN таблица2
ON таблица1.поле1 = таблица2.поле2
Операцию INNER JOIN можно применять к таблицам отделов и
служащих, чтобы выбрать всех служащих по каждому отделу. С другой
стороны, чтобы выбрать все отделы (даже если в некоторых из них нет
служащих) или всех служащих (даже если некоторые из них не принадлежат ни
к какому отделу – например, генеральный директор), нужно использовать
операцию LEFT JOIN или RIGTH JOIN, создавая внешнее объединение.
В следующем примере показано, как можно соединить таблицы Группы
товаров и товарных позиций Товары по полю Код группы:
SELECT Код группы, Группа товаров, Наименование товара
33
FROM Группа товаров INNER JOIN Товары
ON Группа товаров.КодГруппы = Товары.Код группы
В этом примере Код группы – соединяющее поле.
Операции LEFT JOIN, RIGTH JOIN
Внешние соединения объединяют записи исходных таблиц, когда
используются в предложении FROM со следующим синтаксисом:
FROM таблица1 [LEFT | RIGTH ] JOIN
таблица2 ON таблица1.поле1 = таблица2.поле2
Операция соединения. Используется в языке SQL для вывода связанной
информации, хранящейся в нескольких таблицах. Операции подразделяются на
внутренние и внешние. Связывание производится, как правило, по первичному
ключу одной таблицы и внешнему ключу другой таблицы. Предложение
WHERE может содержать множественные условия соединений.
Внутренние соединения. Внутреннее соединение возвращает только те
строки, для которых условие соединения принимает значение true. Рассмотрим
пример запроса:
SELECT StudName, ExamMark
FROM Student, Exams
WHERE Kurs=2AND ExamMark=5 – получить список студентов 2-го
курса, сдавших экзамен на 5.
В запросе можно использовать способ непосредственного указания
таблиц или указания таблиц с помощью алиасов (псевдонимов).
Внешние соединения. Внутреннее соединение возвращает только строки,
для которых условие соединения принимает значение true. Внешнее соединение
возвращает все строки из одной таблицы и те строки из другой таблицы, для
которых условие соединения принимает значение true. Существуют два вида
внешнего соединения: в левом соединении (LEFT JOIN) запрос возвращает все
строки из таблицы, стоящей слева от LEFT JOIN и только те из правой
таблицы, которые удовлетворяют условию соединения. Для правого
соединения – все наоборот. Например:
SELECT name, department
FROM employee e LEFT JOIN department d ON e.dept_no = d.dept_no –
получить список сотрудников и название их отделов, включая сотрудников,
еще не назначенных ни в какой отдел.
Создадим две простейшие таблицы и рассмотрим примеры соединения
таблиц.
Таблица Клиент
Код_Клиент
34
ФИО
Таблица Операц.
Код_Опер
Код_Клиент
Наим_Товар
1
Иванов
1
2
Шуба
2
Петров
2
3
Телогрейка
3
Сидоров
3
3
Кофта
Двухтабличный запрос, представленный ниже, называют перекрестным
запросом. При таком объединении каждая строка одной таблицы объединяется
с каждой строкой другой таблицы, создавая при этом все возможные
комбинации строк обеих таблиц. Результирующая таблица содержит число
столбцов, равное сумме столбцов в объединяемых таблицах. А число записей в
результирующей таблице определяется произведением числа записей в
таблицах.
SELECT [Клиент].[Код_Клиент], [Клиент].[Фио], [Операц].[Наим_Товар]
FROM Клиент, Операц;
Код_Клиент
ФИО
Наим_Товар
1
Иванов
Шуба
2
Петров
Шуба
3
Сидоров
Шуба
4
Егоров
Шуба
5
Салтанов
Шуба
1
Иванов
Телогрейка
-------
---------
--------
-------
---------
---------
1
Иванов
Свитер
В реальных запросах, чаще всего, число строк в результирующей таблице
ограничивают при помощи условия WHERE. И, как правило, производится
выборка из таблиц при условии совпадения полей, обеспечивающих связь с
таблицами.
Например,
SELECT [Клиент].[Код_Клиент], [Клиент].[Фио], [Операц].[Наим_Товар]
FROM Клиент, Операц
WHERE [Клиент].[Код_Клиент]=[Операц].[Код_Клиент];
Код_Клиент
ФИО
Наим_Товар
1
Иванов
Свитер
2
Петров
Шуба
2
Петров
Сапоги
3
Сидоров
Телогрейка
35
Еще один пример для вывода данных для всех полей обеих таблиц.
SELECT *
FROM Клиент, Операц
WHERE [Клиент].[Код_Клиент]=[Операц].[Код_Клиент];
Клиент.Код_Клиент
ФИО
Код_Опер Операц.Код_Клиент
Наим_Товар
1
Иванов
4
1
Свитер
2
Петров
1
2
Шуба
2
Петров
5
2
Сапоги
Для связывания таблиц, как было показано ранее, можно использовать
оператор объединения JOIN.
Примеры использования этих операторов приводятся ниже:
SELECT *
FROM Клиент INNER JOIN Операц ON
[Клиент].[Код_Клиент]=[Операц].[Код_Клиент];
Клиент.Код_Клиент
ФИО
Код_Опер Операц.Код_Клиент Наим_Товар
1
Иванов
4
1
Свитер
2
Петров
1
2
Шуба
2
Петров
5
2
Сапоги
SELECT *
FROM Клиент LEFT JOIN Операц ON
[Клиент].[Код_Клиент]=[Операц].[Код_Клиент];
Клиент.Код_Клиент
36
ФИО
Код_Опер Операц.Код_Клиент Наим_Товар
1
Иванов
4
1
Свитер
2
Петров
1
2
Шуба
2
Петров
5
2
Сапоги
3
Сидоров
2
3
Телогрейка
3
Сидоров
3
3
Кофта
4
Егоров
Левое объединение (LEFT JOIN) позволяет включить в результирующую
таблицу строки “левой” таблицы “Клиент”, которым не нашлось соответствия
в “правой” таблице.
SELECT *
FROM Клиент RIGHT JOIN Операц ON
Клиент.Код_Клиент=Операц.Код_Клиент;
Клиент.Код_Клиент
ФИО
Код_Опер Операц.Код_Клиент Наим_Товар
1
Иванов
4
1
Свитер
2
Петров
1
2
Шуба
2
Петров
5
2
Сапоги
При правом объединении таблиц (RIGHT JOIN), удовлетворяющие условию Клиент. Код_Клиент = Операц.Код_Клиент и строки “правой” таблицы “
Операц”, которым не нашлось соответствия в “левой” таблице “Клиент”.
Вложенные запросы. Вложенный запрос – это такой запрос, который
является составной частью другого запроса.
Создадим две таблицы Компоненты и Магазин, которые связаны между
собой ключем “Код_Компон”.
Компоненты
Код_Компонен
Магазин
Наимен
1
Процессоры
2
Материнские платы
3
Видеоадапторы
4
Жесткие диски
Код_Магаз Код_Компон
Наименов
Цена
1
2
Материнская плата1
22,50 грн.
2
5
Оперативная память1 24,50 грн.
3
1
Процессор1
12,85 грн.
4
1
Процессор2
18,45 грн.
5
1
Процессор3
22,80 грн.
6
5
Оперативная память2 25,60 грн.
7
2
Материнская плата2
30,75 грн.
8
4
Жесткий диск1
14,50 грн.
37
Выполним запрос:
SELECT Магазин.*
FROM Компоненты, Магазин
WHERE Компоненты. Код_Компонен=Магазин.Код_Компон And
Компоненты. Наимен='Процессоры';
Код_Магаз Код_Компон
Наименов
Цена
3
1
Процессор1
12,85 грн.
4
1
Процессор2
18,45 грн.
Многотабличные запросы зачастую сложны в использовании, поэтому
прибегают к вложенным запросам. Приведем запрос, эквивалентный
предыдущему:
SELECT * FROM Магазин
WHERE Код_Компон = (SELECT Код_Компонен From Компоненты
WHERE Наимен = 'Процессоры');
Код_Магаз Код_Компон Наименов
Цена
3
1
Процессор1 12,85 грн.
4
1
Процессор2 18,45 грн.
Как видно из приведенного запроса, здесь в качестве внешнего выступает:
SELECT * FROM Магазин
А в качестве вложенного запроса:
SELECT Код_Компонен FROM Компоненты WHERE
Наимен='Процессоры';
Степень вложения запросов не ограничевается одним уровнем, могут
использоваться и многоуровневые запросы, например, приведем запрос, в
котором извлекается название компонента из таблицы “Компонент”, которому
принадлежит последняя позиция в таблице “Магазин”:
SELECT Наимен
FROM Компоненты
WHERE Код_Компонен = (SELECT Код_Компон FROM Магазин
WHERE Код_Магаз = (SELECT MAX (Код_Магаз) FROM Магазин));
Наимен
Видеоадапторы
После того как были рассмотрены основные теоретические вопросы,
можно приступить к практической части.
38
Использование компонента ADOQUERY
Создадим новый проект и к этому проекту добавим контейнер
DataModule, на котором расположим ADOConnection и компоненты ADOQuery
и DataSource. Ha главной форме расположим компонент PageControl, на первой
странице которого установим DBGrid и DBNavigator.
Компонент ADOQuery используется для выполнения запросов к БД.
Рисунок 24 – Окно формы проекта с набором компонент
для отображения результатов запроса
Работа компонента и его настройка мало чем отличаются от
аналогичного компонента ADOTable. Для ADOConnection мы должны
обеспечить связь (свойство ConnectionString) с базой данных (db1.mdb).
Для ADOQuery мы также должны выбрать строку подключения (свойство
ConnectionString) или связать этот компонент с компонентом
ADOConnection через свойство Connection. Компонент DataSource,
который отвечает за отображение данных из таблицы, свяжем с
компонентом ADOQuery (свойство DataSet).
Процесс создания запроса с использованием ADOQuery
Рассмотрим различные методы создания запросов. Для выполнения
запроса нам будут необходимы следующие компоненты: ADOQuery,
DataSource, ADOConnection, которые размещены в контейнере
DataModule2 (рис. 25).
Рисунок 25 – Контейнер DataModule2 с набором компонент
для организации запросов
39
Для отображения запроса на форму установим DBGrid1 и DBNavigator1.
Создаем простейший запрос на выборку всех полей таблицы «Тарифы». Для
этого произведем двойной щелчок по свойству SQL компонента ADOQuery1 и
в окне редактора запроса (рис. 26) запишем оператор запроса: SELECT * FROM
Тарифы
Рисунок 26 – Окно редактора запросов
Для выполнения запроса необходимо установить свойство Active
компонента ADOQuery в True, для отображения результата запроса в DBGrid,
необходимо свойство DataSource компонента DBGridl связать с компонентом
ADOQueryl, точно также как и для компонента ADOTable. Аналогичное
свойство необходимо установить и для DBNavigatorl. Результаты запроса
отобразятся в DBGridl (рис. 27).
Рисунок 27 – Результат запроса
Часто нужно отображать разные таблицы или записи в одном и том
же визуальном компоненте. Например, будем использовать DBGridl и
DBNavigatorl для разных таблиц, т.е. выполнять разные запросы к разным
таблицам.
Изменим некоторые свойства установленных на форме и на Data
Module компонентов:
- свойство Name компонента Data Module изменим на DM2;
- свойство Name компонента ADOQueryl изменим на ADOQl;
40
- свойство Name компонента DataSource1 изменим на DS1;
- свойство Active компонента ADOQl установим в значение
False;
- отменим свойство DataSource компонента DBGridl, т.е. сделаем
его пустым;
- отменяем свойство DataSource компонента DBNavigatorl.
Добавим на форму кнопку Button1. Свойство Caption изменим на
«Выполнить запрос1». Приводим текст программы для этой кнопки:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DM2->ADOQ1->Close();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS1;
DBN1 ->DataSource=DM2->DS1;
DM2->ADOQ1->Open();
}
Первый оператор закрывает запрос, если он был активен, а второй и
третий отключают источник данных. Четвертый, пятый операторы подключают
нужную таблицу, а шестой активизирует запрос. Для первого запроса покажем
все поля таблицы «Тарифы», т.е. SELECT * FROM Тарифы. Результат
выполнения запроса отражен на рис. 28.
Рисунок 28– Выполнение запроса 1
Покажем, как выполнить запрос, записанный, в Memo. Для этого
установим на форме компонент Memol и кнопку Button2, а в компонент
DataModule добавим компоненты ADOQuery2 и DataSource2. Свойства Name
обоих компонентов определим следующим образом: ADOQ2 и DS2. Запишем
событие для кнопки Button2, которая будет выполнять любой запрос,
записанный в Memol:
41
void __fastcall TForm1::Button2Click(TObject *Sender)
{
DM2->ADOQ2->SQL->Clear();
DM2->ADOQ2->Active=False;
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DBN1->DataSource=DM2->DS2;
if(Memo1->Lines->Count > 0)
{
DM2->ADOQ2->SQL->AddStrings(Memo1->Lines);
DM2->ADOQ2->ExecSQL();
DM2->ADOQ2->Open();
}
}
Рисунок 29 – Выполнение запроса 2
Ha рис. 29 отражено выполнение запроса, в определении которого
упоминается Страна "Украина". Строки соответствующие этому запросу,
записанные в свойстве Lines компонента Memol, имеют вид:
SELECT Код_тарифа, Код_абонента, Страна
FROM Абонплата
WHERE Страна = 'Украина';
B DBGrid отражен результат запроса для таблицы «Абонплата».
Продемонстрируем возможность выполнения еще одного запроса. Запрос
выполняет поиск записи по частично (начало) введенной в компонент Edit
фамилии клиента. По мере заполнения фамилии в поле Edit, курсор будет перемещаться по базе данных к требуемой фамилии.
42
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
DM2->ADOQ2->Close();
DM2->ADOQ2->SQL->Clear();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DM2->ADOQ2->SQL->Add("SELECT * FROM Абоненты");
//поиск по началу фамилии
DM2->ADOQ2->SQL->Add
("WHERE ФИО LIKE '" +Edit1->Text+ "%' ");
//поиск по совпадению с любой частью фамилии
// DM2->ADOQ2->SQL->Add
//("WHERE ФИО LIKE '%" +Edit1->Text+ "%' ");
DM2->ADOQ2->Open();
}
Рисунок 30 – Поиск записи по частично введенной в компонент Edit фамилии
B тексте программы кнопки «Выполнить запрос № 3», реализован запрос
для более сложных условий отбора данных, а именно используются логические
операторы и показан ряд других условий для разных типов полей. SQL − запрос
имеет вид:
SELECT *
FROM Абонплата
WHERE ((Код_абонента =12) OR (Код_абонента =14))
43
Событие для кнопки реализовано следующим образом:
void __fastcall TForm1::Button3Click(TObject *Sender)
{ DM2->ADOQ2->Close();
DM2->ADOQ2->SQL->Clear();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DBN1->DataSource=DM2->DS2;
DM2->ADOQ2->SQL->Add("SELECT * FROM Абонплата");
DM2->ADOQ2->SQL->Add("WHERE ((Код_абонента=12)
OR (Код_абонента=14))");
DM2->ADOQ2->Open();
}
Рисунок 31 – Выполнение запроса с условием
Создадим запрос, отбирающий записи, в которых Код_тарифа для
таблицы «Тарифы» (больше значения) >113.
SQL − запрос имеет вид:
SELECT *
FROM Тарифы
WHERE Код_тарифа>113
Программная реализация события для выполнения данного запроса
выглядит следующим образом:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
DM2->ADOQ2->Close();
44
DM2->ADOQ2->SQL->Clear();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DBN1->DataSource=DM2->DS2;
DM2->ADOQ2->SQL->Add("SELECT * FROM Тарифы");
DM2->ADOQ2->SQL->Add("WHERE Код_тарифа>113");
DM2->ADOQ2->Open();
}
Рисунок 32 – Выполнение запроса с условием (Код_тарифа>113)
Создадим запрос, в котором выводятся столбцы: Код_абонента и ФИО, и
зададим группировку по этим полям, с помощью оператора GROUP BY.
Для выполнения запроса установим на форме компонент Memo и кнопку
Button. Свойство Caption для кнопки определим как «Выполнить запрос №5», а
в свойстве Lines компонента Memo2 запишем оператор выбора:
SELECT a.Код_абонента, b.ФИО
FROM Абоненты b, Абонплата a
WHERE a.Код_абонента = b.Код_абонента
GROUP BY a.Код_абонента, b.ФИО
Текст программного кода для кнопки «Выполнить запрос №5»:
void _fastcall TForm1::Button5Click(TObject *Sender)
{
DM2->ADOQ2->SQL->Clear();
DM2->ADOQ2->Active=False;
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DBN1->DataSource=DM2->DS2;
45
if (Memo2->Lines->Count > 0)
{DM2->ADOQ2->SQL->AddStrings(Memo2->Lines);
DM2->ADOQ2->ExecSQL();
DM2->ADOQ2->Open();
}}
Рисунок 33 – Выполнение запроса с использованием псевдонимов
для таблиц и связей между таблицами
B этом операторе используются псевдонимы таблиц: «а», «b». Эти
псевдонимы вводятся для того, чтобы условно показать какие поля из каких
таблиц участвуют в запросах. В данном конкретном случае группирование
полей должно осуществляться как над полем «Код_абонента» таблицы
«Абонплата», так и над полем ФИО таблицы «Абоненты».
Оператор условия под управлением WHERE позволяет связать две
таблицы, а именно, таблицу «Абонплата» и таблицу «Абоненты». Именно это
соединение двух таблиц, в силу отношений связи между таблицами типа
«Один-ко-многим», характерно для реляционных баз.
Приведем еще один запрос, в котором соединены две таблицы и
вычисляется поле, которое назовем «К_оплате», т.е. создается вычисляемое
поле. Это новое поле − «К_оплате», определено оператором AS, равно
произведению поля «Длительность» из таблицы «Абонплата» на поле
«Стоимость» из таблицы «Тарифы». Это показано с помощью псевдонимов «w»
и «v».
SQL-запрос имеет следующую запись:
SELECT v.Наименование_тарифа, v.Код_тарифа, v.Стоимость,
w.Длительность_в_минутах, w.Длительность_в_минутах * v.Стоимость AS
К_оплате
FROM Тарифы v, Абонплата w
WHERE w.Код_тарифа = v.Код_тарифа
ORDER BY v.Код_тарифа
46
Программная реализация этого запроса имеет вид:
void _fastcall TForm1::Button6Click(TObject *Sender)
{
DM2->ADOQ2->Close();
DM2->ADOQ2->SQL->Clear();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS2;
DBN1->DataSource=DM2->DS2;
DM2->ADOQ2->SQL->Add("SELECT v.Наименование_тарифа,
v.Код_тарифа,");
DM2->ADOQ2->SQL->Add("v.Стоимость,
w.Длительность_в_минутах,");
DM2->ADOQ2->SQL->Add("w.Длительность_в_минутах *
v.Стоимость AS К_оплате");
DM2->ADOQ2->SQL->Add("FROM Тарифы v, Абонплата w");
DM2->ADOQ2->SQL->Add("WHERE w.Код_тарифа =
v.Код_тарифа");
DM2->ADOQ2->SQL->Add("ORDER BY v.Код_тарифа");
DM2->ADOQ2->Open();
}
Общий вид страницы, на которой размещены все вышеперечисленные
запросы, показан на рис. 34.
Рисунок 34 − Общий вид страницы «Запросы», с результатом запроса №6
Использование компонента ADODataSet
Компонент ADODataSet является наиболее общим компонентом для
работы с ADO, но и наиболее сложным в работе. Этот компонент обеспечивает
доступ к одной или нескольким таблицам базы данных. Этот компонет удобен
для работы непосредственно с таблицами базы так и для создания разного рода
47
запросов типа SELECT. У компонента ADODataSet несколько основных
свойств:
-ConnectionString − обеспечивает соединение с базой данных (показывает
путь соединения);
-Connection − выполняет соединение с базой;
-CommandType − обеспечивает получение типа доступа к данным
(разъяснения приведем ниже);
-CommandText − обеспечивает выбор таблицы, с которой необходимо
работать;
-Active − устанавливается в значение True для работы с данными.
Объясним правило использования свойства CommandType. Это свойство
необходимо установить в значение cmdTable, либо в значение cmdTabledirect. B
первом случае мы отправляем провайдеру SQL выражение типа:
SELECT * FROM имя таблицы,
а во втором − показываем имя таблицы, с которой провайдер должен работать.
Однако не все провайдеры поддерживают прямую работу с таблицами и
поэтому, чтобы не создавать дополнительных ошибок, рекомендуем работать
со значением свойства cmdTable.
Работа с ADODataSet
Иногда возникает необходимость просмотра в одном DBGrid’е той или
иной таблицы из БД, а также для построения разного рода запросов, что и
показано ниже на практических примерах. Приведем реализацию данной
возможности на примере использования компонента ADODataSet (рис.35).
Рисунок 35 – Содержимое формы ADODataSet
После установки значения свойства CommandType (см. табл. 7), из списка
свойств CommandText можно выбрать либо нужную таблицу, либо запрос, если
он был создан, например в MS Access. После установки свойства Active в True,
48
таблица, либо запрос отобразится в визуальном компоненте, например, в
DBGrid.
Установим в контейнере компонент ADODataSet, свойство Name
которого сделаем равным ADODSl и DataSource, свойство Name изменим на
DS3, свойство DataSet установим равным ADODSl. Установим на новой
странице компоненты PageControl DBGrid, DBNavigator2 и переименуем его
DBN2.
Таблица 7 − Свойства компонентов
Компонент
Свойства
Значение
ADODSl
Connection
ADOConnectoinl
CommandType
CmdTable
CommandText
Абоненты
Active
True
DBGrid2
DataSource
DS3
DBN2
DataSource
DS3
Для обеспечения выбора таблицы или запроса из БД установим обьект
ComboBox1, вывод данных происходит в DBGrid2, кнопка Получить список
таблиц заносит в ComboBox1 названия всех обьектов БД.
// текст программного кода ля кнопки Получить список таблиц
void __fastcall TForm1::Button7Click(TObject *Sender)
{
DM2->ADOConnection1->GetTableNames(ComboBox1->Items,
false);
ComboBox1->ItemIndex=0;
DBN2->DataSource=DM2->DS3;
}
Вывод данных производится по событию – изменения ComboBox1
(Выбрать таблицу).
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{ String s;
DM2->ADODS1->Close();
DM2->ADODS1->CommandText=ComboBox1->Items>Strings[ComboBox1->ItemIndex];
DM2->ADODS1->Active=True;
s="Таблица: "+ ComboBox1->Text;
Label4->Caption=s;
}
Используя метод GetTableNames(Comboboxl,ltems,False), загружаем
ComboBox наименованиями таблиц, а затем, выбрав нужную таблицу из
Combobox, отображаем данные из выбранной таблицы в DBGrid. Напомним,
49
что в качестве таблиц данных могут быть загружены и запросы, созданные в
Access. Результаты работы приложения приведены, на рис. 36.
Рисунок 36 – Результаты работы приложения
B предыдущих примерах, как отмечалось ранее, работая с таблицами, мы
фактически выполняли запросы типа SELECT * FROM имя таблицы. Однако
компонент ADODataSet позволяет создавать и более сложные запросы.
Для создания запросов можно воспользоваться редактором SQL. Для
этого необходимо свойство CommandType компонента ADODataSet изменить
на значение cmdText, а для свойства CommandText вызвать редактор, нажав
справа на три точки выбора «...». Открывается диалоговое окно, в котором
можно записать оператор SQL либо вручную, либо построить запрос
автоматически. Внешний вид редактора SQL показан, на рис. 37.
Рисунок 37 – Редактор SQL
50
Для автоматического построения запроса в левой панели редактора
необходимо выбрать таблицу, а затем поля для просмотра, которые переносятся
в правую часть редактора с помощью кнопок Add Table to SQL и Add Field to
SQL. По завершению построения запроса выполняется кнопка ОК.
Построим связанные таблицы с помощью оператора SQL. Для этого
установим на контейнере дополнительно по два компонента ADODataset и
DataSource, свойства Name которых соответственно назначим: ADODS2,
ADODS3, DS4, DS5. B окне формы на компоненте PageControl установим
новую страницу и на ней разместим два DBGrid. Свойства всех компонентов
отображены в табл. 8.
Таблица 8 − Свойства компонентов
Компонент
Свойство
ADODS2
CommandType
CommandText
Connection
Active
ADODS3
CommandType
CommandText
Connection
Компонент
Свойство
DataSource
Active
DS4
DataSet
DS5
Dataset
DBGrid3
DataSource
DBGrid4
DataSource
Значение
сmdText
3anpocl
ADOConnection1
True
сmdText
Запрос 2
ADOConnection1
Значение
DS4
True
ADODS2
ADODS3
DS4
DS5
«Запрос 1» и «Запрос 2» формируются с помощью свойств CommandText
и имеют следующий вид:
- Запрос 1 − SELECT Код_тарифа, Наименование_тарифа, Стоимость
FROM Тарифы
- Запрос 2 − SELECT Код_тарифа, Начало_переговора, Конец_переговора,
Страна FROM Абонплата WHERE Код_тарифа=Код_тарифа
Запрос 2 фактически формирует параметрический запрос и с помощью
свойства DataSource компонента ADODS3, обеспечивает соединение таблицы
«Тарифы» с таблицей «Абонплата» через ключевое поле «Код_тарифа».
51
Результаты выполнения приложения отражены на рис. 38.
Рисунок 38 – Результаты выполнения
Добавим новую страницу приложения в компонент PageControl, на
которой разместим два компонента DBGrid, компонент Edit и кнопку Button,
выполняющую запрос на поиск нужного тарифа. B контейнер DataModule
добавим по два компонента ADODataSet и DataSource. Все свойства
соответствующих компонентов отражены в табл. 9.
Таблица 9 − Свойства компонентов
Компонент
Свойство
Значение
ADODS4
Connection
ADOConnection 1
CommandType
CmdText
CommandText
3anpoc1
Active
True
ADODS5
Connection
ADOConnection 1
CommandType
CmdText
CommandText
Запрос 2
DataSource
DS6
Active
True
DS6
DataSet
ADQDS4
DS7
DataSet
ADODS5
DBGrid5
DataSource
DM.ADODS4
DBGrid6
DataSource
DM.ADODS5
Еd i t 2
Text
‘’
Button8
Caption
Найти по типу
52
Запрос 1 и запрос 2 реализованы с помощью редактора SQL, т.е. с
помощью свойства CommandText:
-Запрос 1:
SELECT Код_тарифа, Наименование_тарифа, Стоимость
FROM Тарифы
WHERE Наименование_тарифа = NameTarif
-Запрос 2:
SELECT Код_тарифа, Начало_переговора, Конец_переговора,
Длительность_в_минутах, Страна
FROM Абонплата
WHERE Код_тарифа=Код_тарифа
Для первого запроса в качестве параметра выступает переменная
NameTarif. По этой переменной будет осуществляться поиск, а во втором
запросе − Код_тарифа, значение для которого выбирается из первой таблицы,
связь с этой таблицей осуществляется с помощью источника соединения, т.е.
через DataSource таблицы «Абонплата», показывающая эту связь с помощью
значения DS6. Если для каждого компонента ADODataSet просмотреть
свойство Parameters, то эти параметры мы и увидим в редакторе (см. рис. 39).
Рисунок 39 − Окно редактора
Запишем программную реализацию поиска для кнопки Button8:
void __fastcall TForm1::Button8Click(TObject *Sender)
{
DM2->ADODS4->Active = false;
DM2->ADODS5->Active = false;
DM2->ADODS4->Parameters->ParamByName
("NameTarif")->Value=Edit2->Text;
53
DM2->ADODS4->Active = true;
DM2->ADODS5->Active = true;
}
Если все было сделано правильно, то приложение при выполнении будет
иметь вид, см. рис. 40.
Рисунок 40 − Результат работы приложения
Разработка конструктора запросов
При формировании SQL − запроса требуется знать точное название, как
таблиц, так и полей к которым выполняется обращение. Ошибочная запись
имени таблицы или поля приводит к невозможности выполнения запроса. Для
того, чтобы можно было просмотреть набор имеющихся таблиц в
обрабатываемой БД и список их полей, добавим новую вкладку Конструктор
запросов и реализуем на ней возможность формирования SQL − запроса с
помощью конструктора.
На первом этапе разработки установим компоненты обеспечивающие
доступ к таблицам БД. Откроем окно DM2, добавим три компонента
ADODataSet, переименуем их в ADODS6, ADODS7 и ADODS8. Установим для
всех компонент свойство Connection равным ADOConnectoin1, настройка
остальных свойств будет производиться программным образом.
Следующими установим компоненты, которые в дальнейшем будут
обеспечивать связь набора данных с визуальными компонентами DBGrid. Для
этого поместим на DM2 три компонента DataSource и переименуем их в DS8,
DS9 и DS10. Настроим их свойства DataSet, установив для DS8 равным
ADODS6, а для DS9 и DS10 − ADODS7 и ADODS8 соответственно.
На следующем этапе приступим к непосредственной разработке
конструктора запросов. Для создания конструктора формирования запроса
установим на форму один компонент Button, пять компонентов ComboBox,
шесть компонентов Label и один компонент Memo. Расположение компонентов
54
и внешний вид формы после изменения свойств Caption для компонентов Label
и Button, представлен на рис. 41.
Рисунок 41 – Рабочее окно конструктора запросов с набором инструментов
Установленные на форме компоненты образуют набор инструментов для
составления SQL − запроса. Кнопка Загрузить список доступных таблиц будет
выполнять обращение к подключенной базе данных с целью получения списка
имен, имеющихся таблиц и загрузки их в ComboBox2 и ComboBox4.
Компоненты ComboBox2 и ComboBox4 служат для выбора требуемой таблицы
и заполнения наименованиями полей выбранной таблицы ComboBox3 или
ComboBox5 соответственно. Содержимое выбранной таблицы будет
отображаться в компонентах DBGrid, которые будут установлены далее под
компонентом Memo3. Компонент ComboBox5 будет содержать набор
операторов SQL, используемых при формировании запроса, а в компоненте
Memo3 будет формироваться строка SQL − запроса.
Выполним программную реализацию для установленных компонентов.
Программный код для кнопки Загрузить список доступных таблиц
выглядит следующим образом:
void __fastcall TForm1::Button10Click(TObject *Sender)
{//Получение списка таблиц и загрузка их в ComboBox2
DM2->ADOConnection1->GetTableNames(ComboBox2>Items,false);
ComboBox2->ItemIndex=0;
//Получение списка таблиц и загрузка их в ComboBox4
DM2->ADOConnection1->GetTableNames(ComboBox4>Items,false);
ComboBox4->ItemIndex=0;
}
Программная реализация реакции ComboBox2 и ComboBox4 на выбор
таблицы будет иметь следующий вид:
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
//Отображение значений выбранной таблицы
DM2->ADODS6->Close();
DM2->ADODS6->CommandType=cmdTable;
55
DM2->ADODS6->CommandText=ComboBox2->Items>Strings[ComboBox2->ItemIndex];
DM2->ADODS6->Active=true;
//Загрузка полей выбранной таблицы в ComboBox3
ComboBox3->Items->Clear();
DM2->ADOConnection1->GetFieldNames(ComboBox2>Text,ComboBox3->Items);
ComboBox3->ItemIndex=0;
ComboBox3->Items->Insert(0,"*");
}
void __fastcall TForm1::ComboBox4Change(TObject *Sender)
{
//Отображение значений выбранной таблицы
DM2->ADODS7->Close();
DM2->ADODS7->CommandType=cmdTable;
DM2->ADODS7->CommandText=ComboBox4->Items>Strings[ComboBox4->ItemIndex];
DM2->ADODS7->Active=true;
//Загрузка полей выбранной таблицы в ComboBox5
ComboBox5->Items->Clear();
DM2->ADOConnection1->GetFieldNames(ComboBox4>Text,ComboBox5->Items);
ComboBox5->ItemIndex=0;
ComboBox5->Items->Insert(0,"*");
}
Создадим список SQL − операторов, для этого, в окне Object Inspector
компонента ComboBox5, в свойстве Items, нажмем справа от него кнопку с
тремя точками, в результате будет открыто окно редактора списка. Заполним
окно редактора требуемым набором SQL − операторов, каждый оператор в
отдельной строке. Окно редактора списка с набором SQL − операторов
представлен на рис. 42.
Рисунок 42 – Окно редактора выпадающего списка
56
Разработаем собственную функцию, выполняющую запись оператора в
конец строки компонента Memo3. Программный код функции будет иметь вид:
void __fastcall TForm1::AddMemo3SQL(String s)
{ Memo3->Lines->Strings[Memo3->Lines->Count-1] =
Memo3->Lines->Strings[Memo3->Lines->Count-1]+s;}
Поскольку данная функция обращается к компоненту Memo на форме, то
для обеспечения данной возможности объявим ее в разделе public
заголовочного файла Unit1.h:
public:
// User declarations
void __fastcall AddMemo3SQL(String s);
Организуем запись содержимого ComboBox, в конец формируемой
строки запроса компонента Memo3. Для этого, реализуем реакцию ComboBox
на двойной щелчок. В окне Object Inspector перейдем на вкладку Events,
выполним двойной щелчок левой кнопкой мыши возле события OnDblClick и в
открывшемся шаблоне запишем оператор вызова функции AddMemo3SQL.
Программный код события OnDblClick для ComboBox2 будет иметь
следующий вид:
void__fastcall TForm1::ComboBox2DblClick(TObject *Sender)
{ AddMemo3SQL(" "+ComboBox2->Text);}
Аналогично следует организовать события для компонентов ComboBox3
– ComboBox5.
Дополним нашу форму двумя компонентами Button, которые будут
служить для выполнения и очистки составленного запроса, тремя
компонентами DBGrid, для отображения содержимого таблиц и результата
выполненного запроса, и тремя Label, служащими в качестве подписей. После
изменения свойств Caption для компонентов Button и Label форма будет иметь
следующий вид (рис. 43):
Рисунок 43 – Окно формы конструктора запросов
57
Установим для DBGrid7 свойство DataSource равным DM2->DS8, для
DBGrid8 равным DM2->DS9, а для DBGrid9 равным DM2->DS10.
Напишем
программную
реализацию
выполнения
запроса,
сформированного в Мемо3:
void __fastcall TForm1::Button14Click(TObject *Sender)
{
DM2->ADODS8->Close();
DM2->ADODS8->CommandType=cmdText;
DM2->ADODS8->CommandText=Memo3->Text;
DM2->ADODS8->Active=true;
}
Программный код очистки запроса имеет вид:
void __fastcall TForm1::Button15Click(TObject *Sender)
{
DM2->ADODS8->Close();
Memo3->Clear();
}
Порядок работы с конструктором запросов
1) Нажатием кнопки Загрузить список доступных таблиц, заносим
полученный список в компоненты ComboBox2 и ComboBox4.
2) Из выпадающего списка ComboBox2 выбираем таблицу, к которой
будем производить запрос. В результате в ComboBox3 занесутся поля
выбранной таблицы, а DBGrid7 будет отображать ее содержимое. При
формировании запроса на основе двух таблиц, вторую таблицу следует выбрать
из списка ComboBox4. Ее поля будут занесены в ComboBox5, а содержимое
отражено в DBGrid8.
3) Приступаем к непосредственной записи самого запроса в компонент
Memo3. Для этого, достаточно выбрать в соответствующем ComboBox
требуемый оператор из представленного набора операторов SQL, таблицу или
поле таблицы и выполнить двойной щелчок по выбранному компоненту
ComboBox. В результате, отображаемое значение выбранного ComboBox, будет
автоматически дописано в Memo3 в конец строки формируемого запроса.
4) Записывать запрос в Memo3 можно и путем непосредственного ввода с
клавиатуры. Так, например, при перечислении в запросе списка полей,
разделительные знаки (запятые, и не только) можно ввести непосредственно с
клавиатуры.
5) Когда запрос сформирован, нажатие кнопки Выполнить запрос
приводит к его выполнению. Результат запроса отображается в DBGrid9,
расположенного в нижней области формы. Пример результата выполнения
запроса представлен на рис. 44.
58
Рисунок 44 – Результат выполнения запроса, составленного с помощью
конструктора запросов
На рис. 44 показано содержимое таблиц, для которых выполняется
запрос, а ниже результат выполнения запроса. В данном примере выполняется
просмотр сведений абонплаты. Поскольку в таблице Абонплата указывается
только код абонента, то для получения ФИО абонента по данному коду
используется связь с таблицей Абоненты через поле код_абонента.
Следует заметить, что предложенный конструктор запросов не имеет
жесткой привязки к каким-либо таблицам или полям и поэтому формирование
запроса в нем может быть выполнено для любой из имеющихся таблиц рабочей
базы данных. Такой конструктор запросов может быть оформлен в виде
отдельного приложения и представлять собой проводник баз данных.
Создание отчетов в C++ Вuilder средствами палитры
компонентов QReport
При работе с базами данных, часто возникает необходимость представить
информацию в печатном виде. Операция по созданию и форматированию документа для печати называется созданием отчета. B C++ Builder, для создания
отчетов включена система QuickReport, компоненты которой размещены на
странице QReport палитры компонентов. Данный набор компонентов позволяет
проектировать отчеты на основе таблиц, запросов, списков, текстовых файлов,
массивов, используя дизайн формы С++ Builder. Для отображения компонентов
необходимо установить пакет QuickReport Components, представленный
файлом dclqrtX0.bpl, где X − номер версии C++ Builder. Чтобы установить
пакет, необходимо выбрать команду Component −> Install Packages, щелкнуть
на кнопку Add и указать этот файл, который находится в папке BIN каталога
размещения C++ Builder.
59
Отчеты QuickReport основаны на наборе горизонтальных полос. Полоса
(band) − это область отчета или раздела, которая содержит некоторый текст,
изображение, графику, диаграммы и т.д. Если полоса и размещенные на ней
компоненты связаны с базой данных, то содержимое этой полосы печатается
столько раз, сколько имеется соответствующих записей в источнике данных.
Основные компоненты QReport
Приведем краткую характеристику основных компонентов QReport в
табл.10.
Таблица 10 − Характеристики компонентов QReport
Наименование
Назначение компонента
компонента
QuickRep
Компонент, являющийся основой для построения отчета.
Он представляет ряд возможностей по управлению создаваемого отчета, включая форматирование заголовка, шрифтов, установок принтера и др. Компонент визуален и может
использоваться как контейнер полос, составляющих отчет
QRBand
Полоса отчета. Устанавливается на QuickRep и является
основной составной частью отчета, на которой
размещаются другие его компоненты
QRLabel
Надпись.
Компонент
служит
для
отображения
необходимых надписей
QRDBText
Предназначен для отображения значения какого-либо поля
из базы данных. Тип поля базы данных должен быть
совместим с текстом, т.е. может быть целым числом,
строкой, датой, но не может быть картинкой или
бинарными данными
QRSysData
Системная информация – дата, время, номер страницы,
номер строки в таблице, общее количество страниц и т.д.
QRMemo
Набор строк для отображения в Memo
QRDBRichText Компонент для отображения данных типа Memo
QRShape
Компонент для создания обрамлений
QRImage
Компонент для отображения информации в виде
фотографий и картинок
QRDBImage
Компонент для отображения полей базы данных
графического типа
B виду того, что QuickRep основной компонент отчета, служащий
контейнером для других компонентов, вносящих в отчет информацию или
графику. Рассмотрим более детально его основные свойства.
60
Основные свойства компонента QuickRep:
- DataSet − здесь указывается набор данных (таблица), из которой отчет
будет брать данные;
- Font − шрифт, использующийся по умолчанию;
- Frame − здесь указываются параметры рамки: цвет, стиль, ширина,
наличие рамки внизу, слева, справа и вверху;
- Options − свойство содержит три параметра: FirstPageHeader, LastPageFooter и Compression. Если FirstPageHeader равно true, то заголовок отчета
печатается только на первой странице отчета. Если LastPageFooter равно true, то
нижний колонтитул печатается только на последней странице отчета. Если
установить свойство Compression в true, то отчет будет сохраняться в сжатом
виде:
- Units − задает единицу измерения размеров страницы, полей и т.д.:
миллиметры, дюймы, пиксели;
- Page − здесь устанавливаются параметры страницы: размер страницы,
отступы, ориентация и т.д.;
- PrinterSettings − задает число копий отчета и диапазон печатаемых
страниц;
- ReportTitie − задается заголовок окна предварительного просмотра;
- ShowProgress − при установленном свойстве в значение true, во время
печати документа доступен индикатор хода выполнения печати;
- SnapToGrid − показывает необходимость выравнивания компоненты по
установленной сетке;
- Zoom − устанавливается масштаб печати;
- Bands − свойство, в котором указывается, что должен содержать
будущий документ:
- HasColumnHeader − заголовки колонок, печатаются на каждой
странице;
- HasDetail − отображение строк, при использовании в отчете таблицы,
печатается столько раз, сколько в нее передается записей;
- HasPageFooter − нижний колонтитул, печатается на каждой странице;
- HasPageHeader − заголовок документа, печатается на каждой странице;
- HasSummary − содержимое этой полосы печатается один раз в конце
отчета;
- HasTitle − заголовок отчета, печатается один раз в начале отчета.
Создание отчёта для базы МТС (тарифы)
Рассмотрим пример создания и оформления отчета для таблицы
«Тарифы» базы данных db1.mdb. Создадим для этой таблицы два отчета. B
первом, выполним создание простого отчета с выводом полей текстового типа
данных, а во втором случае создадим отчет на результат выполненного запроса,
с выводом полей графического типа данных, для чего дополним нашу таблицу
«Тарифы» полем с изображением тарифа «Фото_тарифа». Предусмотрим в
61
обоих вариантах вывод информации о времени и дате создания отчета, а также
нумерацию страниц.
1. Откроем новый проект. Ha форму установим компонент PageControl,
для которого свойство Align установим равным аlClient.
2. Добавим на PageControl три листа путем выбора из контекстного меню
правой кнопки мыши New Page и изменим их свойства:
TabSheetl −> Caption = ‘Отчет’
TabSheet2 −> Caption = ‘Макет простого отчета’
TabSheet3 −> Caption = ‘Макет отчета по запросу’
3. Поместим на форму компоненты с палитры ADO: ADOConnection и
ADOTable, изменив свойство Name для ADOTablel на AT1.
4. Для ADOConnection обеспечим связь с базой данных db1.mdb через
свойство ConnectionString.
5.Установим
следующие
Connection=ADOConnectionl
TableName = 'Тарифы'
свойства
компонента
AT1:
6.Разместим на листе «Макет простого отчета» компонент
QuickRepl из палитры компонентов QReport. Установим свойство DataSet
равным AT1.
7. Добавим на QuickRepl четыре полосы, используя свойство Bands:
QuickRep1 −>Bands−>HasTitle = true
//Полоса заголовка
QuickRep1 −>Bands−>HasColumnHeader = true //Заголовок колонок
QuickRep1 −>Bands−>HasDetail = true
//Полоса вывода данных
QuickRep1 −>Bands−>HasPageFooter = true
//Полоса нижнего колонтитула
Примечание: Данного результата можно добиться установкой четырех
компонент QRBand и настройкой их свойств BandType в соответствующий тип:
rbTitle, rbColumnHeader,rbDetail и rbPageFooter.
8. B центре полосы Title разместим QRLabel, который является аналогом
компонента Label. Зададим свойство Caption равным «Тарифы Междугородной
телефонной станции».
9. Организуем вывод даты и времени печати документа, поместив в
правом верхнем углу полосы Title компонент - QRSysData. Установим его
свойство Data в значение qrsDateTime.
10.Ha полосе Column Header разместим 4 компонента QRLabel.
Зададим следующие свойства этих компонент:
62
QRLabel2 -> Caption = ‘Код_тарифа'
QRLabel3 -> Caption = ‘Наименование’
QRLabel4 -> Caption = 'Стоимость'
QRLabel5 -> Caption = 'Информация о тарифе'
11. Ha полосу Detail добавим 3 компонента QRDBText и один
QRDBRichText Установим для них следующие свойства:
QRDBTextl:
DataSet = ATl
DataField = ‘Код_тарифа'
QRDBText2:
DataSet = ATl
DataField = ‘Наименование_тарифа’
QRDBText3:
DataSet = ATl
DataField = 'Стоимость'
QRDBRichTextl:
DataSet = ATl
DataField = 'Характер_тарифа'
12. Т.к. отчет может содержать более одной страницы, то
организуем нумерацию страниц. Для этого в правом нижнем углу полосы
PageFooter поместим компонент QRSysData и настроим его свойства:
Data = qrsPageNumber
Text = ’Стр. ’
13. После выполнения всех настроек страница «Макет отчета» будет
иметь вид, представленный на рис. 45:
Рисунок 45 – Макет простого отчёта
63
14. Приступим к реализации второго отчета. Для этого, добавим на
форму компонент ADOQuery и установим свойство:
Connection = ADOConnectionl.
15.Перейдем на страницу «Макет отчета по запросу» и разместим на
ней компонент QuickRep2. Дополним его полосами и компонентами по
образцу QuickRepl, кроме полосы ColumnHeader и полосы Detail, на
которой разместим три компонента: QRDBText, QRDBRichText и
QRDBImage для отображения графической информации базы данных.
Настроим их свойства:
QRDBText4:
DataSet = ADOQueryl
DataField = 'Наименование_тарифа'
QRDBRichText2:
DataSet - ADOQueryl
DataField = 'Характер_тарифа'
QRDBImage:
DataSet = ADOQueryl
DataField = 'Фото_тарифа'
Макет отчета по запросу представлен на рис.46:
Рисунок 46 – Макет отчета по запросу
16. Перейдем на страницу «Отчет» и поместим на нее два
компонента Panel. Затем на Panel1 установим один компонент Label и два
компонента Button, а на Panel2 установим компоненты Label, Memo и два
компонента Button. Произведем настройку их свойств:
64
Panell:
Labell -> Caption = 'Простой отчет'
Buttonl -> Caption = 'Просмотр'
Button2 -> Caption = 'Печать'
Panel2:
Label2 -> Caption = 'Отчет по запросу'
Label3 -> Caption = 'Строка запроса:'
Button3 -> Caption = 'Просмотр'
Button4 -> Caption = 'Печать'
Memol -> Lines = SELECT * FROM Тарифы
Внизу панелей установим компонент Button и изменим его
свойство Caption:
Button5 -> Caption = 'Выход'
Форма должна принять вид, представленный на рис. 47:
Рисунок 47 – Окно управления отчетом
17. Создадим программный код для кнопки Button1 − Просмотр , которая
предназначена для открытия окна предварительного просмотра «Простого
отчета»:
void_fastcall TForml::ButtonlClick(TObject *Sender)
{
QuickRep1->Preview();
}
65
18. Реализуем возможность печати отчета кнопкой Печать. Обработчик
события Button2 представлен ниже:
void_fastcall TForml::Button2Click(TObject *Sender)
{
QuickRep1->Print();
}
19. Для просмотра отчета по запросу можно реализовать следующий
код программы:
void_fastcall TForml::Button3Click(TObject *Sender)
{
ADOQuery1->Active=false;
ADOQuery1->SQL->Text = Memo1->Text;
ADOQuery1->Active=true;
QuickRep2->Preview();
}
Печать отчета по запросу реализуется следующим программным кодом:
void fastcall TForml::Button4Click(TObject *Sender)
{
QuickRep2->Print();
}
20. Откроем окно формы и установим три компонента: QRTextFilter,
QRHTMLFilter и QRCSVFilter. Установка данных компонентов добавляет
возможность сохранять отчет в файл типа: QRTextFilter − текстовый файл
(*.TXT), QRHTMLFilter − HTML документ (*.HTM) и QRCSVFilter − файл,
использующий в качестве разделителя полей отчета, символ указанный в
свойстве Separator (*.CSV).
Примечание. Изначально, QuickRep в окне предварительного просмотра
позволяет выполнить сохранение отчета только в оригинальном формате QRP −
QuickReport file (*.QRP).
21. Запускаем проект на выполнение и просмотрим содержимое
закладок «Макет отчета» и «Макет отчета по запросу». Вид полученных
отчетов представлен, на рис. 48 и рис. 49.
66
Рисунок 48 – Окно предварительного просмотра «Простой отчет»
Рисунок 49 – Окно предварительного просмотра «Отчет по запросу»
67
Работа с данными графического типа
1.
B таблице «Тарифы» базы данных db1.mdb, добавим поле данных
типа «Поле объекта OLE».
2.
Ha PageControl создадим еще один лист
TabSheet4 -> Caption = 'Таблица тарифы'
3.
Разместим на нем компоненты: DataSource, DBGrid, DBNavigator и
DBImage. Установим их свойства в следующие значения:
DataSourcel:
DataSet = ATl
DBGridl:
DataSource = DataSourcel
DBNavigatorl:
DataSource = DataSourcel
DBImagel:
DataSource = DataSourcel
DataField = 'Фото_тарифа'
5. Запустим приложение и заполним поле «Фото_тарифа» фотографиями,
для чего можно воспользоваться буфером обмена Clipboard. Открыть с
помощью любой программы (например, «Paint») подходящий графический
файл, выделить его содержимое и поместить в буфере обмена («горячие»
клавиши Ctrl+C). Далее перейти в работающее приложение, выделить
компонент DBImagel и произвести вставку содержимого буфера обмена
(«горячие» клавиши Ctrl+V). B окно фотографии перенесется соответствующее
изображение.
Результат работы представлен на рис. 50:
Рисунок 50 – Окно таблицы Тарифы
68
Индивидуальные варианты
1.
Агентство по недвижимости:
Клиент – ФИО, адрес, телефон, счет в банке.
Объект недвижимости – количество комнат, этаж, площадь (жилая,
общая), этажность дома, район города, номинальная цена, продавец, дата
поступления в агентство;
Регистрация сделок – учетный номер, вид сделки (купля, продажа,
аренда), объект недвижимости, клиент, фактическая стоимость сделки, дата
сделки.
2.
Школа:
Ученики – код ученика, ФИО, домашний адрес, дата рождения,
должность отца и матери.
Учителя – ФИО, предмет, стаж, оклад.
Успеваемость – ученики, предмет, оценка, дата оценки, учитель.
3.
Нотариальная контора:
Клиент – код дела, ФИО, адрес, номер паспорта.
Нотариус – ФИО, категория, оклад, дата рождения.
Регистрация дел – вид дела (оформление наследства, копия, завещание и
др.), клиент, нотариус, стоимость услуги, даты начала и окончания.
4.
Библиотека:
Книги – регистрационный номер книги, автор, название, год издания,
цена, количество страниц, тематика (искусство, проза, поэзия, математика и
т.д.).
Читатели – ФИО, адрес, год рождения, образование,
Выдача – даты выдачи и возврата, книга, читатель, библиотекарь.
5.
Компьютерный центр коммерческой информации
Коммерческая информация – название организации, адрес, директор,
телефон, наименование производимых услуг, факс, время исполнения.
Потребитель информации – ФИО, название организации, адрес, дата
передачи информации.
Оплата за услуги – номер по порядку, код счета, адрес выставления
счета, коммерческая информация, потребитель информации, способ передачи
информации, сумма оплаты, дата оплаты, исполнитель.
6.
Склад товаров
Товары – инвентарный номер, наименование, единица измерения, цена,
изготовитель, количество, срок хранения, дата поступления.
69
Изготовители – наименование организации изготовителя, адрес, факс,
телефон, директор.
Отпуск товаров – товар, изготовитель, количество, дата выдачи,
организация потребителя, фамилия потребителя , адрес потребителя.
7.
Автогараж:
Водители – ФИО, категория, адрес, телефон, код радиовызова, дата
рождения, стаж, оклад.
Машины – марка, название, год выпуска, цена, общий километраж
пробега, марка бензина.
Маршруты – начальный пункт, конечный пункт, длина маршрута,
количество остановок, машина, водитель.
8.
АТС (отдел учета оплаты):
Абоненты – номер телефона, адрес, расчетный счет, дата установки
телефона, сумма оплаты на счету, начисленная сумма к оплате.
Операторы – ФИО, должность, с какого года работает на АТС, оклад, год
рождения.
Оплата – абонент, вид оплаты (абонентская, междугородние переговоры,
будильник и др.), сумма оплаты, дата оплаты, оператор.
9.
АТС (отдел ремонта):
Абоненты – номер телефона, ФИО, адрес, расчетный счет, дата
установки телефона, сумма на счету.
Мастера по ремонту – ФИО, должность, с какого года работает на АТС,
оклад, год рождения.
Ремонт – дата заявки, дата ремонта, абонент, стоимость, причина
неисправности, ФИО мастера по ремонту.
10.
Подписной пункт:
Издания – наименование, тип (газета, журнал), стоимость за месяц,
подписной индекс, интервал выпуска (2 раза в неделю, раз в месяц и т.д.),
страна и город издания.
Подписчик – ФИО, почтовый индекс, адрес (город, улица, дом, квартира).
Учет подписки – номер квитанции, подписчик, издание, количество
месяцев подписки, количество экземпляров, дата подписки, оператор,
оформивший подписку.
11.
Почтовое отделение:
Почтовое отправление – наименование (посылка, бандероль, денежный
перевод и др.), вес (для посылок и бандеролей), объявленная ценность или
сумма для денежных переводов, почтовый индекс, цена за пересылку единицы
почтового отправления, способ пересылки (авиа, простое и др.), адрес
отправителя.
70
Операторы – ФИО, должность, с какого года работает на почте, оклад,
год рождения.
Учет почтовых операций – номер операции, почтовое отправление,
оператор, дата отправления, код квитанции, стоимость пересылки.
12.
МТС (Междугородняя телефонная станция):
Тарифы – страна, город, стоимость одной минуты, начало и конец
льготного времени, процент скидки в льготное время.
Абоненты – номер телефона, ФИО, адрес, расчетный счет, сумма на
счету.
Учет переговоров – дата переговоров, абонент, страна, город, время
начала и конца переговоров, тариф, номер квитанции.
13. Приемная комиссия - Абитуриент:
Образование – абитуриент, оконченное учебное заведение, оценки по
математике, физике, украинскому языку;
Результаты вступительных экзаменов – абитуриент, математика,
физика, украинский язык, группа.
Абитуриент – регистрационный номер, ФИО, домашний адрес, дата
рождения, льготы (наличие золотой медали или красного диплома, Чернобыль
и т.п.).
14. Проектные работы:
Заказчики – ФИО, название организации, адрес, расчетный счет, телефон,
факс, адрес электронной почты.
Разработчики – ФИО, должность, оклад, рабочий телефон, год рождения.
Учет проектных работ – наименование проектируемого объекта,
заказник, дата приема заказа, заказанный и фактический срок окончания работ,
разработчик, сметная стоимость.
15. Сбербанк:
Клиенты – ФИО, адрес, год раждения, телефон, ФИО наследника вклада,
номер счета, сумма на счету.
Операторы – ФИО, должность, год рождения, оклад, дата поступлення
на работу.
Регистрация операций – номер операции, вид операции (выдача или
прием денег), денежная сумма, дата, клиент, оператор.
16. Расписание занятий в ВУЗе:
Предметы- наименование, семестр, специальность количество часов в
неделю, количество часов в семестр.
Преподаватели – ФИО, должность, ученое звание и степень, кафедра.
Занятия – вид занятия (лекция, семинар и др.),день недели, номер пары,
поток или группа, предмет, преподаватель.
71
17. Производство средств связи:
Продукция – наименование, марка, цена, стоимость перевозки.
Потребители – организация, адрес, расчетный счет, телефон, факс, ФИО
представителя, сумма предоплаты, расстояние для перевозки.
Учет выпуска продукции – регистрационный номер, продукция,
потребитель, дата выпуска, дата отправления потребителю, стоимость продажи,
стоимость перевозки.
18. Дипломное проектирование:
Дипломники – ФИО, группа, специальность, место прохождения
практики, место будущей работы.
Преподаватели – ФИО, должность, ученое звание и степень, кафедра.
Распределение дипломников − дипломник, преподаватель, тема, дата
выдачи задания, дата защиты, процент выполнения.
19. Преподаватели Вуза:
Преподаватели – ФИО, должность, ученое звание и степень, адрес,
телефон, семейное положение, количество детей, табельный номер, оклад, дата
поступления на работу.
Кафедры – название, заведующий, адрес, местоположение, телефон.
Расходы на зарплату − преподаватель, кафедра, дата выдачи,
оплачиваемый месяц, количество часов работы на полную ставку, ставка.
20. Фирма по реализации компьютерной техники:
Товар – наименование, марка, процессор, оперативная память, частота,
память винчестера, производительность, дата выпуска.
Покупатель – ФИО, адрес, организация, адрес, расчетный счет, телефон.
Учет реализации – регистрационный номер, товар, покупатель, дата
продажи, цена, количество, ФИО реализатора.
21. Автостоянка:
Автомобиль – название, марка, номер двигателя, год выпуска, дата
техосмотра.
Владелец автомобиля – ФИО, адрес, расчетный счет, год рождения.
Учет оплаты – автомобиль, владелец, дата прибытия, дата убытия, цена
стоянки.
22. Касса железнодорожных билетов:
Поезд – номер, пункт отправления, пункт прибытия, время прибытия и
отправления, количество свободных мест.
Пассажир – ФИО, номер паспорта, год рождения, до какой станции едет.
72
Продажа билетов – регистрационный номер, пассажир, поезд, вид
вагона (спальный, плацкарт и др.), номер вагона, место, дата, отправления
поезда, дата продажи билета, стоимость.
23. Багажное отделение аэропорта:
Пассажир – ФИО, номер паспорта, год рождения, адрес.
Багаж – номер квитанции, вес, вид упаковки (чемодан, сумка и др.),
стоимость перевозки.
Отправление багажа – регистрационный номер, багаж, пассажир, дата и
время отправления, исполнитель отправки.
24. Рекламное агентство:
Заказчики – организация, адрес, номер счета, факс, ФИО представителя,
телефон.
Работа по размещению рекламы – название рекламы, заказчик, код
рисунка, надпись, размер, исполнитель, дата заказа, дата выполнения.
Исполнители – ФИО, должность, дата поступления на работу, оклад,
образование.
25. Магазин «Диски и кассеты»
Диски – номер диска, название, категория (музыка, фильм, игра,
программа), цена закупки, цена продажи, количество дисков.
Кассеты – номер кассеты, название, цена закупки, цена продажи,
количество кассет.
Поставки – регистрационный номер товара, дата поставки дисков и
кассет, количество.
Продажи – регистрационный номер товара, дата продажи дисков и
кассет, количество.
26 Отдел заказов универмага:
Клиенты – ФИО, адрес, телефон, расчетный счет, сумма на счету.
Товары – тип товара (обувь, напитки и др.), наименование, стоимость,
дата выпуска, изготовитель, единица измерения.
Заказы – регистрационный номер, клиент, товар, количество, цена
продажи, дата заказа, процент надбавки за обслуживание, стоимость доставки
за единицу расстояния, длина маршрута доставки заказа, дата выполнения
заказа.
27. Оптовый рынок:
Товары – наименование, стоимость, дата выпуска, изготовитель, единица
измерения, цена поставщика.
Поставщики – организация, адрес, телефон, факс, расчетный счет, ФИО
представителя.
73
Реализация товаров – учетный номер, товар, дата продажи, рыночная
цена, количество, продавец, поставщик.
28. Множительный центр печатной продукции:
Материалы – наименование, единицы измерения, цена за единицу
материала.
Заказчики – ФИО, организация, адрес, телефон, факс, расчетный счет,
ФИО представителя.
Выполнение заказов – регистрационный номер, дата заказа, заказчик,
исполнитель, дата выполнения заказа.
29. Морские грузоперевозки:
Грузополучатель – организация, ФИО ответственного, адрес, телефон,
факс, расчетный счет.
Груз – наименование, вид упаковки (бочки, ящики и др.), количество в
одной упаковке, производитель, дата изготовления, срок хранения.
Учет перевозки груза – регистрационный номер, груз, грузополучатель,
дата отправления, стоимость перевозки одной упаковки, количество упаковок,
дата получения груза.
30. Охранное агентство
Сотрудники – ФИО, должность, дата поступления на работу, оклад,
образование.
Заказчики – организация, адрес, номер счета, факс, ФИО представителя,
телефон, вид услуг
Вид предоставляемой услуги – наименование услуги (охрана объекта,
установка сигнализации и др.), стоимость вида услуги, ФИО заказчика, дата
заказа, дата выполнения заказа.
31. Торговый дом
Товар – наименование, марка, производитель, цена, дата выпуска.
Покупатель – ФИО, адрес, организация, адрес, расчетный счет, телефон.
Учет реализации – регистрационный номер, товар, покупатель, дата
продажи, цена, количество, номер накладной, ФИО реализатора.
32. Супермаркет
Товар – наименование, производитель, цена, дата выпуска.
Продавец – ФИО, идентификационный номер, адрес, организация,
расчетный счет, телефон.
Учет продаж – регистрационный номер, товар, покупатель, дата
продажи, цена, количество, номер накладной, ФИО продавца.
74
Список литературы
1. Шаповаленко В.А. Создание и обработка баз данных. / Шаповаленко
В.А. – Часть2 – Одесса, ОНАЗ, 2004.
2. Швайко И.Г. Создание и обработка баз данных. Использование
технологии ADO для СОБД / Швайко И.Г., Буката Л.Н., Северин Н.В. – Одесса:
ОНАЗ, 2009.
3. Вейскас Джон. Эффективная работа с Microsoft Access 2000. / Вейскас
Джон – СПб.: Питер, 2000. – 1040с.
4. Винтер Р. Microsoft Access 97. Справочник. / Винтер Р. – С.Пб.: Питер,
1998.
5. Келли Д. Самоучитель Access 97./ Келли Д. – С.Пб.: Питер, 1999.
6. Керри Н. Microsoft Access 97. / Керри Н. Прач, Уильямс С. Амо,
Джеймс Д. Фокселл. – К:Диалектика, 1997. – 672с.
7. Прач К.Н. Microsoft Access 97 / Прач К.Н., Амо У.С., Фокселл Д.Д.. –
К.: Диалектика, 1997.
8. Дейт К.Д. Введение в системы баз данных. / Дейт К.Д. – С.
Пб.:Вильямс, 2000.
75
Содержание
Вступление ........................................................................................................ 3
Указания по оформлению ................................................................................. 4
Курсовое задание .............................................................................................. 4
Указания по выполнению ................................................................................. 5
Варианты индивидуальных заданий ............................................................... 69
Список литературы ......................................................................................... 75
Редактор – Гусак В.Т.
Компьютерное редактирование и макетирование – Кирдогло Т.В.
76
Download