Министерство образования и науки Республики Казахстан
Карагандинский государственный технический университет
Кафедра САПР
ПОЯСНИТЕЛЬНАЯ
ЗАПИСКА
к курсовой работе
по дисциплине "Технология разработки баз данных"
Тема: "Создание базы данных "РЭО-ГАИ"
Руководители:
(подпись) (дата)
(подпись) (дата)
Студенты
(группа)
_____________________
(подпись) (дата)
Караганда 2009
Содержание
2.2 Структура хранимой информации
3.2 Описание запросов выполняемых в программе
Введение
В настоящее время все большее значение получает автоматизация процессов, связанных с бытовыми услугами для удобства и уменьшения затрат на обслуживание. Вследствие этого появляется необходимость в разработке универсальных систем, позволяющих довольно легко обрабатывать информацию, а также генерировать необходимые отчеты.
Целью выполнения данного курсового проекта является разработка системы "РЭО-ГАИ" и соответствующей ей базы данных, позволяющей документировать в электронном виде автоматизацию учета движений автомобилей и предоставлять необходимые отчеты.
В качестве среды разработки базы данных была выбрана СУБД MSSQL Server 2000. Эта СУБД была выбрана в качестве инструмента потому, что она способна работать на серверной основе, и имеет большие функциональные возможности. В качестве языка программирования был выбран язык Borland Delphi. Данная среда позволяет легко работать с базой данных, созданной в MSSQL Server 2000, редактировать и дополнять ее.
Язык SQL (Structured Query Language) в настоящее время стал фактически стандартным языком доступа к реляционным базам данных. Целью стандартизации является переносимость приложений между различными СУБД.
Реализация в SQL концепции операции, ориентированных на табличное представление данных, позволило создать компактный язык с небольшим (менее 30) набором предложений. SQL может использоваться как интерактивный (для выполнения запросов) и как встроенный (для построения прикладных программ). В нем существует:
предложение определения данных (определение баз данных, а также определение и уничтожение таблиц и индексов);
предложение на выбор данных;
предложение управления данными (предоставление и отмена привилегии на доступ данным и др.);
предложение на модификацию данных (добавление, удаление, изменение данных).
Кроме того, предоставляет возможность выполнять в этих предложениях:
арифметические вычисления, обработку текстовых строк;
упорядочивание строк, столбцов при выводе содержимого таблиц;
запоминание выводимого по запросу содержимого таблицы;
создание представлений (виртуальных таблиц);
агрегирование данных: группирование данных и применение к этим группам таких операций, как среднее, сумма, максимум, минимум, число элементов.
К инструментальным средствам, позволяющим обеспечить простое и эффективное использование MSSQL Server можно отнести:
Enterprise Manager;
Service Manager;
Query Analyzer.
База данных SQL Server - это контейнер объектов, предназначенных для хранения, записи и извлечения данных в безопасном режиме - содержит следующие компоненты:
Таблицы;
Хранимые процедуры;
Индексы;
Представления.
1. Постановка задачи
Задачей данного курсового проекта является разработка системы "РЭО - ГАИ", включающую в себя 9 таблиц:
Автомобили (№ автомобиля, код района учета, код марки автомобиля, код типа кузова, № двигателя, № шасси, код цвета, РНН владельца, дата выпуска);
Владельцы (РНН владельца, признак владельца, адрес владельца, ФИО/наименование, телефон, адрес стоянки авто, пол, год рождения, № удостоверения личности, дата выдачи, профессия);
Движение (№ авто, код операции, код района учета, РНН владельца, дата операции);
Категория цвета (код категории цвета, наименование категории);
Марка автомобиля (код марки авто, наименование);
Операции (код операции, наименование операции);
Районы учета (код учета района, наименование района);
Тип кузова (код типа кузова, наименование);
Цвета (код цвета, код категории цвета, наименование).
При работе с системой работник ГАИ должен иметь возможность решать следующие задачи:
Регистрировать новые автомобили в системе.
Относить автомобили к районам учета.
Проводить каталогизацию автомобилей.
Вести учет количества автомобилей, принадлежащих владельцам.
Вести учет движений автомобилей, при этом предполагается три вида операций: постановка на учет, снятие с учета, перерегистрация.
Вести поиск автомобилей по неполному номеру двигателя.
Вычислять "возраст" каждого из автомобилей, состоящих на учете на текущую дату.
Вести поиск автомобилей по категориям цветов, поставленных на учет в текущем году.
Администрация управления дорожной полиции должно иметь возможность получать сведения
О владельцах автомобилей, которые были сняты с учета одного района и не поставлены на учет другого района.
О перерегистрации автомобилей на других владельцев.
О движении транспортных средств на некоторую дату.
2. Структура базы данных
2.1 Структура таблиц
Информационная система предназначена для автоматизации учета движений автомобилей в "РЭО_ГАИ". Система должна предусматривать режимы ведения системного каталога, отражающего список районов учета движений автомобилей, марок, типов кузова, категорий цвета, а также цветов автомобилей. В движении аавтомобиля может происходить три операции - постановка на учет, снятие с учета, перерегистрация. В системном каталоге операция имеет код и полное наименование, каждый автомобиль характеризуется следующими параметрами: марка автомобиля, тип кузова, категория цвета, квет; эти параметры имеют уникальные коды.
Также каждый автомобиль характеризауется следующими параметрами:
№ автомобиля;
код района учета,
код марки,
код типа кузова,
№ двигателя,
№ шасси,
№ кузова,
дата выпуска,
код цвета,
РНН владельца.
В "РЭО_ГАИ" ведется учет владельцев автомобилей. Владелец может быть юридическим и физическим лицом. Если владелец - юридическое лицо, то он характеризуется следующими параметрами:
РНН
ФИО/наименование владельца
адрес
телефон
адрес стоянки автомобиля
На владельца - физическое лицо заносятся следующие данные:
РНН
пол
год рождения
№ удостоверения личности
дата выдачи
профессия
Предусмотреть следующие ограничения на информацию в системе:
У каждого владельца может быть одновременно несколько автомобилей, тогда как у одного автомобиля не может быть больше одного владельца.
На учете каждого района может стоять множество автомобилей, но каждый автомобиль может состоять на учете только одного района.
Каждый автомобиль, снятый с одного района учета, должен встать на учет другого района.
2.2 Структура хранимой информации
Вся информация, поступающая от пользователя, записывается в основные таблицы базы данных ("Владельцы", "Автомобили", "Движение", "Категории цвета", Марки автомобиля", "Операции", "Районы учета", "Типы кузова" и "Цвета"). Для обеспечения целостности данных между таблицами существуют строгие связи. Поле "РНН владельца" таблицы "Владельцы" связано отношением один ко многим с соответствующими полями таблиц "Движение" и "Автомобили".
Поле "№ автомобиля" таблицы "Автомобили" связано отношением один ко многим с соответствующим полем таблицы "Движение".
Поле "Код учета района" таблицы "Районы учета" связано отношением один ко многим с соответствующими полями таблиц "Движение" и "Автомобили".
Поле "Код операции" таблицы "Операции" связано отношением один ко многим с соответствующим полем таблицы "Движение".
Поле "Код марки авто" таблицы "Марки автомобиля" связано отношением один ко многим с соответствующим полем таблицы "Автомобили". Поле "Код типа кузова" таблицы "Типы кузова" связано отношением один ко многим с соответствующим полем таблицы "Автомобили". Поле "Код категории цвета" таблицы "Категория цветов" связано отношением один ко многим с соответствующим полем таблицы "Цвета". Поле "Код цвета" таблицы "Цвета" связано отношением один ко многим с соответствующим полем таблицы "Автомобили". Более наглядно связь между таблицами изображена на рис.2.2.1
Рис.2.2.1 - Диаграмма связей таблиц в базе данных
2.3 Нормализация отношений
Нормализация - это пошаговый обратимый процесс композиций и декомпозиций исходных отношений, обладающих лучшими свойствами при включении, изменении, удалении данных, назначении им ключей по определенным правилам и выявлении всех функциональных зависимостей.
Первая нормальная форма
Таблица находится в 1NF тогда и только тогда, когда ни одна из ее строк не содержит в любом своем поле более одного значения и ни одно из ее ключевых полей не пусто. Таблица находится в 1-ой форме
Вторая нормальная форма
Рассмотрим схему отношения:
Владельцы (РНН владельца, Признак владельца, ФИО/Наименование, Адрес владельца, Телефон, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Дата выдачи, Профессия)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости
РНН владельца - ФИО
РНН владельца - Адрес владельца
РНН владельца - Адрес стоянки авто
РНН владельца - Пол
РНН владельца - Год рождения
РНН владельца - № уд. личности
РНН владельца - Дата выдачи
РНН владельца - Профессия
№ уд. личности - Дата выдачи
Признак владельца - Наименование
Видно, что, хотя первичным ключом является составной атрибут РНН владельца, Признак владельца, атрибут ФИО/Наименование зависит от части первичного ключа. В результат при Признаке владельца - юридическое лицо, мы не сможем вставить кортеж, с Полом, Годом рождения и Профессией владельца. Можно произвести следующую декомпозицию отношения Владельцы на два отношения: Владельцы - юр_лица и Владельцы-физ_лица.
Владельцы-юр_лица (РНН владельца, Признак владельца, Наименование, Адрес владельца, Адрес стоянки авто, Телефон)
Первичный ключ
РНН владельца, Признак владельца
Функциональные зависимости:
РНН владельца, Признак владельца - Наименование
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Телефон
РНН владельца, Признак владельца - Адрес стоянки авто
Владельцы-физ_лица (РНН владельца, Признак владельца, ФИО, Адрес владельца, Телефон, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Дата выдачи, Профессия)
РНН владельца, Признак владельца - ФИО
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Телефон
РНН владельца, Признак владельца - Адрес стоянки авто
РНН владельца, Признак владельца - Пол
РНН владельца, Признак владельца - Год рождения
РНН владельца, Признак владельца - № уд. личности
РНН владельца, Признак владельца - Дата выдачи
РНН владельца, Признак владельца - Профессия
№ уд. личности - Дата выдачи
Каждое из этих двух отношений находятся в 2 NF
Третья нормальная форма
Рассмотрим отношение Владельцы-физ_лица. Функциональная зависимость РНН владельца - Дата выдачи является транзитивной; она является следствием функциональных зависимостей РНН владельца - № уд. личности и № уд. личности - Дата выдачи. То есть, дата выдачи является характеристикой удостоверения личности владельца.
Можно декомпозировать отношение Владельцы-физ_лица в два отношения Владельцы-физ_лица-уд. личности и Удостоверения личности:
Владельцы-физ_лица-уд. личности (РНН владельца, Признак владельца, ФИО, Адрес владельца, Телефон, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Профессия)
Первичный ключ:
Возможные функциональные зависимости:
РНН владельца, Признак владельца - ФИО
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Телефон
РНН владельца, Признак владельца - Адрес стоянки авто
РНН владельца, Признак владельца - Пол
РНН владельца, Признак владельца - Год рождения
РНН владельца, Признак владельца - № уд. личности
РНН владельца, Признак владельца - Профессия
Удостоверения личности (№ удостоверения личности, Дата выдачи)
Первичный ключ:
№ уд. личности
Возможные функциональные зависимости:
№ уд. личности - Дата выдачи
Каждое из этих двух отношений находится в 3NF.
Нормальная форма Бойса-Кодда
Рассмотрим схему отношения Владельцы-физ_лица-уд. личности (РНН владельца, Признак владельца, ФИО, Адрес владельца, Телефон, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Профессия)
Здесь личность владельца может полностью определятся как именем, так и его РНН.
Можно произвести декомпозицию отношения в два отношения: Владельцы-физ_лица-имена и
Владельцы-физ_лица-имена (РНН владельца, ФИО)
Первичный ключ: РНН владельца
Функциональные зависимости:
РНН владельца - ФИО
Владельцы-физ_лица-атрибуты (РНН владельца, Признак владельца, Адрес владельца, Телефон, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Профессия)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Телефон
РНН владельца, Признак владельца - Адрес стоянки авто
РНН владельца, Признак владельца - Пол
РНН владельца, Признак владельца - Год рождения
РНН владельца, Признак владельца - № уд. личности
РНН владельца, Признак владельца - Профессия
Четвертая нормальная форма
Видим, что каждому владельцу соответствует множество, состоящее из нуля или более значений атрибута телефон (А→В), также как и соответствует множество, состоящее из нуля или более значений атрибута адрес стоянки авто (А→С). Но телефон владельца авто не зависит от адреса стоянки авто.
Многозначные зависимости:
РНН владельца →→ Телефон
РНН владельца →→ Адрес стоянки авто
Можно произвести декомпозицию отношения:
Владельцы-физ_лица-телефоны (РНН владельца, Признак владельца, Адрес владельца, Телефон, Пол, Год рождения, № уд. личности, Профессия
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Телефон
РНН владельца, Признак владельца - Пол
РНН владельца, Признак владельца - Год рождения
РНН владельца, Признак владельца - № уд. личности
РНН владельца, Признак владельца - Профессия
Владельцы-физ_лица-адреса стоянок (РНН владельца, Признак владельца, Адрес владельца, Адрес стоянки авто, Пол, Год рождения, № уд. личности, Профессия)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Адрес владельца
РНН владельца, Признак владельца - Адрес стоянки авто
РНН владельца, Признак владельца - Пол
РНН владельца, Признак владельца - Год рождения
РНН владельца, Признак владельца - № уд. личности
РНН владельца, Признак владельца - Профессия
Отношения находятся в 4NF
Пятая нормальная форма
Таблица находится в пятой нормальной форме 5NF, тогда и только тогда, когда в каждой ее полной декомпозиции все проекции содержат возможный ключ.
Декомпозиция отношений6
Владельцы-юр_лица_наименования (РНН владельца, Признак владельца, Наименование)
Первичный ключ
РНН владельца, Признак владельца
Функциональные зависимости:
РНН владельца, Признак владельца - Наименование
Владельцы-юр_лица_адреса владельцев (РНН владельца, Признак владельца, Адрес владельца)
Первичный ключ
РНН владельца, Признак владельца
Функциональные зависимости:
РНН владельца, Признак владельца - Адрес владельца
Владельцы-юр_лица_адреса стоянок авто (РНН владельца, Признак владельца, Адрес стоянки авто, Телефон)
Первичный ключ
РНН владельца, Признак владельца
Функциональные зависимости:
РНН владельца, Признак владельца - Адрес стоянки авто
Владельцы-юр_лица_телефоны (РНН владельца, Признак владельца, Телефон)
Первичный ключ
РНН владельца, Признак владельца
Функциональные зависимости:
РНН владельца, Признак владельца - Телефон
Владельцы-физ_лица-имена (РНН владельца, ФИО)
Первичный ключ: РНН владельца
Функциональные зависимости:
РНН владельца - ФИО
Владельцы-физ_лица_адреса владельцев (РНН владельца, Признак владельца, Адрес владельца)
Первичный ключ: РНН владельца, Признак владельца
РНН владельца, Признак владельца - Адрес владельца
Владельцы-физ_лица-телефоны (РНН владельца, Признак владельца, Телефон, рождения)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Телефон
Владельцы-физ_лица-адреса стоянок (РНН владельца, Признак владельца, Адрес стоянки авто)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Адрес стоянки авто
Владельцы-физ_лица-пол (РНН владельца, Признак владельца, Пол)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Пол
Владельцы-физ_лица-год рождения (РНН владельца, Признак владельца, Год рождения)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - Год рождения
Владельцы-физ_лица-уд. личности (РНН владельца, Признак владельца, № уд. личности)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - № уд. личности
Владельцы-физ_лица-профессии (РНН владельца, Признак владельца, Профессия)
Первичный ключ: РНН владельца, Признак владельца
Возможные функциональные зависимости:
РНН владельца, Признак владельца - профессия
3. Структура программы
Программа "РЭО-ГАИ" реализована на языке программирования Borland Delphi с подключением MSSQL Server 2000. Структуру программы составляют 4 класса и 6 программных модулей.
3.1 Описание модулей
Модули данной программы подразделяются на:
1. Модуль Unit1, который находится в файле Unit1. pas содержит информацию о всех таблицах данной базы данных.
2. В модуле Unit2, находящемся в файле Unit2. pas происходит реализация класса TZaprosy (запросы).
3. Модуль Unit3 расположен в файле Unit3. pas, в котором находится реализация класса TOtchety (отчеты).
4. Модуль Unit4 расположен в файле Unit4. pas, в нем находится код описания класса TProcedury (процедуры).
5. Модуль Unit5, который расположен в файле Unit5. pas содержит реализацию класса TSpravka (справка).
6. Модуль Unit6 находится в файле Unit6. pas и содержит информацию об отчетах.
3.2 Описание запросов выполняемых в программе
Запрос 1. Количество автотранспортных средств, принадлежащих каждому из владельцев.
SELECT [РНН владельца], COUNT ([№автомобиля])
FROM Автомобили
GROUP BY [РНН владельца]
ORDER BY [РНН владельца] ;
Запрос 2. Найти автомобиль по неполному номеру двигателя <…>
SELECT [№автомобиля], [№двигателя]
FROM Автомобили
WHERE [№двигателя] LIKE '%111%';
Запрос 3. Вычислить "возраст" каждого из автомобилей, стоящих на учете на текущую дату.
SELECT Движение. [№автомобиля], 'Возраст =', datediff (yy, Автомобили. [Дата выпуска],getdate ())
FROM Движение, Автомобили, Операции
WHERE Автомобили. [№автомобиля] =Движение. [№автомобиля]
and Операции. [Код операции] =Движение. [Код операции]
and Операции. [Наименование] like '%постан%'
and [Дата операции] < getdate ();
Запрос 4. Какие операции проводились с автомобилями по <i-му> району учета в текущем месяце.
SELECT Движение. [№автомобиля], Районы_учета. [Наименование района учета], Операции. [Наименование операции]
FROM Операции, Районы_учета, Движение
WHERE Районы_учета. [Код района учета] =Движение. [Код района учета]
AND Операции. [Код операции] =Движение. [Код операции]
AND Районы_учета. [Наименование района учета] ='Казыбек-бийский'
AND month ([Дата операции]) =month (getdate ());
Запрос 5. Автомобили, каких категорий цветов поставлены на учет в текущем году.
SELECT Движение. [№автомобиля], Категории_цвета. [Наименование категории цвета]
FROM Категории_цвета, Цвета, Автомобили, Операции, Движение
WHERE Категории_цвета. [Код категории цвета] =Цвета. [Код категории цвета]
AND Цвета. [Код цвета] =Автомобили. [Код цвета]
AND Автомобили. [№автомобиля] =Движение. [№автомобиля]
AND Операции. [Наименование операции] = 'Постановка на учет'
AND year (Движение. [Дата операции]) =year (getdate ());
Отчет 1. Карточка учета автотранспортного средства
SELECT Движение. [№автомобиля],
Движение. [РНН владельца],
Операции. [Наименование операции],
Районы_учета. [Наименование района учета],
Движение. [Дата операции]
FROM Движение, Операции, Районы_учета
WHERE Районы_учета. [Код района учета] = Движение. [Код района учета]
AND Операции. [Код операции] = Движение. [Код операции] ;
Отчет 2. Отчет о движении транспортных средств на "I-ю" дату
SELECT Движение. [Дата операции],
Движение. [№автомобиля],
Движение. [РНН владельца],
Районы_учета. [Наименование района учета],
Операции. [Наименование операции]
FROM Движение, Районы_учета, Операции
WHERE Районы_учета. [Код района учета] = Движение. [Код района учета]
AND Операции. [Код операции] = Движение. [Код операции]
AND year (Движение. [Дата операции]) =year ('13 October 2007')
and month (Движение. [Дата операции]) =month ('13 October 2007')
and day (Движение. [Дата операции]) =day ('13 October 2007');
Отчет 3. Список автомобилей, владельцами которых являются физические лица
SELECT Движение. [№автомобиля],
Категории_цвета. [Наименование категории цвета]
FROM Категории_цвета, Цвета, Автомобили, Операции, Движение
WHERE Категории_цвета. [Код категории цвета] =Цвета. [Код категории цвета]
AND Цвета. [Код цвета] =Автомобили. [Код цвета]
AND Автомобили. [№автомобиля] =Движение. [№автомобиля]
AND Операции. [Наименование операции] = 'Постановка на учет'
AND year (Движение. [Дата операции]) =year (getdate ());
Описание процедур выполняемых в программе
Процедура 1. Необходимо выбрать автомобили, возраст которых не превышает 10 лет.
USE РЭО_ГАИ
GO
CREATE PROCEDURE Vyboravto1
AS
SELECT *
FROM Автомобили
WHERE year ([Дата выпуска]) > year ('01 January 1997')
GO
execute Vyboravto1
go
Процедура 2. Необходимо выбрать автомобили определенной марки и с определенным типом кузова.
USE РЭО_ГАИ
GO
CREATE PROCEDURE Vyboravto2 @marka_id int, @kuzov_id int
AS
SELECT *
FROM Автомобили
WHERE [Код марки авто] = @marka_id
and [Код типа кузова] = @kuzov_id
GO
USE РЭО_ГАИ
GO
EXECUTE Vyboravto2 2, 2
GO
Заключение
В первом разделе данного курсового проекта была описана постановка задачи с нововведениями и дополнениями со стороны разработчика.
Во втором и третьем разделах была описана структура разработанной базы данных и структура хранимой в ней информации. Также были подробно описаны связи между таблицами.
В четвертом разделе была описана структура программы, её классы и модули.
В пятом разделе было представлено подробное руководство по использованию программы.
Приложение
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids, ComCtrls;
type
TForm1 = class (TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N15: TMenuItem;
N16: TMenuItem;
ADOTable1: TADOTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
StatusBar1: TStatusBar;
N17: TMenuItem;
procedure N15Click (Sender: TObject);
procedure N3Click (Sender: TObject);
procedure N4Click (Sender: TObject);
procedure N5Click (Sender: TObject);
procedure N16Click (Sender: TObject);
procedure N6Click (Sender: TObject);
procedure N7Click (Sender: TObject);
procedure N8Click (Sender: TObject);
procedure N9Click (Sender: TObject);
procedure N10Click (Sender: TObject);
procedure N11Click (Sender: TObject);
procedure N12Click (Sender: TObject);
procedure N13Click (Sender: TObject);
procedure N14Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3, Unit4, Unit5;
{$R *. dfm}
procedure TForm1. N15Click (Sender: TObject);
begin
Spravka. Show; // close;
end;
procedure TForm1. N3Click (Sender: TObject);
begin
Zaprosy. Show;
end;
procedure TForm1. N4Click (Sender: TObject);
begin
Otchety. Show;
end;
procedure TForm1. N5Click (Sender: TObject);
begin
Procedury. Show;
end;
procedure TForm1. N16Click (Sender: TObject);
begin
close;
end;
procedure TForm1. N6Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Районы_учета';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n6. Caption;
end;
procedure TForm1. N7Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Операции';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n7. Caption;
end;
procedure TForm1. N8Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Марки_автомобиля';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n8. Caption;
end;
procedure TForm1. N9Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Типы_кузова';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n9. Caption;
end;
procedure TForm1. N10Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Категории_цвета';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n10. Caption;
end;
procedure TForm1. N11Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Цвета';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n11. Caption;
end;
procedure TForm1. N12Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Автомобили';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n12. Caption;
end;
procedure TForm1. N13Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Движение';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n13. Caption;
end;
procedure TForm1. N14Click (Sender: TObject);
begin
ADOTable1. Active: =false;
ADOTable1. TableName: ='Владельцы';
ADOTable1. Active: =true;
StatusBar1. SimpleText: =n14. Caption;
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, Mask, Buttons;
type
TZaprosy = class (TForm)
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
MaskEdit1: TMaskEdit;
ComboBox1: TComboBox;
Label6: TLabel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
SpeedButton4: TSpeedButton;
SpeedButton5: TSpeedButton;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
procedure SpeedButton1Click (Sender: TObject);
procedure SpeedButton2Click (Sender: TObject);
procedure SpeedButton3Click (Sender: TObject);
procedure SpeedButton4Click (Sender: TObject);
procedure SpeedButton5Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Zaprosy: TZaprosy;
implementation
{$R *. dfm}
procedure TZaprosy. SpeedButton1Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: =' SELECT Автомобили. [РНН владельца], COUNT (Автомобили. [№автомобиля]) '+
' FROM Автомобили '+
// ' WHERE Владельцы. [РНН владельца] = Автомобили. [РНН владельца] ';
' GROUP BY Автомобили. [РНН владельца] ' +
' ORDER BY Автомобили. [РНН владельца] ; ';
adodataset1. Active: =true;
end;
procedure TZaprosy. SpeedButton2Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: =' SELECT [№автомобиля], [№двигателя] '+
' FROM Автомобили '+
' WHERE [№двигателя] LIKE '+''''+'%'+MaskEdit1. Text+'%'+'''';
adodataset1. Active: =true;
end;
procedure TZaprosy. SpeedButton3Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: =' SELECT Движение. [№автомобиля], datediff (yy, Автомобили. [Дата выпуска],getdate ()) '+
' FROM Движение, Автомобили, Операции '+
' WHERE Автомобили. [№автомобиля] =Движение. [№автомобиля] '+
' and Операции. [Код операции] =Движение. [Код операции] '+
' and Операции. [Наименование операции] like ''%постан%'''+
' and [Дата операции] < getdate (); ';
adodataset1. Active: =true;
end;
procedure TZaprosy. SpeedButton4Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: =' SELECT Движение. [№автомобиля], Районы_учета. [Наименование района учета], Операции. [Наименование операции] '+
' FROM Операции, Районы_учета, Движение '+
' WHERE Районы_учета. [Код района учета] =Движение. [Код района учета] '+
' AND Операции. [Код операции] =Движение. [Код операции] '+
' AND Районы_учета. [Наименование района учета] like '+''''+'%'+combobox1. Text+'%'+'''' +
' AND month ([Дата операции]) =month (getdate ()); ';
adodataset1. Active: =true;
end;
procedure TZaprosy. SpeedButton5Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: =' SELECT Движение. [№автомобиля], Категории_цвета. [Наименование категории цвета] '+
' FROM Категории_цвета, Цвета, Автомобили, Операции, Движение '+
' WHERE Категории_цвета. [Код категории цвета] =Цвета. [Код категории цвета] '+
' AND Цвета. [Код цвета] =Автомобили. [Код цвета] '+
' AND Автомобили. [№автомобиля] =Движение. [№автомобиля] '+
' AND Операции. [Наименование операции] = ''Постановка на учет'''+
' AND year (Движение. [Дата операции]) =year (getdate ()); ';
adodataset1. Active: =true;
end;
end.
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, DBGrids, DB, ADODB, Mask, Menus,
Word2000, OleServer;
type
TOtchety = class (TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ADODataSet2: TADODataSet;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Label4: TLabel;
ComboBox1: TComboBox;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
Label5: TLabel;
Label6: TLabel;
ComboBox2: TComboBox;
Label7: TLabel;
N2: TMenuItem;
WordDocument1: TWordDocument;
WordApplication1: TWordApplication;
SaveDialog1: TSaveDialog;
procedure N1Click (Sender: TObject);
procedure SpeedButton1Click (Sender: TObject);
procedure SpeedButton2Click (Sender: TObject);
procedure SpeedButton3Click (Sender: TObject);
procedure N2Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Otchety: TOtchety;
otchetnum: integer;
implementation
uses Unit6;
{$R *. dfm}
procedure TOtchety. N1Click (Sender: TObject);
var
c,n: integer;
s,rs: string;
begin
form6. Show;
// leep (10);
for n: =0 to adodataset2. RecordCount-1 do
begin
rs: ='';
s: ='';
if n=0 then
begin
for c: =0 to DBGrid1. Columns. Count-1 do
begin
s: =DBGrid1. Columns [c]. FieldName+ '';
rs: =rs+s;
end;
form6. Memo1. Lines. Add (rs);
rs: ='';
s: ='';
end;
for c: =0 to DBGrid1. Columns. Count-1 do
begin
s: =DBGrid1. Columns [c]. Field. AsString+'';
rs: =rs+s;
end;
form6. memo1. Lines. Add (rs);
adodataset2. Next;
end;
begin
if form6. savedialog1. Execute then
form6. memo1. Lines. SaveToFile (form6. savedialog1. FileName);
end;
end;
procedure TOtchety. SpeedButton1Click (Sender: TObject);
begin
adodataset2. Active: =false;
adodataset2.commandText: =' SELECT Движение. [№автомобиля], Движение. [РНН владельца],'+
'Операции. [Наименование операции], Районы_учета. [Наименование района учета],'+
'Движение. [Дата операции] '+
' FROM Движение, Операции,Районы_учета '+
' WHERE Движение. [№автомобиля] like '+''''+'%'+combobox1. Text+'%'+'''' +
' AND Районы_учета. [Код района учета] = Движение. [Код района учета] '+
' AND Операции. [Код операции] = Движение. [Код операции] ; ';
adodataset2. Active: =true;
end;
procedure TOtchety. SpeedButton2Click (Sender: TObject);
begin
adodataset2. Active: =false;
adodataset2.commandText: =' SELECT [№автомобиля], Автомобили. [РНН владельца], Владельцы. [ФИО/наименование] '+
' FROM Автомобили, Владельцы '+
' WHERE Владельцы. [Рнн владельца] = Автомобили. [РНН владельца] '+
' AND [Признак владельца] = ''ф'' '+
' order by Владельцы. [ФИО/наименование] ';
adodataset2. Active: =true;
end;
procedure TOtchety. SpeedButton3Click (Sender: TObject);
begin
// QuotedStr (Maskedit2. Text);
adodataset2. Active: =false;
adodataset2.commandText: =' SELECT Движение. [Дата операции], Движение. [№автомобиля], Движение. [РНН владельца],'+
'Районы_учета. [Наименование района учета], Операции. [Наименование операции] '+
' FROM Движение, Районы_учета, Операции '+
' WHERE Районы_учета. [Код района учета] = Движение. [Код района учета] '+
' AND Операции. [Код операции] = Движение. [Код операции] '+
' and Движение. [Дата операции] ='''+ComboBox2. Text +'''';
// ' AND year (Движение. [Дата операции]) =year (''13 October 2007'') '+
// ' and month (Движение. [Дата операции]) =month (''13 October 2007'') '+
// ' and day (Движение. [Дата операции]) =day (''13 October 2007''); ';
// ' and SHTRAFI. Oplacheno = ''Оплачено '' AND dbo. SHTRAFI. Data BETWEEN '''+ MaskEdit3. Text +''' AND '''+ MaskEdit4. Text +''' '+
// ' AND Aaeea? aoee. "aaoa iiaa? e"='''+ComboBox2. Text +''''+
adodataset2. Active: =true;
end;
procedure TOtchety. N2Click (Sender: TObject);
var filename,ran1: Olevariant;
rowcount,colcount, i,j: integer;
temp: string;
begin
savedialog1. FileName: ='otchet'+inttostr (otchetnum) +'. doc'; // имя файла
otchetnum: =otchetnum+1; // формирование след отчета
wordapplication1. Connect; // соединение
filename: =savedialog1. FileName;
wordapplication1. Documents. Add (emptyparam,emptyparam,emptyparam,emptyparam); // создание нового файла
worddocument1. connectto (wordapplication1. activedocument); // обратится к новому файлу
// ran1: =worddocument1. Range;
rowcount: =adodataset2. RecordCount; // сколько строк нужно создать в файле
colcount: =dbgrid1. Columns. Count; // сколько столбцов нужно создать в файле
worddocument1. Tables. Add (worddocument1. Range,rowcount,colcount,emptyparam,emptyparam); // соз-е строк и столбцов
for i: =1 to rowcount do
begin
for j: =1 to colcount do
begin
temp: =dbgrid1. Fields [j-1]. AsString; // содержание ячейки в таблице
worddocument1. Tables. Item (1). cell (i,j). range. text: =temp; // занести в doc
end;
adodataset2. Next; // следующая строка
end;
WordApplication1. Visible: = True; // сделать документ видимым
worddocument1. SaveAs (filename); // сохранить документ
end;
end.
procedure TForm3. BitBtn1Click (Sender: TObject);
begin
QuotedStr (maskedit1. Text);
QuotedStr (maskedit2. Text);
adodataset2. Active: =false;
adodataset2.commandText: =' SELECT dbo. UDOSTOVERENIYA. N_udostovereniya, dbo. UDOSTOVERENIYA. Data_vipiski, dbo. UDOSTOVERENIYA. Srok_deistviya, dbo. INSPEKTOR. FIO '+
' FROM dbo. UDOSTOVERENIYA INNER JOIN '+
' dbo. INSPEKTOR ON dbo. UDOSTOVERENIYA. Kod_inspectora = dbo. INSPEKTOR. Kod_inspektora '+
' WHERE (dbo. INSPEKTOR. FIO LIKE '+'''%'+Edit3. Text+'%'+''' AND dbo. UDOSTOVERENIYA. Data_vipiski BETWEEN '''+ MaskEdit1. Text + ''' AND '''+ MaskEdit2. Text +''') ';
adodataset2. Active: =true;
end.
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, Buttons;
type
TProcedury = class (TForm)
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Label1: TLabel;
Label2: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
ComboBox1: TComboBox;
Label8: TLabel;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
ComboBox4: TComboBox;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Label10: TLabel;
Label11: TLabel;
procedure ComboBox1KeyPress (Sender: TObject; var Key: Char);
procedure ComboBox3KeyPress (Sender: TObject; var Key: Char);
procedure ComboBox2KeyPress (Sender: TObject; var Key: Char);
procedure ComboBox3Change (Sender: TObject);
procedure ComboBox4Change (Sender: TObject);
procedure SpeedButton1Click (Sender: TObject);
procedure SpeedButton2Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Procedury: TProcedury;
implementation
{$R *. dfm}
procedure TProcedury.comboBox1KeyPress (Sender: TObject; var Key: Char);
begin
if not (key in ['0'. '9',#8]) then key: =#0;
end;
procedure TProcedury.comboBox3KeyPress (Sender: TObject; var Key: Char);
begin
if not (key in ['0'. '9',#8]) then key: =#0;
end;
procedure TProcedury.comboBox2KeyPress (Sender: TObject; var Key: Char);
begin
if not (key in ['0'. '9',#8]) then key: =#0;
end;
procedure TProcedury.comboBox3Change (Sender: TObject);
var
i: integer;
begin
for i: =0 to ComboBox3. Items. Count do
if ComboBox3. ItemIndex=i then ComboBox1. ItemIndex: =i;
end;
procedure TProcedury.comboBox4Change (Sender: TObject);
var
i: integer;
begin
for i: =0 to ComboBox4. Items. Count do
if ComboBox4. ItemIndex=i then ComboBox2. ItemIndex: =i;
end;
procedure TProcedury. SpeedButton1Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: ='execute Vyboravto1';
adodataset1. Active: =true;
end;
procedure TProcedury. SpeedButton2Click (Sender: TObject);
begin
adodataset1. Active: =false;
adodataset1.commandText: ='execute Vyboravto2 '''+ combobox1. Text + ''',''' + combobox2. Text +''' ';
adodataset1. Active: =true;
end;
end.
unit Unit5;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids, StdCtrls, Buttons;
type
TSpravka = class (TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ADODataSet1: TADODataSet;
Label5: TLabel;
Label8: TLabel;
Label3: TLabel;
ComboBox4: TComboBox;
Label11: TLabel;
Label12: TLabel;
ComboBox5: TComboBox;
Label14: TLabel;
Label15: TLabel;
ComboBox6: TComboBox;
BitBtn1: TBitBtn;
procedure BitBtn1Click (Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;
var
Spravka: TSpravka;
sum1, sum2, sum3: boolean;
implementation
{$R *. dfm}
procedure TSpravka. BitBtn1Click (Sender: TObject);
begin
sum1: =false;
sum2: =false;
sum3: =false;
if ComboBox4. Text<>'' then sum1: =true;
if ComboBox5. Text<>'' then sum2: =true;
if ComboBox6. Text<>'' then sum3: =true;
if (sum1) and (sum2) and (sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Марки_автомобиля, Цвета, Типы_кузова' +
' WHERE Автомобили. [Код типа кузова] =Типы_кузова. [Код типа кузова] ' +
' AND Автомобили. [Код марки авто] =Марки_автомобиля. [Код марки авто] ' +
' AND Автомобили. [Код цвета] =Цвета. [Код цвета] '+
' AND Типы_кузова. [Наименование] ='''+ComboBox4. Text +''''+
' AND Марки_автомобиля. [Наименование] ='''+ComboBox5. Text +''''+
' AND Цвета. [Наименование] ='''+ComboBox6. Text +'''';
adodataset1. Active: =true;
end;
if (not sum1) and (not sum2) and (not sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECT* '+
' FROMАвтомобили';
adodataset1. Active: =true;
end;
if (not sum1) and (not sum2) and (sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Цвета' +
' WHERE Автомобили. [Код цвета] =Цвета. [Код цвета] '+
' AND Цвета. [Наименование] ='''+ComboBox6. Text +'''';
adodataset1. Active: =true;
end;
if (not sum1) and (sum2) and (not sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Марки_автомобиля' +
' WHERE Автомобили. [Код марки авто] =Марки_автомобиля. [Код марки авто] ' +
' AND Марки_автомобиля. [Наименование] ='''+ComboBox5. Text +'''';
adodataset1. Active: =true;
end;
if (sum1) and (not sum2) and (not sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Типы_кузова' +
' WHERE Автомобили. [Код типа кузова] =Типы_кузова. [Код типа кузова] ' +
' AND Типы_кузова. [Наименование] ='''+ComboBox4. Text +'''';
adodataset1. Active: =true;
end;
if (not sum1) and (sum2) and (sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Марки_автомобиля, Цвета' +
' WHERE Автомобили. [Код марки авто] =Марки_автомобиля. [Код марки авто] ' +
' AND Автомобили. [Код цвета] =Цвета. [Код цвета] '+
' AND Марки_автомобиля. [Наименование] ='''+ComboBox5. Text +''''+
' AND Цвета. [Наименование] ='''+ComboBox6. Text +'''';
adodataset1. Active: =true;
end;
if (sum1) and (not sum2) and (sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Марки_автомобиля, Цвета, Типы_кузова' +
' WHERE Автомобили. [Код типа кузова] =Типы_кузова. [Код типа кузова] ' +
' AND Автомобили. [Код цвета] =Цвета. [Код цвета] '+
' AND Типы_кузова. [Наименование] ='''+ComboBox4. Text +''''+
' AND Цвета. [Наименование] ='''+ComboBox6. Text +'''';
adodataset1. Active: =true;
end;
if (sum1) and (sum2) and (not sum3) then
begin
adodataset1. Active: =false;
adodataset1.commandText: ='SELECTАвтомобили. * ' +
' FROMАвтомобили, Марки_автомобиля, Типы_кузова' +
' WHERE Автомобили. [Код типа кузова] =Типы_кузова. [Код типа кузова] ' +
' AND Автомобили. [Код марки авто] =Марки_автомобиля. [Код марки авто] ' +
' AND Типы_кузова. [Наименование] ='''+ComboBox4. Text +''''+
' AND Марки_автомобиля. [Наименование] ='''+ComboBox5. Text +'''';
adodataset1. Active: =true;
end;
end;
end.
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm6 = class (TForm)
Memo1: TMemo;
SaveDialog1: TSaveDialog;
Button1: TButton;
procedure Button1Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form6: TForm6;
implementation
{$R *. dfm}
procedure TForm6. Button1Click (Sender: TObject);
begin
memo1. Lines. Text: ='';
form6. Hide;
end; end.