Курсовая работа по предмету "Программирование, компьютеры и кибернетика, ИТ технологии"


Создание базы данных "РЭО-ГАИ"


2

Министерство образования и науки Республики Казахстан

Карагандинский государственный технический университет

Кафедра САПР

ПОЯСНИТЕЛЬНАЯ

ЗАПИСКА

к курсовой работе

по дисциплине "Технология разработки баз данных"

Тема: "Создание базы данных "РЭО-ГАИ"

Руководители:

(подпись) (дата)

(подпись) (дата)

Студенты

(группа)

_____________________

(подпись) (дата)

Караганда 2009

Содержание

  • Введение
    • 1. Постановка задачи
    • 2. Структура базы данных
    • 2.1 Структура таблиц
    • 2.2 Структура хранимой информации
    • 2.3 Нормализация отношений
    • 3. Структура программы
    • 3.1 Описание модулей
    • 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.



Не сдавайте скачаную работу преподавателю!
Данную курсовую работу Вы можете использовать для написания своего курсового проекта.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем курсовую работу самостоятельно:
! Как писать курсовую работу Практические советы по написанию семестровых и курсовых работ.
! Схема написания курсовой Из каких частей состоит курсовик. С чего начать и как правильно закончить работу.
! Формулировка проблемы Описываем цель курсовой, что анализируем, разрабатываем, какого результата хотим добиться.
! План курсовой работы Нумерованным списком описывается порядок и структура будующей работы.
! Введение курсовой работы Что пишется в введении, какой объем вводной части?
! Задачи курсовой работы Правильно начинать любую работу с постановки задач, описания того что необходимо сделать.
! Источники информации Какими источниками следует пользоваться. Почему не стоит доверять бесплатно скачанным работа.
! Заключение курсовой работы Подведение итогов проведенных мероприятий, достигнута ли цель, решена ли проблема.
! Оригинальность текстов Каким образом можно повысить оригинальность текстов чтобы пройти проверку антиплагиатом.
! Оформление курсовика Требования и методические рекомендации по оформлению работы по ГОСТ.

Читайте также:
Разновидности курсовых Какие курсовые бывают в чем их особенности и принципиальные отличия.
Отличие курсового проекта от работы Чем принципиально отличается по структуре и подходу разработка курсового проекта.
Типичные недостатки На что чаще всего обращают внимание преподаватели и какие ошибки допускают студенты.
Защита курсовой работы Как подготовиться к защите курсовой работы и как ее провести.
Доклад на защиту Как подготовить доклад чтобы он был не скучным, интересным и информативным для преподавателя.
Оценка курсовой работы Каким образом преподаватели оценивают качества подготовленного курсовика.

Сейчас смотрят :

Курсовая работа Пути повышения эффективности системы закупок материально-технических ресурсов ОАО "Мясокомбинат"
Курсовая работа Понятие и признаки преступления
Курсовая работа Анализ хозяйственной деятельности ОАО "Ростелеком"
Курсовая работа Разработка системы управления запасами в логистике закупок строительной организации
Курсовая работа Внешнеэкономическая деятельность предприятия
Курсовая работа Управление качеством продукции на предприятии
Курсовая работа Анализ производительности труда и резервы ее повышения
Курсовая работа Пути снижения издержек производства
Курсовая работа Учёт реализации товаров и анализ товарооборота торговой организации
Курсовая работа Оборотные средства организации и эффективность их использования
Курсовая работа Институт опеки и попечительства
Курсовая работа Учет и анализ движения денежных средств
Курсовая работа Юридическая ответственность
Курсовая работа Исследование рынка кофе Nescafe Classic
Курсовая работа Аудит расчетов с покупателями и заказчиками