Министерство инфраструктуры Украины
Государственная служба связи
ОДЕССКАЯ НАЦИОНАЛЬНАЯ АКАДЕМИЯ СВЯЗИ им. А.С.ПОПОВА
Кафедра информационных технологий
Курсовая работа
Обработка баз данных
с помощью языка SQL
Задание и методические
указания по выполнению
модуль 1
для студентов
технических специальностей академии Одесса – 2011 УДК 043.43 План УМИ 2011 г.
Методическое пособие разработали:
И.Г. Швайко, Л.М. Буката, Н.В. Северин, Д.Г. Ларин Методическое пособие рассмотрено и рекомендовано к печати на заседании кафедры ИТ, протокол № 7 от 1 февраля 2011 г.
Зав. каф. Леонов Ю.Г.
Методическое пособие одобрено методическим советом факультета Информационных систем, протокол № 8 от 3 февраля 2011 г.
Декан факультета Стрелковская И.В.
Утверждено:
Методическим советом академии связи Протокол №8 от 11.02.2011г.
ВСТУПЛЕНИЕ
Методическое пособие содержит теоретические сведения и указания по выполнению курсовой работы дисциплины „Базы данных”, а также вариантов индивидуальных заданий, которые позволят всесторонне усвоить работу, связанную с созданием, редактированием баз данных и созданием запросов к базе данных, используя язык SQL. Для самостоятельного выполнения курсовой работы, в пособии приведена последовательность выполнения этой работы на компьютере.Пособие предназначено для приобретения практических навыков создания и обработки баз данных студентами всех специальностей академии, которые изучают дисциплину „Базы данных”.
Пособие будет также полезным для всех, кто стремится самостоятельно изучить теоретический материал для работы с системой управления базами данных MS Access и научиться квалифицированно обрабатывать базы данных, используя язык структурированных запросов SQL.
Тема Обработка баз данных с помощью языка SQL Цель: Спроектировать базу данных в соответствии со своим индивидуальным вариантом. Приобрести практические навыки по обработке базы данных, спроектированной в СУБД Access, а также при работе с базами данных в среде C++ Builder и создании запросов, модификации и управления данными в реляционных базах данных, используя язык SQL.
Указания по оформлению.
Курсовая работа оформляется на листах формата А4, в состав которой должны входить следующие разделы:
1. Титульный лист с указанием названия курсовой работы и Ф.И.О.
исполнителя.
2. Содержание.
3. Краткие теоретические сведения.
4. Текст задания курсовой работы, согласно индивидуального варианта.
5. Таблицы базы данных и связи между спроектированными таблицами в 6. Создание запроса с использованием компонента ADOQuery в среде C++ 7. Использование компонента ADODataSet как для редактирования данных, так и для создания запросов.
8. Создание отчетов в С++Builder средствами палитры компонентов 9. Анализ полученных результатов.
10. Список литературы.
Содержание задания курсовой работы 1. Спроектировать структуру таблиц данных в соответствии с вариантом индивидуального задания.
2. Создать в Access таблицы базы данных с реляционной структурой.
3. Используя язык SQL, создать различные запросы к базе данных.
4. Настроить визуальные компоненты в С++Builder для отображения созданной базы данных.
5. Создать запрос, используя компоненты ADOQuery.
6. Используя разные режимы работы компонента ADODataSet, представить данные для их редактирования, а также для создания запросов.
7. С помощью компонента ADODataSet, обеспечить отображения связи между таблицами.
8. Предусмотреть возможность создания запросов во время обработки данных.
Под базой данных (БД) понимается совокупность специальным образом организованных данных, хранящихся в памяти вычислительной системы и отображающих состояние объектов и их взаимосвязей в рассматриваемой предметной области.
БД – это модель определенной предметной области, представленная в виде совокупности связанных между собой двумерных таблиц, отчётов и запросов к ним.
Задача БД состоит в хранении всех представляющих интерес данных в одном или нескольких местах, причем таким способом, который заведомо исключает ненужную избыточность. В хорошо спроектированной БД избыточность данных исключается, и вероятность сохранения противоречивых данных минимизируется. Создание БД преследует две основные цели: понизить избыточность и повысить надежность.
Требования к БД:
БД должна удовлетворять всем требованиям пользователей к содержимому БД. Перед проектированием БД необходимо провести обширные исследования требований пользователей к функционированию БД;
БД должна гарантировать непротиворечивость и целостность данных.
При проектировании таблиц нужно определить правила, ограничивающие возможность ввода ошибочных данных, их дублирования и т.д.;
БД должна обеспечивать естественное, легкое структурирование информации. Качественное построение БД позволяет делать запросы к базе более «прозрачными» и легкими для понимания; следовательно, снижается вероятность внесения некорректных данных и улучшается качество сопровождения БД;
БД должна удовлетворять требованиям пользователей к производительности БД.
определить информационные потребности БД (всю информацию разбить на несколько таблиц по смыслу);
проанализировать объекты реального мира, которые необходимо отразить в БД; описать эти объекты, определить их характеристики и сформировать списки объектов (определить поля каждой таблицы);
привести в соответствие характеристики объектов и столбцы таблиц с учётом выбранной СУБД (Paradox, xBase, Access и др.);
определить атрибуты, которые уникальным образом идентифицируют каждый объект;
выбрать правила, которые будут поддерживать целостность данных;
установить связи между объектами, провести нормализацию таблиц;
спланировать вопросы надежности данных и, при необходимости, сохранения секретной информации.
Создают БД и обрабатывают запросы к ним системы управления базами данных – СУБД.
СУБД – это комплекс языковых программных средств, предназначенный для создания, ведения и совместного использования БД многими пользователями.
Известно множество СУБД, различающихся своими возможностями или обладающих примерно равными возможностями и конкурирующими друг с другом: Paradox, dBase, Ms Access, FoxPro, Oracle, InterBase и др. Разные СУБД по-разному организуют и хранят БД. Например, Paradox и dBase используют для каждой таблицы отдельный файл. В этом случае база данных – это каталог, в котором хранятся файлы таблиц. В Ms Access и в InterBase несколько таблиц хранится как один файл. Системы типа клиент-сервер, такие, как серверы SyBase или Microsoft SQL, хранят все данные на отдельном компьютере.
MicrosoftOfficeBackstage (рис. 1), в котором можно получить сведения о текущей базе данных, создать новую базу данных, открыть существующую базу данных и просмотреть справочные материалы с веб-сайта Office.com. В представлении Backstage также доступны команды настройки, обслуживания и совместного использования баз данных. Как правило, команды в представлении Backstage применяются ко всей базе данных, а не к отдельным ее объектам.
Создание базы данных с помощью шаблона В Ms Access имеется большое количество шаблонов, позволяющих ускорить создание базы данных. Шаблон – это готовая база данных, содержащая все таблицы, запросы, формы и отчеты, необходимые для выполнения определенной задачи. Например, существуют шаблоны, используемые для отслеживания проблем, управления контактами или записи расходов. Некоторые шаблоны содержат несколько образцов записей, чтобы продемонстрировать их использование. Шаблоны баз данных можно использовать как есть или настроить в соответствии с конкретными требованиями.
Создание базы данных с помощью шаблона Access 1. Запустите приложение Access 2010.
2. На вкладке Создание в представлении Backstage нажмите кнопку Образцы шаблонов.
3. Выберите в разделе Доступные шаблоны нужный шаблон.
4. В поле Имя файла введите имя файла.
5. Также можно щелкнуть значок папки рядом с полем Имя файла и указать расположение, в котором необходимо создать базу данных. Если расположение не указано, база данных создается в расположении по умолчанию (отображается под полем Имя файла).
6. Нажмите кнопку Создать.
Приложение Access создаст базу данных и откроет ее (рис. 2).
В MS Access 2010 можно выбрать один из двух типов баз данных:
стандартную базу данных для настольных компьютеров или веб-базу данных.
Для обоих типов баз данных обычно необходимо выполнить одно из указанных ниже действий.
1 Создание таблиц и ввод данных в таблицы.
Импорт данных из других источников с созданием таблиц в процессе импорта.
2 Создание пустой базы данных Запустите Ms Access.
На вкладке Создание в представлении Backstage нажмите кнопку Новая база данных или Пустая веб-база данных.
Примечание. От выбранного варианта зависит, какие функции будут доступны для работы с базой данных. Базы данных для настольных компьютеров нельзя опубликовать в Интернете, а веб-базы данных не поддерживают некоторые функции баз данных для настольных компьютеров, например итоговые запросы.
3 В поле Имя файла справа введите имя базы данных.
Чтобы изменить расположение, в котором будет создан файл, нажмите кнопку Обзор рядом с полем Имя файла, выберите новое расположение и нажмите кнопку ОК.
4 Нажмите кнопку Создать.
Ms Access создаст базу данных (рис. 3), а затем откроет пустую таблицу с именем «Таблица1», в режиме таблицы (Режим таблицы). В режиме таблицы поддерживается изменение значений полей, добавление или удаление данных и поиск данных.
Рисунок 3 – Окно новой БД с созданием таблицы в Режиме таблицы 5 Приложение Ms Access автоматически разместит курсор в первой пустой ячейке столбца, который называется Щелкните для добавления (рис. 4) новой таблицы.
Рисунок 4 – Типы поддерживаемых данных (добавление нового столбца) Чтобы добавить данные, начните их вводить или вставьте данные из другого источника, в разделе Вставка данных из другого источника в таблицу Ms Access.
Структура таблицы создается при вводе данных. Каждый раз при добавлении в таблицу нового столбца определяется новое поле, тип которого определяется вводимым значением (Тип данных). Характеристика поля, определяющая тип данных, который может содержать это поле. Существуют следующие типы данных: Boolean, Integer, Long, Currency, Single, Double, Date, String и Variant (по умолчанию). Тип поля задается на основе типа введенных данных. Например, если в столбец введены только значения дат, его типом данных будет «Дата/время». Если впоследствии попытаться ввести в это поле значение другого типа (например, имя или номер телефона), появится сообщение о том, что значение не соответствует типу данных столбца. По возможности следует планировать таблицу таким образом, чтобы каждый столбец содержал данные одного типа (текст, даты, номера и т.д.). Это позволит значительно упростить создание запросов, форм и отчетов, для которых будут выбираться только необходимые данные.
Если на этом этапе вводить данные не требуется, нажмите кнопку Закрыть. Если закрыть таблицу «Таблица1» без сохранения, она будет удалена.
Можно добавить новую таблицу в существующую базу данных с помощью инструментов в группе Таблицы на вкладке Создание.
Независимо от того, в каком режиме начата работа, всегда можно переключиться в другой режим с помощью кнопок режимов в строке состояния окна Access.
Создание пустой таблицы в режиме таблицы В режиме таблицы можно начать вводить данные немедленно, при этом структура таблицы будет создана Access автоматически. Имена полей задаются номерами («Поле1», «Поле2» и т. д.), а тип данных поля определяется на основе типа вводимых данных.
Для создания таблицы необходимо:
На вкладке Создание в группе Таблицы нажмите кнопку Таблица.
Приложение Access создаст таблицу и поместит курсор в первую пустую ячейку столбца Щелкните, чтобы добавить.
Чтобы добавить данные, начните вводить их в первую, пустую ячейку, либо вставьте данные из другого источника.
Для переименования столбца (поля) дважды щелкните заголовок столбца и введите новое имя.
Чтобы переместить столбец, выделите его, щелкнув заголовок столбца, а затем перетащите в новое место. Можно также выделить несколько смежных столбцов и перетащить их все в новое место.
Чтобы добавить в таблицу дополнительные поля, начните вводить данные в столбец, который назывется Щелкните для добавления в режиме таблицы или воспользуйтесь командами в группе Добавление и удаление на вкладке Поля.
Создание таблицы в режиме конструктора.
В режиме конструктора сначала следует создать структуру новой таблицы. Затем для ввода данных следует переключиться в режим таблицы или воспользоваться каким-либо другим способом, например, ввести данные с помощью формы.
На вкладке Создание в группе Таблицы нажмите кнопку Конструктор таблиц.
Для каждого поля в таблице введите имя в столбце Имя поля, а затем в списке Тип данных выберите тип данных.
1. При желании введите в столбце Описание дополнительные сведения для каждого поля. Это описание отображается в строке состояния, если курсор находится в данном поле и используется в качестве текста строки состояния, для любых элементов управления, создаваемых путем перетаскивания поля из области Список полей в форму или отчет.
2. После добавления всех полей сохраните таблицу и нажмите на вкладке Файл кнопку Сохранить.
3. Чтобы начать вводить данные в таблицу, переключитесь в режим таблицы, и щелкните первую пустую ячейку. Кроме того, можно вставить данные из другого источника, как описано в следующем разделе.
Рисунок 6 – Создание таблицы в режиме Конструктор таблиц Добавление полей в таблицу в режиме конструктора 1. Откройте таблицу в режиме конструктора (Конструктор).
Представление, в котором отображается структура следующих объектов базы данных: таблицы, запросы, формы, отчеты и макросы. В режиме конструктора можно создавать новые объекты базы данных или изменять структуру существующих.
2. Чтобы вставить в таблицу поле, щелкните строку, над которой его нужно поместить, и нажмите кнопку Добавить строки на панели инструментов. Чтобы добавить поле в конец таблицы, щелкните первую пустую строку.
3. Щелкните ячейку в столбце Имя поля и введите уникальное имя поля.
4. В столбце Тип данных можно оставить настройку по умолчанию (Текстовый) или выбрать из раскрывающегося списка, другой тип данных.
5. В столбце Описание введите описание данных, которые будет содержать это поле. Текст описания будет выводиться в строке состояния (Строка состояния).
Добавление поля (столбца) в таблицу в режиме таблицы 1. В меню Вставка выберите команду Столбец.
2. Дважды щелкните заголовок нового столбца и введите его уникальное имя. Откройте таблицу в режиме таблицы. Режим таблицы это представление, в котором данные из таблицы отображаются в формате строк и столбцов. В режиме таблицы поддерживается изменение значений полей, добавление или удаление и поиск данных.
3. Щелкните столбец, слева от которого требуется добавить новый столбец.
Установка типа объединения по умолчанию для связей Объединение связь между полем одной таблицы или запроса и полем другой таблицы или запроса, имеющим тот же тип данных.
Для создания связей между таблицами базы данных нужно выполнить следующие действия.
1. Нажмите кнопку Схема данных на панели инструментов, чтобы открыть окно схемы данных.
2. Дважды щелкните среднюю часть линии объединения двух таблиц, чтобы открыть окно Изменение связей (рис. 7).
3. Нажмите кнопку Объединение и выберите требуемый тип объединения.
Среди свойств связей, наиболее важными являются:
Обеспечение целостности данных дает возможность избежать ошибки при вводе информации в связанные таблицы и удалении записей с исходной таблицы;
Каскадное обновление данных возможно, если включено Обеспечение целостности данных, и дает возможность автоматически изменять данные в связанной таблице, если они были изменены в исходной таблице;
Каскадное удаление данных автоматически удаляет данные в связанной таблице в случае удаления их в исходной таблице.
Для подтверждения установки связей необходимо нажать кнопку ОК.
Рассмотрим базу данных «МТС (Междугородняя телефонная станция)».
Структурные схемы и связи между спроектированными таблицами Таблица 1 – Типы полей таблицы «Тарифы»
Таблица 2 – «Тарифы»
Код_тарифа Наименов_тарифа Стоимость Характер_тарифа Создадим спроектированную таблицу Тарифы в Access в режиме Таблица (рис. 8).
Рисунок 8 – Создание таблицы Тарифы в режиме Таблица Таблица 3 – Типы полей таблицы «Абоненты»
Таблица 4 – «Абоненты»
12 Тимофеев О.В. 0952371838, ул. Комсомольская, 42, кв.
14 Николаев М.В. 0987296143, ул. Львовская, 15, кв. 38, г.
Таблицу Абоненты создадим в режиме Конструктора таблиц (рис. 9).
Рисунок 9 – Создание таблицы Абоненты в режиме Конструктор таблиц Таблица 5 – Типы полей таблицы «Абонплата»
Код_або Код_т Код_або Начало_пе Конец_перего- Длите- Страна Рисунок 10 – Создание таблицы Абонплата в режиме Конструктор таблиц Рисунок 11 – Схема данных, показывающая реляционную модель данных Технология 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
Согласно терминологии ADO, любой источник данных (база данных, электронная таблица, файл) называется хранилищем данных, с которым при помощи провайдера данных взаимодействует приложение. Минимальный набор компонентов приложения может включать объект соединения, объект набора данных, объект процессора запросов.В системе программирования С++ Builder компоненты, используемые для создания приложений по технологии ADO находятся на закладке ADO, С++ Builder, версия 6.0 или закладке dbGo более высоких версий С++ Builder. Эти компоненты представлены на рис.2: ADOConnection, ADODataSet, ADOQuery, ADOStoredProc.
компонента ADOConnection Используется для связи с набором данных ADO. Может работать с несколькими компонентами наборов данных как ADOCommand Используется в основном для выполнения команд SQL, не совместно с другими компонентами использоваться для таблиц. Связь осуществляется непосредственно через ADOQuery Используется для работы с набором данных с Может связываться с набором данных непосредственно, ADOStoredProc Используется для выполнения процедур, хранимых на Компонент ADOConnection предназначен для настройки соединения с сервером или с локальной базой данных. Соединение должно быть отражено в свойстве ConnectionString этого компонента. Соединение с базой данных может быть указано двумя способами: либо через файл связи к данным (файл в формате Microsoft Data Link, расширение UDL), либо прямым заданием параметров соединения. Будем использовать простой способ соединения с базой данных, для чего вызывается редактор свойств, нажав на кнопку «...» свойства ConnectionString (рис. 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 – Окно выбора провайдера доступа к безе данных После выбора требуемого 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 – Сообщение об успешной проверке соединения Теперь в свойстве компонента ADOConnection рекомендуется отключить свойство LoginPrompt, установив значение этого свойства в False (это позволит не выводить окно ввода пароля при каждом обращении к базе). По завершении настройки необходимо свойство Connected установить в значение True для обеспечения связи с базой.
Если компонент ADOConnection, и другие невизуальные компоненты, устанавливаются на вспомогательном модуле-контейнере DataModule, то этот модуль необходимо подключить для основной (рабочей) формы, для чего выполняют команду File - Include Unit Hdr...
Компонент ADOTable предназначен для работы с одной из таблиц базы данных. Для настройки этого компонента в инспекторе объектов имеются следующие свойства:
B этом списке перечислены минимально необходимые свойства, которые позволяют работать с одной из таблиц базы данных: добавлять, изменять и удалять записи в таблице базы данных.
Свойство Connection позволяет обеспечить связь с базой, поэтому единственным значением в списке свойств будет ADOConnection1, с помощью которого мы установили связь с базой данных при настройке компонента TADOConnection.
Свойство TableName позволяет выбрать нужную таблицу для работы с данными. Значение этого свойства должно отображать одну из таблиц базы данных.
Свойство Active контролирует правильность заданных свойств и открывает или закрывает набор данных таблицы базы данных. Поэтому значение этого свойства для открытия набора следует установить в True.
Остальные компоненты ADO и их назначение будут рассмотрены по мере необходимости.
Данные из базы становятся доступны пользователю, если они отображены на визуальных компонентах (и не только). Основные визуальные компоненты расположены на панели компонентов Data Controls. Чтобы отразить данные на визуальных компонентах, необходимо показать, какие из них будут использоваться для работы с набором данных. Поэтому, визуальный компонент должен содержать данные из конкретной таблицы.
Звено, которое обеспечивает соединение набора данных с одним из визуальных компонентов, называется компонент DataSource, который расположен на панели компонентов Data Access. Основное свойство этого компонента DataSet. Значение этого свойства следует установить (связать) с конкретной таблицей базы данных, которая выбрана с помощью компонента ADOTable.
Таким образом, компоненту DataSource необходимо указать, какую таблицу он будет отображать на визуальных компонентах.
Все выше перечисленные компоненты можно разместить на DataModule – вспомогательном контейнере для невизуальных компонентов (рис. 18). Этот контейнер необходимо подключить к основной форме: File->IncludeUnitHdr.
Самый простой способ отобразить данные из таблицы – установить на форму визуальный компонент dbGrid (рис. 19), который находится на закладке DataControls. Этот компонент может отражать данные в виде таблицы, здесь можно добавлять, удалять и редактировать данные. Для того чтобы связать компонент dbGrid с выбранной таблицей, необходимо в свойстве DataSource этого компонента указать DataSource1, который связан с компонентом ADOTable1.
Можно установить компонент dbNavigator (рис. 20), который предназначен для удобства управления таблицей. Он состоит из 10 кнопок, их назначение представлено в табл. 1.
Таблица 1 – Кнопки dbNavigator nbFirst Перемещение к первой записи nbPrior Перемещение к предыдущей записи nbNext Перемещение к следующей записи nbLast Перемещение к последней записи nbInsert Вставить новую запись перед текущей nbDelete Удалить текущую запись nbEdit Редактировать текущую запись nbCancel Отменить изменения в текущей записи nbRefresh Очистить буфер, связанный с набором данных Пользуясь свойством компонента VisibleButtons, можно убрать любые ненужные кнопки.
Прежде чем приступить к созданию проекта, в котором будем строить запросы, рассмотрим основные сведения о языке SQL по созданию запросов.
SQL (Structured Query Language) — Структурированный Язык Запросов — стандартный язык запросов по работе с реляционными БД. Язык SQL появился после реляционной алгебры, и его прототип был разработан в конце 70-х годов в компании IBM Research. В дальнейшем этот язык применялся во многих коммерческих СУБД и в силу своего широкого распространения постепенно стал стандартом "де-факто" для языков манипулирования данными в реляционных СУБД. C помощью SQL запросов, можно создавать реляционные базы данных и работать с ними.
Запрос это некоторый алгоритм решения конкретной задачи, которую мы формулируем заранее на естественном языке. И оттого, что наша задача решается всего одним оператором языка SQL, она не становится примитивной.
Мощность языка SQL и состоит в том, что он позволяет одним предложением сформулировать ответы на достаточно сложные запросы, для реализации которых на традиционных языках понадобилось бы писать большую программу.
SQL может быть двух типов: интерактивный и вложенный. Первый это отдельный язык, который сам выполняет запросы и сразу показывает результат работы. Второй это когда SQL язык вложен в другой, например в C++ Builder.
Общие правила синтаксиса SQL языка очень просты. Язык не чувствителен к регистру, если используется программа из нескольких операторов языка, то в конце каждого оператора ставится точка с запятой « ; ».
Для одного оператора точку с запятой ставить в конце оператора не обязательно. Комментарии записываются в стиле Си: /* комментарий */.
Оператор может быть записан в одной или в нескольких строках.
Язык SQL представляет собой совокупность операторов. Операторы SQL делятся на:
- операторы определения данных (Data Definition Language, DDL) - операторы манипуляции данными (Data Manipulation Language, DML) - операторы определения доступа к данным (Data Control Language, DCL) - операторы управления транзакциями (Transaction Control Language, TCL).
Все запросы на получение практически любого количества данных из одной или нескольких таблиц выполняются с помощью единственного предложения SELECT.
Язык запросов (Data Query Language) в SQL состоит из единственного оператора SELECT. Этот единственный оператор поиска реализует все операции реляционной алгебры. Однако писать запросы на языке SQL (грамотные запросы) сначала совсем не просто. Один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не менее, могут существенно отличаться по времени исполнения, и это особенно важно для больших баз данных.
Синтаксис оператора SELECT имеет следующий вид:
SELECT[ALL|DISTINCT](|*) Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит, в результирующий набор могут попасть одинаковые строки. И это нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении). Ключевое слово DISTINCT означает, что в результирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор.
Символ * (звездочка) означает, что в результирующий набор включаются все поля из исходных таблиц запроса.
В разделе FROM задается перечень исходных отношений (таблиц) запроса.
В разделе WHERE задаются условия отбора строк результата или условия соединения записей исходных таблиц, подобно операции условного соединения в реляционной алгебре.
В разделе GROUP BY задается список полей группировки.
В разделе HAVING задаются предикаты – условия, накладываемые на каждую группу.
В части ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирующем отношении сначала будут собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп.
В выражении условий раздела WHERE могут быть использованы следующие предикаты:
Предикаты сравнения { =,, >,=,Close();
DBGrid1->DataSource=NULL;
DBN1->DataSource=NULL;
DBGrid1->DataSource=DM2->DS1;
DBN1 ->DataSource=DM2->DS1;
DM2->ADOQ1->Open();
Первый оператор закрывает запрос, если он был активен, а второй и третий отключают источник данных. Четвертый, пятый операторы подключают нужную таблицу, а шестой активизирует запрос. Для первого запроса покажем все поля таблицы «Тарифы», т.е. SELECT * FROM Тарифы. Результат выполнения запроса отражен на рис. 28.
Покажем, как выполнить запрос, записанный, в Memo. Для этого установим на форме компонент Memol и кнопку Button2, а в компонент DataModule добавим компоненты ADOQuery2 и DataSource2. Свойства Name обоих компонентов определим следующим образом: ADOQ2 и DS2. Запишем событие для кнопки Button2, которая будет выполнять любой запрос, записанный в Memol:
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();
Ha рис. 29 отражено выполнение запроса, в определении которого упоминается Страна "Украина". Строки соответствующие этому запросу, записанные в свойстве Lines компонента Memol, имеют вид:
SELECT Код_тарифа, Код_абонента, Страна FROM Абонплата WHERE Страна = 'Украина';
B DBGrid отражен результат запроса для таблицы «Абонплата».
Продемонстрируем возможность выполнения еще одного запроса. Запрос выполняет поиск записи по частично (начало) введенной в компонент Edit фамилии клиента. По мере заполнения фамилии в поле Edit, курсор будет перемещаться по базе данных к требуемой фамилии.
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 запрос имеет вид:
FROM Абонплата WHERE ((Код_абонента =12) OR (Код_абонента =14)) Событие для кнопки реализовано следующим образом:
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 запрос имеет вид:
FROM Тарифы WHERE Код_тарифа> Программная реализация события для выполнения данного запроса выглядит следующим образом:
void fastcall TForm1::Button4Click(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 Код_тарифа>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;
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.Код_тарифа Программная реализация этого запроса имеет вид:
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 Общий вид страницы «Запросы», с результатом запроса № Компонент ADODataSet является наиболее общим компонентом для работы с ADO, но и наиболее сложным в работе. Этот компонент обеспечивает доступ к одной или нескольким таблицам базы данных. Этот компонет удобен для работы непосредственно с таблицами базы так и для создания разного рода запросов типа SELECT. У компонента ADODataSet несколько основных свойств:
-ConnectionString обеспечивает соединение с базой данных (показывает путь соединения);
-Connection выполняет соединение с базой;
-CommandType обеспечивает получение типа доступа к данным (разъяснения приведем ниже);
-CommandText обеспечивает выбор таблицы, с которой необходимо работать;
-Active устанавливается в значение True для работы с данными.
Объясним правило использования свойства CommandType. Это свойство необходимо установить в значение cmdTable, либо в значение cmdTabledirect. B первом случае мы отправляем провайдеру SQL выражение типа:
а во втором показываем имя таблицы, с которой провайдер должен работать.
Однако не все провайдеры поддерживают прямую работу с таблицами и поэтому, чтобы не создавать дополнительных ошибок, рекомендуем работать со значением свойства cmdTable.
Работа с ADODataSet Иногда возникает необходимость просмотра в одном DBGrid’е той или иной таблицы из БД, а также для построения разного рода запросов, что и показано ниже на практических примерах. Приведем реализацию данной возможности на примере использования компонента ADODataSet (рис.35).
Рисунок 35 – Содержимое формы ADODataSet После установки значения свойства CommandType (см. табл. 7), из списка свойств CommandText можно выбрать либо нужную таблицу, либо запрос, если он был создан, например в MS Access. После установки свойства Active в True, таблица, либо запрос отобразится в визуальном компоненте, например, в DBGrid.
Установим в контейнере компонент ADODataSet, свойство Name которого сделаем равным ADODSl и DataSource, свойство Name изменим на DS3, свойство DataSet установим равным ADODSl. Установим на новой странице компоненты PageControl DBGrid, DBNavigator2 и переименуем его DBN2.
Таблица 7 Свойства компонентов Для обеспечения выбора таблицы или запроса из БД установим обьект ComboBox1, вывод данных происходит в DBGrid2, кнопка Получить список таблиц заносит в ComboBox1 названия всех обьектов БД.
// текст программного кода ля кнопки Получить список таблиц void fastcall TForm1::Button7Click(TObject *Sender) DM2->ADOConnection1->GetTableNames(ComboBox1->Items, false);
ComboBox1->ItemIndex=0;
DBN2->DataSource=DM2->DS3;
Вывод данных производится по событию – изменения ComboBox (Выбрать таблицу).
void fastcall TForm1::ComboBox1Change(TObject *Sender) { String s;
DM2->ADODS1->Close();
DM2->ADODS1->CommandText=ComboBox1->ItemsStrings[ComboBox1->ItemIndex];
DM2->ADODS1->Active=True;
s="Таблица: "+ ComboBox1->Text;
Label4->Caption=s;
Используя метод GetTableNames(Comboboxl,ltems,False), загружаем ComboBox наименованиями таблиц, а затем, выбрав нужную таблицу из Combobox, отображаем данные из выбранной таблицы в DBGrid. Напомним, что в качестве таблиц данных могут быть загружены и запросы, созданные в Access. Результаты работы приложения приведены, на рис. 36.
Рисунок 36 – Результаты работы приложения B предыдущих примерах, как отмечалось ранее, работая с таблицами, мы фактически выполняли запросы типа SELECT * FROM имя таблицы. Однако компонент ADODataSet позволяет создавать и более сложные запросы.
Для создания запросов можно воспользоваться редактором SQL. Для этого необходимо свойство CommandType компонента ADODataSet изменить на значение cmdText, а для свойства CommandText вызвать редактор, нажав справа на три точки выбора «...». Открывается диалоговое окно, в котором можно записать оператор SQL либо вручную, либо построить запрос автоматически. Внешний вид редактора SQL показан, на рис. 37.
Для автоматического построения запроса в левой панели редактора необходимо выбрать таблицу, а затем поля для просмотра, которые переносятся в правую часть редактора с помощью кнопок Add Table to SQL и Add Field to SQL. По завершению построения запроса выполняется кнопка ОК.
Построим связанные таблицы с помощью оператора SQL. Для этого установим на контейнере дополнительно по два компонента ADODataset и DataSource, свойства Name которых соответственно назначим: ADODS2, ADODS3, DS4, DS5. B окне формы на компоненте PageControl установим новую страницу и на ней разместим два DBGrid. Свойства всех компонентов отображены в табл. 8.
Таблица 8 Свойства компонентов «Запрос 1» и «Запрос 2» формируются с помощью свойств CommandText и имеют следующий вид:
- Запрос 1 SELECT Код_тарифа, Наименование_тарифа, Стоимость FROM Тарифы - Запрос 2 SELECT Код_тарифа, Начало_переговора, Конец_переговора, Страна FROM Абонплата WHERE Код_тарифа=Код_тарифа Запрос 2 фактически формирует параметрический запрос и с помощью свойства DataSource компонента ADODS3, обеспечивает соединение таблицы «Тарифы» с таблицей «Абонплата» через ключевое поле «Код_тарифа».
Результаты выполнения приложения отражены на рис. 38.
Добавим новую страницу приложения в компонент PageControl, на которой разместим два компонента DBGrid, компонент Edit и кнопку Button, выполняющую запрос на поиск нужного тарифа. B контейнер DataModule добавим по два компонента ADODataSet и DataSource. Все свойства соответствующих компонентов отражены в табл. 9.
Таблица 9 Свойства компонентов Запрос 1 и запрос 2 реализованы с помощью редактора SQL, т.е. с помощью свойства CommandText:
SELECT Код_тарифа, Наименование_тарифа, Стоимость FROM Тарифы WHERE Наименование_тарифа = NameTarif SELECT Код_тарифа, Начало_переговора, Конец_переговора, Длительность_в_минутах, Страна FROM Абонплата WHERE Код_тарифа=Код_тарифа Для первого запроса в качестве параметра выступает переменная NameTarif. По этой переменной будет осуществляться поиск, а во втором запросе Код_тарифа, значение для которого выбирается из первой таблицы, связь с этой таблицей осуществляется с помощью источника соединения, т.е.
через DataSource таблицы «Абонплата», показывающая эту связь с помощью значения DS6. Если для каждого компонента ADODataSet просмотреть свойство Parameters, то эти параметры мы и увидим в редакторе (см. рис. 39).
Запишем программную реализацию поиска для кнопки Button8:
void fastcall TForm1::Button8Click(TObject *Sender) DM2->ADODS4->Active = false;
DM2->ADODS5->Active = false;
DM2->ADODS4->Parameters->ParamByName ("NameTarif")->Value=Edit2->Text;
DM2->ADODS4->Active = true;
DM2->ADODS5->Active = true;
Если все было сделано правильно, то приложение при выполнении будет иметь вид, см. рис. 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. Расположение компонентов и внешний вид формы после изменения свойств Caption для компонентов Label и Button, представлен на рис. 41.
Рисунок 41 – Рабочее окно конструктора запросов с набором инструментов Установленные на форме компоненты образуют набор инструментов для составления SQL запроса. Кнопка Загрузить список доступных таблиц будет выполнять обращение к подключенной базе данных с целью получения списка имен, имеющихся таблиц и загрузки их в ComboBox2 и ComboBox4.
Компоненты ComboBox2 и ComboBox4 служат для выбора требуемой таблицы и заполнения наименованиями полей выбранной таблицы ComboBox3 или ComboBox5 соответственно. Содержимое выбранной таблицы будет отображаться в компонентах DBGrid, которые будут установлены далее под компонентом Memo3. Компонент ComboBox5 будет содержать набор операторов SQL, используемых при формировании запроса, а в компоненте Memo3 будет формироваться строка SQL запроса.
Выполним программную реализацию для установленных компонентов.
Программный код для кнопки Загрузить список доступных таблиц выглядит следующим образом:
void fastcall TForm1::Button10Click(TObject *Sender) {//Получение списка таблиц и загрузка их в ComboBox DM2->ADOConnection1->GetTableNames(ComboBox2Items,false);
ComboBox2->ItemIndex=0;
//Получение списка таблиц и загрузка их в ComboBox DM2->ADOConnection1->GetTableNames(ComboBox4Items,false);
ComboBox4->ItemIndex=0;
Программная реализация реакции ComboBox2 и ComboBox4 на выбор таблицы будет иметь следующий вид:
void fastcall TForm1::ComboBox2Change(TObject *Sender) //Отображение значений выбранной таблицы DM2->ADODS6->Close();
DM2->ADODS6->CommandType=cmdTable;
DM2->ADODS6->CommandText=ComboBox2->ItemsStrings[ComboBox2->ItemIndex];
DM2->ADODS6->Active=true;
//Загрузка полей выбранной таблицы в ComboBox ComboBox3->Items->Clear();
DM2->ADOConnection1->GetFieldNames(ComboBox2Text,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->ItemsStrings[ComboBox4->ItemIndex];
DM2->ADODS7->Active=true;
//Загрузка полей выбранной таблицы в ComboBox ComboBox5->Items->Clear();
DM2->ADOConnection1->GetFieldNames(ComboBox4Text,ComboBox5->Items);
ComboBox5->ItemIndex=0;
ComboBox5->Items->Insert(0,"*");
Создадим список SQL операторов, для этого, в окне Object Inspector компонента ComboBox5, в свойстве Items, нажмем справа от него кнопку с тремя точками, в результате будет открыто окно редактора списка. Заполним окно редактора требуемым набором SQL операторов, каждый оператор в отдельной строке. Окно редактора списка с набором SQL операторов представлен на рис. 42.
Рисунок 42 – Окно редактора выпадающего списка Разработаем собственную функцию, выполняющую запись оператора в конец строки компонента 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 будет иметь следующий вид:
voidfastcall TForm1::ComboBox2DblClick(TObject *Sender) { AddMemo3SQL(" "+ComboBox2->Text);} Аналогично следует организовать события для компонентов ComboBox – ComboBox5.
Дополним нашу форму двумя компонентами Button, которые будут служить для выполнения и очистки составленного запроса, тремя компонентами DBGrid, для отображения содержимого таблиц и результата выполненного запроса, и тремя Label, служащими в качестве подписей. После изменения свойств Caption для компонентов Button и Label форма будет иметь следующий вид (рис. 43):
Рисунок 43 – Окно формы конструктора запросов Установим для 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.
Рисунок 44 – Результат выполнения запроса, составленного с помощью На рис. 44 показано содержимое таблиц, для которых выполняется запрос, а ниже результат выполнения запроса. В данном примере выполняется просмотр сведений абонплаты. Поскольку в таблице Абонплата указывается только код абонента, то для получения ФИО абонента по данному коду используется связь с таблицей Абоненты через поле код_абонента.
Следует заметить, что предложенный конструктор запросов не имеет жесткой привязки к каким-либо таблицам или полям и поэтому формирование запроса в нем может быть выполнено для любой из имеющихся таблиц рабочей базы данных. Такой конструктор запросов может быть оформлен в виде отдельного приложения и представлять собой проводник баз данных.
Создание отчетов в C++ Вuilder средствами палитры При работе с базами данных, часто возникает необходимость представить информацию в печатном виде. Операция по созданию и форматированию документа для печати называется созданием отчета. B C++ Builder, для создания отчетов включена система QuickReport, компоненты которой размещены на странице QReport палитры компонентов. Данный набор компонентов позволяет проектировать отчеты на основе таблиц, запросов, списков, текстовых файлов, массивов, используя дизайн формы С++ Builder. Для отображения компонентов необходимо установить пакет QuickReport Components, представленный файлом dclqrtX0.bpl, где X номер версии C++ Builder. Чтобы установить пакет, необходимо выбрать команду Component > Install Packages, щелкнуть на кнопку Add и указать этот файл, который находится в папке BIN каталога размещения C++ Builder.
Отчеты QuickReport основаны на наборе горизонтальных полос. Полоса (band) это область отчета или раздела, которая содержит некоторый текст, изображение, графику, диаграммы и т.д. Если полоса и размещенные на ней компоненты связаны с базой данных, то содержимое этой полосы печатается столько раз, сколько имеется соответствующих записей в источнике данных.
Приведем краткую характеристику основных компонентов QReport в табл.10.
Таблица 10 Характеристики компонентов QReport Наименование компонента QuickRep Компонент, являющийся основой для построения отчета.
Он представляет ряд возможностей по управлению создаваемого отчета, включая форматирование заголовка, шрифтов, установок принтера и др. Компонент визуален и может использоваться как контейнер полос, составляющих отчет QRBand Полоса отчета. Устанавливается на QuickRep и является QRDBText Предназначен для отображения значения какого-либо поля QRSysData Системная информация – дата, время, номер страницы, QRMemo Набор строк для отображения в Memo QRDBRichText Компонент для отображения данных типа Memo QRShape Компонент для создания обрамлений QRImage Компонент для отображения информации в виде QRDBImage Компонент для отображения полей базы данных B виду того, что QuickRep основной компонент отчета, служащий контейнером для других компонентов, вносящих в отчет информацию или графику. Рассмотрим более детально его основные свойства.
Основные свойства компонента 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 первом, выполним создание простого отчета с выводом полей текстового типа данных, а во втором случае создадим отчет на результат выполненного запроса, с выводом полей графического типа данных, для чего дополним нашу таблицу «Тарифы» полем с изображением тарифа «Фото_тарифа». Предусмотрим в обоих вариантах вывод информации о времени и дате создания отчета, а также нумерацию страниц.
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.
Connection=ADOConnectionl TableName = 'Тарифы' 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.
Зададим следующие свойства этих компонент:
QRLabel2 -> Caption = ‘Код_тарифа' QRLabel3 -> Caption = ‘Наименование’ QRLabel4 -> Caption = 'Стоимость' QRLabel5 -> Caption = 'Информация о тарифе' 11. Ha полосу Detail добавим 3 компонента QRDBText и один QRDBRichText Установим для них следующие свойства:
DataField = ‘Код_тарифа' DataField = ‘Наименование_тарифа’ DataField = 'Стоимость' QRDBRichTextl:
DataField = 'Характер_тарифа' 12. Т.к. отчет может содержать более одной страницы, то организуем нумерацию страниц. Для этого в правом нижнем углу полосы PageFooter поместим компонент QRSysData и настроим его свойства:
Data = qrsPageNumber 13. После выполнения всех настроек страница «Макет отчета» будет иметь вид, представленный на рис. 45:
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:
16. Перейдем на страницу «Отчет» и поместим на нее два компонента Panel. Затем на Panel1 установим один компонент Label и два компонента Button, а на Panel2 установим компоненты Label, Memo и два компонента Button. Произведем настройку их свойств:
Labell -> Caption = 'Простой отчет' Buttonl -> Caption = 'Просмотр' Button2 -> Caption = 'Печать' Label2 -> Caption = 'Отчет по запросу' Label3 -> Caption = 'Строка запроса:' Button3 -> Caption = 'Просмотр' Button4 -> Caption = 'Печать' Memol -> Lines = SELECT * FROM Тарифы Внизу панелей установим компонент Button и изменим его свойство Caption:
Button5 -> Caption = 'Выход' Форма должна принять вид, представленный на рис. 47:
17. Создадим программный код для кнопки Button1 Просмотр, которая предназначена для открытия окна предварительного просмотра «Простого отчета»:
void_fastcall TForml::ButtonlClick(TObject *Sender) QuickRep1->Preview();
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) 20. Откроем окно формы и установим три компонента: QRTextFilter, QRHTMLFilter и QRCSVFilter. Установка данных компонентов добавляет возможность сохранять отчет в файл типа: QRTextFilter текстовый файл (*.TXT), QRHTMLFilter HTML документ (*.HTM) и QRCSVFilter файл, использующий в качестве разделителя полей отчета, символ указанный в свойстве Separator (*.CSV).
Примечание. Изначально, QuickRep в окне предварительного просмотра позволяет выполнить сохранение отчета только в оригинальном формате QRP QuickReport file (*.QRP).
21. Запускаем проект на выполнение и просмотрим содержимое закладок «Макет отчета» и «Макет отчета по запросу». Вид полученных отчетов представлен, на рис. 48 и рис. 49.
Рисунок 48 – Окно предварительного просмотра «Простой отчет»
Рисунок 49 – Окно предварительного просмотра «Отчет по запросу»
1. B таблице «Тарифы» базы данных db1.mdb, добавим поле данных типа «Поле объекта OLE».
2. Ha PageControl создадим еще один лист TabSheet4 -> Caption = 'Таблица тарифы' 3. Разместим на нем компоненты: DataSource, DBGrid, DBNavigator и DBImage. Установим их свойства в следующие значения:
DataSourcel:
DataSource = DataSourcel DBNavigatorl:
DataSource = DataSourcel DataSource = DataSourcel DataField = 'Фото_тарифа' 5. Запустим приложение и заполним поле «Фото_тарифа» фотографиями, для чего можно воспользоваться буфером обмена Clipboard. Открыть с помощью любой программы (например, «Paint») подходящий графический файл, выделить его содержимое и поместить в буфере обмена («горячие»
клавиши Ctrl+C). Далее перейти в работающее приложение, выделить компонент DBImagel и произвести вставку содержимого буфера обмена («горячие» клавиши Ctrl+V). B окно фотографии перенесется соответствующее изображение.
Результат работы представлен на рис. 50:
1. Агентство по недвижимости:
Клиент – ФИО, адрес, телефон, счет в банке.
Объект недвижимости – количество комнат, этаж, площадь (жилая, общая), этажность дома, район города, номинальная цена, продавец, дата поступления в агентство;
Регистрация сделок – учетный номер, вид сделки (купля, продажа, аренда), объект недвижимости, клиент, фактическая стоимость сделки, дата сделки.
Ученики – код ученика, ФИО, домашний адрес, дата рождения, должность отца и матери.
Учителя – ФИО, предмет, стаж, оклад.
Успеваемость – ученики, предмет, оценка, дата оценки, учитель.
3. Нотариальная контора:
Клиент – код дела, ФИО, адрес, номер паспорта.
Нотариус – ФИО, категория, оклад, дата рождения.
Регистрация дел – вид дела (оформление наследства, копия, завещание и др.), клиент, нотариус, стоимость услуги, даты начала и окончания.
Книги – регистрационный номер книги, автор, название, год издания, цена, количество страниц, тематика (искусство, проза, поэзия, математика и т.д.).
Читатели – ФИО, адрес, год рождения, образование, Выдача – даты выдачи и возврата, книга, читатель, библиотекарь.
5. Компьютерный центр коммерческой информации Коммерческая информация – название организации, адрес, директор, телефон, наименование производимых услуг, факс, время исполнения.
Потребитель информации – ФИО, название организации, адрес, дата передачи информации.
Оплата за услуги – номер по порядку, код счета, адрес выставления счета, коммерческая информация, потребитель информации, способ передачи информации, сумма оплаты, дата оплаты, исполнитель.
Товары – инвентарный номер, наименование, единица измерения, цена, изготовитель, количество, срок хранения, дата поступления.
Изготовители – наименование организации изготовителя, адрес, факс, телефон, директор.
Отпуск товаров – товар, изготовитель, количество, дата выдачи, организация потребителя, фамилия потребителя, адрес потребителя.
Водители – ФИО, категория, адрес, телефон, код радиовызова, дата рождения, стаж, оклад.
Машины – марка, название, год выпуска, цена, общий километраж пробега, марка бензина.
Маршруты – начальный пункт, конечный пункт, длина маршрута, количество остановок, машина, водитель.
8. АТС (отдел учета оплаты):
Абоненты – номер телефона, адрес, расчетный счет, дата установки телефона, сумма оплаты на счету, начисленная сумма к оплате.
Операторы – ФИО, должность, с какого года работает на АТС, оклад, год рождения.
Оплата – абонент, вид оплаты (абонентская, междугородние переговоры, будильник и др.), сумма оплаты, дата оплаты, оператор.
Абоненты – номер телефона, ФИО, адрес, расчетный счет, дата установки телефона, сумма на счету.
Мастера по ремонту – ФИО, должность, с какого года работает на АТС, оклад, год рождения.
Ремонт – дата заявки, дата ремонта, абонент, стоимость, причина неисправности, ФИО мастера по ремонту.
10. Подписной пункт:
Издания – наименование, тип (газета, журнал), стоимость за месяц, подписной индекс, интервал выпуска (2 раза в неделю, раз в месяц и т.д.), страна и город издания.
Подписчик – ФИО, почтовый индекс, адрес (город, улица, дом, квартира).
Учет подписки – номер квитанции, подписчик, издание, количество месяцев подписки, количество экземпляров, дата подписки, оператор, оформивший подписку.
11. Почтовое отделение:
Почтовое отправление – наименование (посылка, бандероль, денежный перевод и др.), вес (для посылок и бандеролей), объявленная ценность или сумма для денежных переводов, почтовый индекс, цена за пересылку единицы почтового отправления, способ пересылки (авиа, простое и др.), адрес отправителя.
Операторы – ФИО, должность, с какого года работает на почте, оклад, год рождения.
Учет почтовых операций – номер операции, почтовое отправление, оператор, дата отправления, код квитанции, стоимость пересылки.
12. МТС (Междугородняя телефонная станция):
Тарифы – страна, город, стоимость одной минуты, начало и конец льготного времени, процент скидки в льготное время.
Абоненты – номер телефона, ФИО, адрес, расчетный счет, сумма на счету.
Учет переговоров – дата переговоров, абонент, страна, город, время начала и конца переговоров, тариф, номер квитанции.
13. Приемная комиссия - Абитуриент:
Образование – абитуриент, оконченное учебное заведение, оценки по математике, физике, украинскому языку;
Результаты вступительных экзаменов – абитуриент, математика, физика, украинский язык, группа.
Абитуриент – регистрационный номер, ФИО, домашний адрес, дата рождения, льготы (наличие золотой медали или красного диплома, Чернобыль и т.п.).
14. Проектные работы:
Заказчики – ФИО, название организации, адрес, расчетный счет, телефон, факс, адрес электронной почты.
Разработчики – ФИО, должность, оклад, рабочий телефон, год рождения.
Учет проектных работ – наименование проектируемого объекта, заказник, дата приема заказа, заказанный и фактический срок окончания работ, разработчик, сметная стоимость.
15. Сбербанк:
Клиенты – ФИО, адрес, год раждения, телефон, ФИО наследника вклада, номер счета, сумма на счету.
Операторы – ФИО, должность, год рождения, оклад, дата поступлення на работу.
Регистрация операций – номер операции, вид операции (выдача или прием денег), денежная сумма, дата, клиент, оператор.
16. Расписание занятий в ВУЗе:
Предметы- наименование, семестр, специальность количество часов в неделю, количество часов в семестр.
Преподаватели – ФИО, должность, ученое звание и степень, кафедра.
Занятия – вид занятия (лекция, семинар и др.),день недели, номер пары, поток или группа, предмет, преподаватель.
17. Производство средств связи:
Продукция – наименование, марка, цена, стоимость перевозки.
Потребители – организация, адрес, расчетный счет, телефон, факс, ФИО представителя, сумма предоплаты, расстояние для перевозки.
Учет выпуска продукции – регистрационный номер, продукция, потребитель, дата выпуска, дата отправления потребителю, стоимость продажи, стоимость перевозки.
18. Дипломное проектирование:
Дипломники – ФИО, группа, специальность, место прохождения практики, место будущей работы.
Преподаватели – ФИО, должность, ученое звание и степень, кафедра.
Распределение дипломников дипломник, преподаватель, тема, дата выдачи задания, дата защиты, процент выполнения.
19. Преподаватели Вуза:
Преподаватели – ФИО, должность, ученое звание и степень, адрес, телефон, семейное положение, количество детей, табельный номер, оклад, дата поступления на работу.
Кафедры – название, заведующий, адрес, местоположение, телефон.
Расходы на зарплату преподаватель, кафедра, дата выдачи, оплачиваемый месяц, количество часов работы на полную ставку, ставка.
20. Фирма по реализации компьютерной техники:
Товар – наименование, марка, процессор, оперативная память, частота, память винчестера, производительность, дата выпуска.
Покупатель – ФИО, адрес, организация, адрес, расчетный счет, телефон.
Учет реализации – регистрационный номер, товар, покупатель, дата продажи, цена, количество, ФИО реализатора.
21. Автостоянка:
Автомобиль – название, марка, номер двигателя, год выпуска, дата техосмотра.
Владелец автомобиля – ФИО, адрес, расчетный счет, год рождения.
Учет оплаты – автомобиль, владелец, дата прибытия, дата убытия, цена стоянки.
22. Касса железнодорожных билетов:
Поезд – номер, пункт отправления, пункт прибытия, время прибытия и отправления, количество свободных мест.
Пассажир – ФИО, номер паспорта, год рождения, до какой станции едет.
Продажа билетов – регистрационный номер, пассажир, поезд, вид вагона (спальный, плацкарт и др.), номер вагона, место, дата, отправления поезда, дата продажи билета, стоимость.
23. Багажное отделение аэропорта:
Пассажир – ФИО, номер паспорта, год рождения, адрес.
Багаж – номер квитанции, вес, вид упаковки (чемодан, сумка и др.), стоимость перевозки.
Отправление багажа – регистрационный номер, багаж, пассажир, дата и время отправления, исполнитель отправки.
24. Рекламное агентство:
Заказчики – организация, адрес, номер счета, факс, ФИО представителя, телефон.
Работа по размещению рекламы – название рекламы, заказчик, код рисунка, надпись, размер, исполнитель, дата заказа, дата выполнения.
Исполнители – ФИО, должность, дата поступления на работу, оклад, образование.
25. Магазин «Диски и кассеты»
Диски – номер диска, название, категория (музыка, фильм, игра, программа), цена закупки, цена продажи, количество дисков.
Кассеты – номер кассеты, название, цена закупки, цена продажи, количество кассет.
Поставки – регистрационный номер товара, дата поставки дисков и кассет, количество.
Продажи – регистрационный номер товара, дата продажи дисков и кассет, количество.
26 Отдел заказов универмага:
Клиенты – ФИО, адрес, телефон, расчетный счет, сумма на счету.
Товары – тип товара (обувь, напитки и др.), наименование, стоимость, дата выпуска, изготовитель, единица измерения.
Заказы – регистрационный номер, клиент, товар, количество, цена продажи, дата заказа, процент надбавки за обслуживание, стоимость доставки за единицу расстояния, длина маршрута доставки заказа, дата выполнения заказа.
27. Оптовый рынок:
Товары – наименование, стоимость, дата выпуска, изготовитель, единица измерения, цена поставщика.
Поставщики – организация, адрес, телефон, факс, расчетный счет, ФИО представителя.
Реализация товаров – учетный номер, товар, дата продажи, рыночная цена, количество, продавец, поставщик.
28. Множительный центр печатной продукции:
Материалы – наименование, единицы измерения, цена за единицу материала.
Заказчики – ФИО, организация, адрес, телефон, факс, расчетный счет, ФИО представителя.
Выполнение заказов – регистрационный номер, дата заказа, заказчик, исполнитель, дата выполнения заказа.
29. Морские грузоперевозки:
Грузополучатель – организация, ФИО ответственного, адрес, телефон, факс, расчетный счет.
Груз – наименование, вид упаковки (бочки, ящики и др.), количество в одной упаковке, производитель, дата изготовления, срок хранения.
Учет перевозки груза – регистрационный номер, груз, грузополучатель, дата отправления, стоимость перевозки одной упаковки, количество упаковок, дата получения груза.
30. Охранное агентство Сотрудники – ФИО, должность, дата поступления на работу, оклад, образование.
Заказчики – организация, адрес, номер счета, факс, ФИО представителя, телефон, вид услуг Вид предоставляемой услуги – наименование услуги (охрана объекта, установка сигнализации и др.), стоимость вида услуги, ФИО заказчика, дата заказа, дата выполнения заказа.
31. Торговый дом Товар – наименование, марка, производитель, цена, дата выпуска.
Покупатель – ФИО, адрес, организация, адрес, расчетный счет, телефон.
Учет реализации – регистрационный номер, товар, покупатель, дата продажи, цена, количество, номер накладной, ФИО реализатора.
32. Супермаркет Товар – наименование, производитель, цена, дата выпуска.
Продавец – ФИО, идентификационный номер, адрес, организация, расчетный счет, телефон.
Учет продаж – регистрационный номер, товар, покупатель, дата продажи, цена, количество, номер накладной, ФИО продавца.
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.
Вступление
Указания по оформлению
Курсовое задание
Указания по выполнению
Варианты индивидуальных заданий
Список литературы
Компьютерное редактирование и макетирование – Кирдогло Т.В.