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

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,43 Мб
  • Опубликовано:
    2017-03-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Содержание

Введение

1. Аналитическая часть

1.1 Описание структуры и функционирования предприятия

1.2 Разработка программного продукта

1.3 UML-диаграммы предприятия

1.3.1 Работа офиса

1.3.2 Работа автопарка

1.3.3 Работа склада

1.4 Модель "сущность-связь" БД предприятия

2. Декомпозиция БД предприятия на локальные базы данных

2.1 Модель "сущность-связь" главной БД

2.2 Модель "сущность-связь" БД автопарка

2.3 Модель "сущность-связь" БД склада

3. Реляционная модель БД

3.1 Реляционная модель главной БД

3.2 Реляционная модель БД автопарка

3.3 Реляционная модель БД склада

4. Описание работы программы

4.1 Вход в программу

4.2 Модуль "Автопарк"

4.3 Модуль "Офис"

4.4 Модуль "Склад"

4.5 Модуль администрирования

4.6 Тестирование программы

4.7 Руководство администратора

Глава 5. Организационно-экономическая часть

5.1 Экономическое обоснование разработки программы

5.2 Расчет трудоемкости и цены разработки

5.3 Определение цены программной продукции

Выводы по главе

6. Информационная безопасность проекта

6.1 Основные понятия и определения оценки объекта

6.2 Профиль защиты

6.3 Описание объекта оценки

6.4 Среда безопасности ОО

6.5 Цели безопасности

6.6 Требования безопасности

6.7 Обоснования

Заключение

Список литературы

Приложение А

Введение


Автоматизация однообразного рутинного труда в сферах обслуживания, производства и услуг является популярной современной практикой: ручное составление отчетов, заполнение заявок, расчет сводок и т.д. является трудоемкой задачей и отнимает излишне много времени специалиста.

Целью данной разработки является автоматизация функционирования автопарка и временного склада товаров, учета заявок клиентов, заполнения путевых листов. Разработан программный продукт "ИС Автотранспорт", включающие все основные функции и алгоритмы, необходимые при составлении данной задачи. При разработке были учтены возможности аналогичных продуктов "СИОД-ИНФАВТО", "АРМ персонала автотранспортного предприятия".

Система разработана на языке Object Pascal с применением интегрированной среды разработки (IDE) Delphi 7 Enterprise, СУБД Firebird 2.0.4, и открытых компонентов IBUpdateSQLW, Ehlib 3.4 Данные средства просты в освоении и позволяют эффективно разрабатывать любые приложения, в частности, палитра компонент (VCL) Delphi 7 предоставляет готовые средства для решения почти всех задач, с которыми можно столкнуться при реализации автоматизированного рабочего места строителя. Проект "ИС Автотранспорт" разработан по технологии "клиент-сервер", это сетевая архитектура, в которой существует 2 типа узлов - запрашивающие узлы (клиенты) и отвечающие узлы (сервера). Отличительной особенностью такого механизма является централизованная обработка и хранение данных на сервере, тогда как клиенты реализуют лишь интерфейс взаимодействия с пользователем, при помощи пользователь получает доступ к данным сервера, и выполняют несложные операции.

Распределенные системы, основанные на архитектуре "клиент-сервер", поддаются гибкой модификации, обновлению и легко расширяются, являясь в то же время более экономически оправданным решением. Из минусов технологии можно назвать остановку работы всей сети по выходу из строя сервера.

"ИС Автотранспорт" объединяет в себе необходимый функционал для автоматизации автопарка и дружественный интерфейс взаимодействия с пользователем. Простота эксплуатации позволяет успешно использовать программу специалистам, не имеющим навыков работы с компьютером.

Постановка задачи

Разработать модель распределенной реляционной базы данных автотранспортного предприятия, состоящего из главного производства и нескольких удаленных филиалов. Части предприятия связаны компьютерной сетью (TCP/IP), имеют собственные локальные базы данных, могут использовать данные удаленных узлов. Глобальная информация хранится на центральном узле.

Система должна обладать следующими возможностями:

)        Учет автомобилей (автопарк):

.1)     Добавление, изменение учетной информации об автомобилях, удаление автомобиля из БД;

1.2)   Добавление, изменение учетной информации о водителях, удаление водителя из БД;

.3)     Приписка водителей к автомобилю (водительская смена).

2)      Учет заявок (офис):

.1)     Составление, изменение, удаление заявки;

2.2)   Составление, изменение, удаление детализации к заявке;

.3)     Заполнение путеводного листа: добавление, удаление, изменение пунктов маршрута перевозки с возможностью запоминания времени прохождения каждого пункта;

.4)     Фильтрация заявок по составному критерию;

.5)     Учет клиентов, производящих заявки.

3)      Учет временно хранящихся товаров для перевозки (склад):

.1)     Прием, списание, изменение, удаление товара;

3.2)   Фильтрация товаров по составному критерию;

.3)     Учет владельцев товара.

1. Аналитическая часть


1.1 Описание структуры и функционирования предприятия


Предприятие состоит из отделений: офис, склад, автопарк, при этом отделений может быть несколько. Соответственно, для функционирования системы было спроектировано 3 базы данных: автопарка, склада и главная БД, содержащая глобальную информацию и расположенная на удаленном сервере. Авторизация в системе происходит при запуске программы, база данных учетных записей пользователей хранится в главной БД, поэтому для авторизации необходимо подключение к главной БД. После успешной авторизации пользователю будет предложен выбор доступных в соответствии с его правами модулей. Если пользователю доступен только один модуль, сразу произойдет его загрузка. Перед загрузкой модуля произойдет соединение с необходимой для работы БД, если оно еще не установлено. Если БД недоступна, пользователь получит сообщение об ошибке. Модуль администрирования доступен для администратора системы и реализует работу с учетными записями пользователей.

Отделение автопарка осуществляет работу с парком автомашин: учет автомашин, мониторинг выполнения заявки для каждой автомашины, учет водителей, управление припиской водителей к автомашинам. Заявка может выполняться одной или несколькими автомашинами. В последнем случае совокупность всех автомобилей, перевозящих грузы согласно одной заявке, представляет собой автоколонну, которая в модуле мониторинга считается за одну автомашину: автоколонне соответствует одна дата прохождения пункта маршрута.

Отделение офиса осуществляет прием заявок от клиентов, учет клиентов, мониторинг процесса перевозки груза. При добавлении новой заявки в БД запоминается пользователь, добавивший заявку, а также дата добавления. При закрытии заявки запоминается пользователь, закрывший заявку, а также дата закрытия.

При прохождении пункта маршрута водитель по радио или телефону сообщает в офис время прохождения, которое запоминается в главной БД. Отделение склада осуществляет работу со складом грузов для перевозки: учет товаров, учет владельцев товаров. При добавлении товара запоминается дата добавления, при списании товара - дата списания.

1.2 Разработка программного продукта


Система разработана на языке Object Pascal с применением интегрированной среды разработки (IDE) Delphi 7 Enterprise, СУБД Firebird 2.0.4 и открытых компонент EhLib и IBUpdateSQLW.

Программный продукт функционирует в соответствии со схемой "клиент-сервер", это сетевая архитектура, в которой существует 2 типа узлов: запрашивающие узлы (клиенты) и отвечающие узлы (сервера). Отличительной особенностью такого механизма является централизованная обработка и хранение данных на сервере, тогда как клиенты реализуют лишь интерфейс взаимодействия с пользователем, при помощи которого последний получает доступ к данным сервера, и выполняют несложные операции.

В качестве системы управления базами данных была выбрана СУБД Firebird версии 2.0.4. Предпочтение было отдано именно этой СУБД по следующим причинам:

)        Firebird - ветвь, отделившаяся от Interbase после появления в 2000 году исходных кодов Interbase 6.0 под лицензией IBPL. Поэтому Firebird унаследовала весь функционал, что был реализован Inprise Corp (в последствии Borland) за более чем 20 лет разработки и полностью отвечает требованиям, предъявляемым к современным СУБД;

база автопарк программный продукт

2)      Будучи основанной на бесплатном коде, Firebird является полностью бесплатной и открытой СУБД, оставаясь при этом завершенным и регулярно обновляющимся программным продуктом с оперативной технической поддержкой;

3)      Firebird является одной из наиболее простых и удобных СУБД в плане развертывания и администрирования;

)        Firebird обладает довольно низкими системными требованиями (сервер может функционировать даже на i386, 32Mb ОЗУ), минимальными размерами дистрибутива (~2Mb) и достаточно высокой производительностью, в том числе на больших объемах данных;

)        Многоверсионная архитектура Firebird позволяет читающим пользователям не мешать пишущим, что при большом числе запросов существенно экономит машинное время;

)        Сервер Firebird доступен в 3 вариантах: Classic, Super, Embedded, благодаря чему эта СУБД подходит под практически любую задачу, связанную с хранением данных. Classic Server и Super Server имеют клиент-серверную архитектуру.

Отличие Classic Server от Super Server заключается в том, что Classic создает процесс для каждого пользовательского соединения, а SuperServer - один процесс, который обрабатывает запросы клиентов в разных потоках этого же процесса. Архитектура Classic надежнее, но требует больше памяти, так как кэш данных и метаданных у каждого процесса (пользователя) свой. SuperServer - производительнее, имеет общий кэш данных и метаданных, но не распараллеливает запросы разных пользователей на многопроцессорных машинах. Для перезапуска процесса SuperServer вместе с ним запускается процесс Guardian, отслеживающий состояние процесса сервера.

Сервер реализованной системы основан на Firebird Super Server, что также позволяет ей естественным образом функционировать в распределенной среде. В данном случае на компьютере-сервере хранится база данных пользователей и заявок под управлением серверной части СУБД Firebird (Super Server), которая осуществляет обработку запросов от клиентов. Хранение заявок на сервере осуществляется ввиду необходимости закрытия или оформления заявки из любого территориально удаленного офиса.Embedded Server начал выпускаться с версии 1.5, этот сервер представляет собой Firebird Super server, скомпилированный в виде библиотек DLL. Embedded идеален для однопользовательских приложений - в этом случае не требуется совершенно никаких настроек, и достаточно разместить библиотеки рядом с исполняемым файлом.

Таким образом, приложение получается автономным и не требует смены версии сервера, то есть, может работать параллельно с любой установленной серверной или embedded версией. Однако embedded имеет ряд ограничений.

Поскольку это библиотека, загружаемая приложением, то сам исполняемый файл вместе с библиотекой представляет собой процесс сервера.

Таким образом, нельзя запустить два приложения, обращающихся к одной и той же базе данных - база данных может быть испорчена. По этой причине Embedded блокирует файл для монопольного доступа.

Кроме того, Embedded обладает функциональностью обычной клиентской библиотеки (gds32. dll) - если соединение сетевое, то есть, с указанием имени сервера (srv: c: \dir\data. fdb), то библиотека выполняет функции обычной клиентской библиотеки. Если соединение локальное (c: \dir\data. gdb), то библиотека выполняет функции сервера. Для случая соединения вида "localhost: c: \dir\data. gdb" используется следующий алгоритм - производится попытка коннекта к процессу сервера, и если его на данной машине нет, то происходит соединение через Embedded.

Сервер Firebird EmbeddedServer версии 2.0.4 используется для управления локальными БД на рабочих местах, а также играет роль клиентской библиотеки при доступе к удаленной серверной БД пользователей и заявок. Кроме того, при помощи EmbeddedServer возможно эмулировать работу всей системы на одной машине.

Программный продукт получает доступ к СУБД посредством библиотеки прямого доступа IBX (Interbase Express), входящей в состав VCL Delphi. Применение библиотеки прямого доступа, которая использует интерфейс Interbase API (реализованный клиентской библиотекой gds32. dll), упрощает цепочку доступа к базе данных, в данном случае она состоит из двух звеньев: приложение-клиент (приложение + gds32. dll) и сервер управления БД.

В отличие от других средств доступа к БД, использующих промежуточные звенья между клиентом и сервером (BDE, ODBC, ADO, dbExpress), прямой доступ отличается повышенной производительностью и полной поддержкой всех особенностей данной СУБД.

Сетевой доступ к серверу осуществляется посредством протокола TCP/IP по сетевому имени сервера или его IP-адресу.

Также возможно и локальное подключение к серверу при доступе к локальной базе данных, либо в том случае, если программный продукт выполняется на той же машине, что и сервер.

В первой ситуации Firebird EmbeddedServer можно не задействовать: его функции выполнит SuperServer.

Функционал IBX был расширен дополнительным открытым компонентом TIBUpdateSQLW, наследованным от TIBUpdateSQL. Компонент TIBUpdateSQL предназначен для выполнения SQL-запросов на Insert, Update, Refresh и Delete и подключается к TIBQuery, который и вызывает непосредственно соответствующие методы. В данном для такой связки приходится использовать пишущую транзакцию (с параметрами read_committed, rec_version, nowait). Но с учетом архитектурных особенностей Interbase\Firebird это нежелательно: схема взаимодействия транзакций в этих СУБД такова, что заинтересованная транзакция, которой и является пишущая транзакция в неподтвержденном состоянии (non-committed), удерживает версии записей для всех данных, которые были прочитаны или изменены в контексте данной транзакции. Эти записи могут устареть ("мусорные" записи), но удержание не позволяет сборщику мусора (sweeper) их удалить, что при большой продолжительности транзакции влечет накопление мусора в базе данных. Как следствие, со временем падает производительность при обращении к данным.

Более того, в случае скопления слишком большого количества мусорных записей, сборщику мусора может не хватить времени для их удаления даже в периодах простоя СУБД,

что в будущем может привести к непредсказуемым последствиям и вылиться в нестабильность работы СУБД. По этой же причине крайне не рекомендуется использовать для доступа к БД Interbase/Firebird библиотеки BDE, где возможна только одна транзакция на соединение. Компонент IBUpdateSQLW имеет дополнительное свойство UpdateTransaction и позволяет использовать отдельную транзакцию для запросов, изменяющих данные.

Это дает возможность производить чтение данных (в частности, держать открытыми продолжительные запросы, только читающие данные), через "читающую" транзакцию с параметрами read, read_committed, rec_version, которая стартует на сервере сразу же в состоянии commited. Изменения же данных можно производить кратковременными запросами через пишущую транзакцию.

Таким образом, так как commited - транзакция не является заинтересованной и не удерживает версии записей, содержание ее в открытом состоянии в течение любого промежутка времени не приведет ни к каким отрицательным последствиям для базы данных. В реализованном программном продукте все длительные запросы, такие, как чтение данных из таблиц заявок и товаров, построены на данном механизме.

Для разработки баз данных была применена утилита администрирования для СУБД Interbase/Firebird/Yaffil HK-Software IBExpert - наиболее мощный и функциональный программный пакет из существующих. IBExpert включает средства визуального проектирования БД, автоматизированного составления сложных SQL-запросов, поддерживает подсветку синтаксиса DDL, имеет функции управления пользователями и ролями и обладает множеством других возможностей для эффективной разработки и администрирования баз данных Firebird. IBExpert полностью бесплатен для жителей России и СНГ.

1.3 UML-диаграммы предприятия


1.3.1 Работа офиса



1.3.2 Работа автопарка



1.3.3 Работа склада



1.4 Модель "сущность-связь" БД предприятия



2. Декомпозиция БД предприятия на локальные базы данных


В результате декомпозиции БД было получено 3 базы данных: главная БД, БД автопарка и БД склада грузов.

2.1 Модель "сущность-связь" главной БД



2.2 Модель "сущность-связь" БД автопарка



2.3 Модель "сущность-связь" БД склада



3. Реляционная модель БД


3.1 Реляционная модель главной БД



Генераторы:

GENERATOR GEN_CLIENT_ID;GENERATOR GEN_GOODS_ID;GENERATOR GEN_REQUEST_ID;GENERATOR GEN_REQUEST_TYPE_ID;GENERATOR GEN_ROUTE_ID;GENERATOR GEN_USERS_ID;

Таблицы:

Таблица клиентовTABLE CLIENT (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,DETAIL VARCHAR (300) CHARACTER SET WIN1251 COLLATE WIN1251);

Таблица детализацииTABLE GOODS (INTEGER NOT NULL,INTEGER,_NUM VARCHAR (50),VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,CNT INTEGER,VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251,WEIGHT DOUBLE PRECISION);

Таблица заявокTABLE REQUEST (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,COMPLETED INTEGER,INTEGER,_TYPE INTEGER,_ADD INTEGER,_CLOSE INTEGER,_ADD TIMESTAMP,_COMPLETED TIMESTAMP);

Таблица типов заявокTABLE REQUEST_TYPE (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251);

Таблица пользователейTABLE USERS (

UID INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,LOGIN VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251,PASS VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251,RULES VARCHAR (20) CHARACTER SET WIN1251 COLLATE WIN1251);

Таблица пунктов маршрутаTABLE ROUTE (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,DATE_PASS TIMESTAMP,INTEGER,INTEGER);

Триггеры:

TRIGGER REQUEST_BI0_DATE_ADD FOR REQUESTBEFORE INSERT POSITION 0. date_add = current_timestamp;(new.completed = 1) then begin. date_completed = current_timestamp;

end

Триггер заполняет поля date_add (дата составления заявки) и date_completed (дата закрытия заявки) вновь создаваемой записи текущей датой на сервере (константа current_timestamp).

CREATE TRIGGER REQUEST_BU0_DATE_COMPLETED FOR REQUESTBEFORE UPDATE POSITION 0(new.completed <> old. с) then begin. date_completed = current_timestamp;

end

Триггер заполняет поле date_completed текущей датой на сервере, если после обновления записи значение поля completed (заявка закрыта) изменилось.

Create trigger users_bi for usersBEFORE INSERT POSITION 0begin(new. uid is null) then. uid = gen_id (gen_users_id,1);

end

Триггер подставляет значение первичного ключа uid таблицы пользователей Users как текущее значение генератора gen_users, если оно не было задано при вставке записи.

Хранимые процедуры:

PROCEDURE USERS_INSERT (VARCHAR (50),VARCHAR (20),VARCHAR (100),VARCHAR (50))(INTEGER)= gen_id (gen_users_id,1);into users

(LOGIN, NAME, PASS, RULES, UID)

(: LOGIN,: NAME,: PASS,: RULES,: UID);

suspend;^

Процедура осуществляет вставку записи в таблицу пользователей и возвращает значение первичного ключа (uID) вставленной записи.

CREATE PROCEDURE USERS_UPDATE (VARCHAR (20),VARCHAR (100),VARCHAR (100),INTEGER,VARCHAR (50))users=: LOGIN,=: NAME,=: PASS,=: RULES=: UID;

end^

Процедура осуществляет модификацию записи в таблице пользователей.

CREATE PROCEDURE USERS_DELETE (INTEGER)from users where

UID =: UID;^

Процедура осуществляет удаление записи из таблицы пользователей.

3.2 Реляционная модель БД автопарка



Генераторы:

GENERATOR GEN_CAR_ID;GENERATOR GEN_DRIVER_ID;

Таблицы:

Таблица автомашинTABLE CAR (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,CARGO DOUBLE PRECISION,_CNT INTEGER,INTEGER,INTEGER);

Таблица водителейTABLE DRIVER (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,PASSPORT VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,CAR INTEGER);

3.3 Реляционная модель БД склада



Генераторы:

GENERATOR GEN_CLIENT_ID;GENERATOR GEN_GOODS_ID;

Таблицы:

Таблица клиентов (владельцев товара)

CREATE TABLE CLIENT (INTEGER NOT NULL,VARCHAR (100) CHARACTER SET WIN1251 COLLATE WIN1251,DETAIL VARCHAR (300) CHARACTER SET WIN1251 COLLATE WIN1251);

Таблица товаровTABLE GOODS (INTEGER NOT NULL,VARCHAR (300) CHARACTER SET WIN1251 COLLATE WIN1251,CLIENT INTEGER,INTEGER,INTEGER,_NUM VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251,DIMENSION VARCHAR (50) CHARACTER SET WIN1251 COLLATE WIN1251,WEIGHT DOUBLE PRECISION,_OLD INTEGER,_ADD TIMESTAMP,_OLD TIMESTAMP,INTEGER,INTEGER);

Триггеры:

TRIGGER GOODS_BI0_DATE_ADD FOR GOODSBEFORE INSERT POSITION 0. date_add = current_timestamp;(new. is_old = 1) then begin. date_old = current_timestamp;TRIGGER GOODS_BU0_DATE_OLD FOR GOODSBEFORE UPDATE POSITION 0(new. is_old <> old. is_old) then begin. date_old = current_timestamp;

end

4. Описание работы программы


4.1 Вход в программу


После запуска программы на экране будет отображено окно авторизации пользователя:

Рис. 4.1 Окно авторизации пользователя

В поле "Имя пользователя" необходимо ввести имя своей учетной записи, в поле "Пароль" - свой пароль для доступа к модулям системы. После нажатия на "ОК" будет совершена попытка соединения с сервером Firebird и установки подключения к главной БД. Ход подключения отображается в окне подключения к базе данных.

Рис. 4.2 Окно подключения к БД

При успешном подключении окно автоматически закроется через 3 секунды. Отсчет времени отображается в окне подключения в реальном времени.

Рис. 4.3 Успешное подключение

При неуспешном подключении будет совершена повторная попытка через 10 секунд.

При необходимости процесс подключения можно отменить нажатием кнопки "Отмена".

Рис. 4.4 Произошла ошибка подключения

После соединения с БД произойдет проверка имени пользователя и пароля, введенных пользователем. Если ввод неверный, будет отображено сообщение об ошибке.

Рис. 4.5 Сообщение о неверном имени пользователя

Рис. 4.6 Сообщение о некорректном пароле

Из окна авторизации можно управлять подключениями к БД при помощи окна состояния баз данных, которое вызывается по нажатию на кнопку "Настройка".

Рис. 4.7 Окно состояния баз данных

Из окна состояния баз данных можно произвести подключение к нужной БД, отключение от БД, а также указать параметры подключения для каждой из баз данных путем нажатия на кнопку "…", в результате чего на экране будет отображено оно настройки подключения к БД. Вид подключения можно задать локальным или удаленным, в первом случае предполагается расположение БД на локальном диске, в этом случае нет необходимости вводить параметры удаленного подключения. При использовании варианта сервера Firebird EmbeddedServer необходимо указывать подключение к БД только как локальное.

Рис. 4.8 Окно настройки, удаленное подключение

Рис. 4.9 Окно настройки, локальное подключение

При локальном подключении возможен вызов диалога открытия файла базы данных (*. FBD) следующего вида:

Рис. 4.10. Диалог открытия файла БД

Настройки подключения хранятся в файле DB. ini. Работа с файлом реализована при помощи класса Tin File библиотеки VCL Delphi.

После успешной авторизации будет отображен список модулей, доступных данному пользователю, в котором необходимо выбрать нужный модуль.

Рис. 4.11. Окно выбора модуля

Если пользователю доступен только один модуль, окно выбора не отображается и сразу после входа происходит загрузка этого модуля.

Модули системы реализованы в виде фреймов Delphi (TFrame) с применением механизма наследования фреймов. Один и тот же фрейм может быть создан любое число раз без необходимости дублирования программного кода, как это проделано с фреймами клиентов и водителей.

Все фреймы программного продукта унаследованы от TFrmPattern - фрейма-шаблона, представляющего лишь базовые параметры, общие для всех фреймов (Align, Anchors и т.д.). Также в классе TFrmPattern определены абстрактные методы Initialize и Finalize и объявлена переменная ModuleName. Методы переопределяются в потомках фрейма и служат соответственно для инициализации (создание вложенных фреймов, открытие запросов и т.д.) и закрытия фрейма. Методы вызываются перед показом и перед скрытием или уничтожением фрейма. Переменной ModuleName задается заголовок модуля. Переменной присваивается значение в переопределенном конструкторе каждого фрейма.

4.2 Модуль "Автопарк"


Модуль предоставляет возможности по учету автомашин, водителей, а также мониторингу текущей заявки для каждой автомашины.

Рис. 4.12. Основное окно модуля "Автопарк"

Класс табличного представления TDBGridEh (библиотека EhLib) данных позволяет изменение высоты строки таблицы и многострочное отображение данных. Для изменения высоты строки необходимо потянуть левой кнопкой мыши за край индикатора строки.

По нажатию на кнопки "Добавить" и "Изменить" произойдет отображение диалогов добавления и изменения учетной информации об автомашине. Для данных диалогов программа использует единственный класс формы TfrEditCar, меняя заголовок окна до отображения его на экране в процедуре добавления и удаления автомашины. Диалог создается каждый раз, когда происходит вызов процедуры добавления или изменения автомашины, и удаляется по ее завершению. Заполнение полей ввода происходит автоматически путем использования DB-aware компонентов (DBEdit и др.).

Рис. 4.13. Диалог добавления автомашины

Рис. 4.14. Диалог изменения автомашины

По нажатию на кнопку "Удалить" происходит удаление автомашины и сброс значения приписки к данной автомашине у всех приписанных водителей.

На вкладке "Водители" располагается экземпляр фрейма, реализующий функциональность работы с водителями TfrmDriver. Фрейм создается во время выполнения программы.

Рис. 4.15. Вкладка "Водители"

По нажатию на кнопку "Приписать" происходит отображение диалога приписки водителя к выбранной автомашине. Диалог содержит экземпляр фрейма TfrmDriver, который уничтожается при уничтожении диалога (по его закрытию). По нажатию на кнопку "Отписать" происходит отписание водителя от выбранной автомашины.

Рис. 4.16. Диалог приписки водителя

По нажатию на кнопку "Добавить" или "Изменить" будет отображен соответствующий диалог.

Рис. 4.17. Диалог добавления водителя

4.3 Модуль "Офис"


Модуль предоставляет возможности по учету заявок, детализаций к заявке, клиентов (заказчиков), составлению путеводного листа, а также фильтрации заявок по критерию.

Рис. 4.18. Основное окно модуля "Офис"

Рис. 4.19. Диалог добавления детализации

Рис. 4.20. Диалог добавления заявки

По нажатию на кнопку "…" будет отображен диалог выбора клиента.

Рис. 4.21. Диалог выбора клиента

Диалог выбора клиента содержит экземпляр фрейма клиентов TfrmClient, осуществляющего управление клиентами офиса предприятия. Фрейм поддерживает работу с произвольной базой данных (задается полем DB фрейма), для которой обязательно лишь существование таблицы клиентов CLIENT и генератора GEN_CLIENT_ID. В данном случае фрейм работает с главной БД.

Рис. 4.22. Диалог добавление пункта маршрута

По нажатию на кнопку "Фильтр" будет отображен диалог задания условий фильтрации записей в таблице заявок.

Рис. 4.23. Диалог фильтрации заявок

В зависимости от ввода после закрытия диалога динамически составляется SQL-запрос фильтрации записей в таблице заявок Request.

Рис. 4.24. Пример фильтрации заявок: отображены только выполненные

4.4 Модуль "Склад"


Модуль предоставляет возможности по учету грузов для перевозки, хранящихся на складе, а также клиентов - владельцев груза.

Рис. 4.25. Основное окно модуля "Склад"

Рис. 4.26. Диалог добавления товара

По нажатию на кнопку "…" будет отображен диалог выбора клиента, содержащий экземпляр фрейма TfrmClient. В данном случае фрейм работает с БД склада.

Рис. 4.27. Диалог фильтрации товаров

4.5 Модуль администрирования


Модуль осуществляет управление пользователями системы. К модулю имеет доступ только администратор (учетная запись, содержащая в поле RULES значение "а"). Пользователи хранятся в таблице USERS главной БД.

Рис. 4.28. Основное окно модуля администрирования

Рис. 4.29. Диалог добавления пользователя

В системе должна существовать, по крайней мере, одна учетная запись администратора: это пользователь "admin". Имя пользователя (логин) этой учетной записи изменить невозожно, как и права пользователя, но можно сменить пароль учетной записи и ФИО администратора. Также запись администратора нельзя удалить.

Рис. 4.30. Диалог изменения записи администратора

Рис. 4.31. Ошибка удаления записи администратора

4.6 Тестирование программы


После запуска ИС "Автотранспорт" на экране будет отображен диалог авторизации пользователя. Для успешной авторизации необходимо соединение с главной базой данных.

Рис. 4.32. Диалог авторизации пользователя

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

Рис. 4.33. Производится подключение к БД

Если подключение с текущими настройками успешно установлено, будет отображено соответствующее сообщение, и диалог будет закрыт через 3 секунды.

Рис. 4.34. Подключение к БД установлено

Если подключиться не удалось, попытка будет повторяться каждые 10 секунд. Чтобы отменить циклические попытки подключения, необходимо нажать на кнопку "Отмена".

Рис. 4.35. Ошибка подключения к БД

При некорректном вводе имени пользователя или пароля будет отображен соответствующий диалог ошибки.

Рис. 4.36. Диалог ошибки - неверное имя пользователя

Рис. 4.37. Диалог ошибки - неверный пароль

Настроить параметры подключения к БД можно путем нажатия кнопки "Настройка" в окне авторизации. По нажатию будет отображен диалог состояния БД. Для настройки параметров необходимо нажать на кнопку "…" напротив нужной базы данных.

Рис. 4.38 Диалог состояния БД

По нажатию на "…" будет отображен диалог настройки параметров данный БД. В диалоге можно задать параметры как для локального подключения, так и для удаленного. В последнем случае в поле "IP-адрес сервера" может быть введен как IP-адрес, так и доменной имя сервера, где запущен СУБД Firebird и расположен файл БД. Поле "Путь к файлу БД" также поддерживает псевдонимы БД, которые могут быть заданы в файле "aliases. conf" СУБД Firebird.

Рис. 4.39. Диалог настройки параметров подключения - локальное подключение

Рис. 4.40. Диалог настройки параметров подключения - удаленное подключение

Введем в диалоге авторизации имя пользователя "admin" и его пароль. Этот пользователь является встроенной учетной записью администратора системы, он имеет в системе все права и не может быть удален.

После успешного подключения к БД и проверки имени пользователя и пароля, на экране будет отображен диалог выбора модуля ИС "Автотранспорт". В диалоге отображаются только те модули, которые разрешены администратором системы для данного пользователя. После выбора нужного модуля, будет произведена его загрузка и подключение к необходимой для работы базе данных.

Рис. 4.41. Диалог выбора модуля

Выберем в списке модуль "Офис". После загрузки окно модуля "Офис" имеет следующий вид.

Рис. 4.42. Главное окно модуля "Офис"

Добавим новую заявку.

Рис. 4.43. Диалог добавления заявки

Для добавления нового клиента нажмем "…" и в диалоге выбора клиента нажмем "Добавить". В диалоге добавления клиента необходимо заполнить поля.

Рис. 4.44. Диалог добавления клиента

Рис. 4.45 Диалог выбора клиента

После добавления клиента таблица заявок имеет вид:

Рис. 4.46 Состояние таблица заявок

Добавим детализацию к заявке:

Рис. 4.47. Диалог добавления детализации

После добавления детализации таблица детализации имеет вид:

Рис. 4.48. Состояние таблицы детализации

Аналогично добавим еще несколько детализаций к заявке.

Рис. 4.49 Состояние таблицы детализации

Добавим несколько пунктов маршрута для заявки.

Рис. 4.50. Диалог добавления пункта маршрута

После добавления таблица пунктов маршрута примет вид:

Рис. 4.51. Состояние таблицы пунктов маршрута

Для отметки о прохождении пункта маршрута выберем пункт маршрута "с. Убей" и нажмем на кнопку "Изменить". Будет отображен диалог изменения пункта маршрута, в котором установим флаг "Пройден", а также зададим дату и время прохождения пункта маршрута.

Рис. 4.52. Диалог изменения пункта маршрута

После отметки о прохождении таблица пунктов маршрута примет вид:

Рис. 4.53. Состояние таблицы пунктов маршрута

Для выбора другого модуля системы выберем пункт меню "Файл - > Выбрать модуль". Выберем модуль "Автопарк", основное окно которого имеет вид:

Рис. 4.54. Главное окно модуля "Автопарк"

Добавим новую автомашину

Рис. 4.55. Диалог добавления автомашины

Где поле код заявки - код заявки, которую выполняет данная автомашина.

После добавления таблица автомашин примет вид:

Рис. 4.56. Состояние таблицы автомашин

Для обновления состояния выполнения заявки для выбранной автомашины необходимо нажать на кнопку "Обновить". Для обновления состояния необходимо соединение с главной БД, если оно отсутствует, будет произведена попытка подключения к ней.

Рис. 4.57. Попытка повторного подключения к главной БД

Припишем водителя к автомашине "ГАЗ "Газель". Для этого нажмем на кнопку "Приписать" и в появившемся диалоге выберем водителя.

Рис. 4.58. Диалог выбора водителя

После операции таблица приписанных водителей примет вид:

Рис. 4.59. Состояние таблицы приписанных водителей

Для добавления нового водителя перейдем на вкладку "Водители", где нажмем на кнопку "Добавить" и в диалоге добавления водителя введем его личные данные.

Рис. 4.60. Диалог добавления водителя

После добавления водителя таблица водителей примет вид:

Рис. 4.61. Состояние таблицы водителей

Перейдем в модуль "Склад" с помощью главного меню программы. Основное окно модуля "Склад" имеет следующий вид:

Рис. 4.62. Основное окно модуля "Склад"

Добавим новый товар на склад. Для этого нажмем на кнопку "Добавить" и заполним необходимые поля.

Рис. 4.63. Диалог добавления товара

После добавления таблица товаров примет вид:

Рис. 4.64 Состояние таблицы товаров

Из главного окна программы также возможно управление базами данных. Для этого выберем пункт главного меню "Инструменты - Настройка БД". На экране будет отображен диалог состояния БД.

Рис. 4.65. Диалог состояния БД - все подключения активны

Нажмем кнопку "Отключиться" напротив каждой БД.

Рис. 4.66. Диалог состояния БД - все подключения неактивны

Так как соединение с БД, необходимое для работы текущего модуля, было потеряно, произойдет выход из текущего модуля и отображение диалога выбора модуля.

Рис. 4.67. Повторное отображение диалога выбора модуля после потери подключения

4.7 Руководство администратора


Администрирование ИС "Автотранспорт" производится посредством модуля управления пользователями, а также при помощи утилит администрирования СУБД Firebird.

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

Рис. 4.68. Диалог выбора модуля - модуль "Пользователи"

Выберем в диалоге выбора модуля модуль "Пользователи".

Для добавления нового пользователя нажмем на кнопку "Добавить" и заполним необходимые поля диалога.

Рис. 4.69. Диалог добавления нового пользователя

После добавления пользователя таблица пользователей примет вид:

Попытаемся подключиться вновь возданным пользователем. Для этого выберем пункт меню "Файл - Завершить сеанс" и в диалоге авторизации введем новые имя и пароль.

Рис. 4.70. Диалог авторизации - пользователь "yurio"

Рис. 4.71. Диалог выбора модуля для пользователя "yurio"

Авторизация прошла успешно, кроме того, пользователю доступны именно те модули, которые были назначены при его создании. Модуль "Пользователи" недоступен, потому что пользователю "yurio" не были назначены права администратора системы (директива "а").

Администрирование СУБД Firebird производилось при помощи утилиты HK-Software IB Expert, одной из самых удобных и функциональных в своем роде. Кроме того, IB Expert распространяется бесплатно для жителей и юридических лиц, зарегистрированных на территории России и СНГ.

При помощи IB Expert создавались и администрировались БД ИС "Автотранспорт", также производился контроль скорости исполнения SQL-запросов, наблюдалась статистика транзакций, проверялись свойства индексов с целью контроля производительности БД.

Глава 5. Организационно-экономическая часть


5.1 Экономическое обоснование разработки программы


В последнее время все чаще для автоматизации бизнес-процессов организации прибегают к помощи компьютеров. Как и любой продукт, программное обеспечение должно поддаваться расчетам затрат, цены, экономического эффекта и т.п.

В данном дипломном проекте при разработке программного обеспечения выполняются следующие расчеты:

1. Расчет трудоемкости разработки;

2. Расчет цены новой программы (алгоритма).

5.2 Расчет трудоемкости и цены разработки


Разработка программной продукции, представленной в настоящем проекте, включает в себя 3 этапа:

1. Разработка технического задания.

2. Разработка алгоритма решения поставленной задачи с уяснением входной и выходной информации.

3. Разработка рабочего проекта на уровне программирования.

Трудоемкость работ tпп определяется по сумме трудоемкости отдельных этапов и видов работ по разработке программной продукции, оцениваемых экспериментальным путем в человеко-днях, и носит вероятностный характер. В данном случае:

пп=tтз+tтп+tрп,

где tтз - трудоемкость разработки технического задания на создание программной продукции;

tтп - трудоемкость разработки технического проекта программной проекции, т.е. трудоемкость разработки алгоритма решения;

tрп - трудоемкость разработки рабочего проекта.

Исходя из плана разработки программного проекта:

tтз = 20 чел. - дней;тп = 15 чел. - дней;рп = 18 чел. - дней.

Тогда трудоемкость разработки программной продукции:

пп=20+15+18;пп= 53 чел. - дня.

5.3 Определение цены программной продукции


Цена программной продукции рассчитывается по формуле:

 

Ц=К*С+Пр, (1.1)

где С - затраты на разработку программной продукции (сметная себестоимость);

К - коэффициент учета затрат на изготовление опытного образца программной продукции как продукции производственно-технического назначения (К = 1,1.1,2);

Пр - нормативная прибыль, рассчитываемая по формуле:

 

Пр= (С+См) *рн, (1.2)

где рн - норматив рентабельности, (рн = 25%);

См - материальные затраты, руб. /изд.

Основная заработная плата.

Расчёт основной заработной платы выполняется на основе трудоёмкости выполнения каждого этапа в человеко-днях и величины месячного должностного оклада исполнителя. Расчет ведется по формуле:


где  - среднемесячный оклад i-го исполнителя, руб.;

 - среднее количество рабочих дней в месяце;

 - трудоемкость работ, чел. - дни;

 руб.;

 чел. - дней;

 дня;

 руб.

Дополнительная заработная плата.

На эту статью относятся выплаты, предусмотренные законодательством о труде за неотработанное по уважительным причинам время: оплата очередных и дополнительных отпусков, оплата льготных часов подросткам и т.п. (принимается в размере 20% от суммы основной заработной платы).

Расчет ведется по формуле:

,

где  - коэффициент отчислений на дополнительную зарплату.

;

 

;

 руб.

Отчисления на социальное страхование.

Затраты по этой статье определяются в процентном отношении от суммы основной и дополнительной заработной платы.

В статье учитываются отчисления в бюджет социального страхования, т.е.:


где  - коэффициент отчислений в единый социальный налог.

Отчисления в единый социальный налог состоят из отчислений:

-   в пенсионный фонд 14%;

-   отчисления на социальное страхование от несчастных случаев на производстве и заболеваний 0,2%.

Таким образом,

 руб.

На основе полученных данных рассчитаем сметную себестоимость:

 

;

;  руб.

Таблица 5.1. Себестоимость программы в действующих ценах, рублей

Наименование статьи

Сметная себестоимость, руб.

Удельный вес, %

Основная заработная плата

14454,55

72,97

Дополнительная заработная плата

2890,91

14,59

Отчисления на соцстрахование

2463,06

12,44

Итого

19808,52

100


Нормативная прибыль.

На основе полученных данных рассчитаем цену программной продукции по формуле 1.1 (смотрите выше):

;

 руб

Нормативная прибыль рассчитывается по формуле 1.2 (смотрите выше). Так как материальные затраты на разработку программной продукции , то нормативная прибыль  будет равна:

 

;

;

 руб;= (Пр/Ц) *100%;= (4952,13/19808,53) *100%=25%.

Выводы по главе


Реализация проекта позволит значительно уменьшить затраты рабочего времени на организационные вопросы, а, следовательно, повысить производительность труда и экономическую эффективность проводимых работ.

Данный раздел проекта включает в себя расчет трудоемкости разработки, расчет затрат и определение цены разработки. Трудоемкость разрабатываемого программного продукта равна 53 чел. - дням, при этом цена разработки составила 26741,50 руб.

Таким образом, разработка экономична и рентабельность программного продукта соответствует нормативной и составляет 25%.

6. Информационная безопасность проекта


Понятие информационной безопасности (ИБ) тесно связано с процессом информатизации общества. Таким образом, под информационной безопасностью в широком смысле можно понимать такую ситуацию в информационной сфере, которая гарантирует выявление, предупреждение, нейтрализацию и устранение всех негативных событий, явлений и процессов, возникающих в ходе информатизации, и обеспечивает дальнейшее развитие рассматриваемого объекта защиты (личности, общества, государства, предприятия и т.д.).

По своему содержанию информационная безопасность включает:

-     компьютерную безопасность;

-     безопасность информационных систем и процессов;

-     безопасность среды для реализации информационных процессов.

К основным аспектам проблемы обеспечения информационной безопасности относятся:

-     защита государственной тайны, то есть секретной и другой конфиденциальной информации, являющейся собственностью государства, от всех видов несанкционированного доступа, манипулирования и уничтожения;

-     защита прав граждан на владение, распоряжение и управление принадлежащей им информацией;

-     защита прав предпринимателей при осуществлении ими коммерческой деятельности;

-     защита конституционных прав граждан на тайну переписки, переговоров, личную тайну;

-     защита технических и программных средств от ошибочных действий персонала и техногенных воздействий, а также стихийных бедствий и иных обстоятельств с целью сохранения возможности управления процессом обработки.

Существуют основные направления деятельности по обеспечению информационной безопасности в организациях.

.        Нормативно - правовое обеспечение, представляющее собой взаимоувязанный комплекс законодательных и иных правовых актов, устанавливающих правовой статус субъектов правоотношений, субъектов и объектов защиты, методы, формы и способы защиты и их правовой статус. Следует особо отметить необходимость нормативно-правового обеспечения таких важных аспектов деятельности системы защиты, как сертификация и лицензирование. Система законодательных актов и разработанных на их базе нормативных и организационно-распорядительных документов должна обеспечивать организацию эффективного надзора за их исполнением со стороны правоохранительных органов и реализацию мер судебной защиты.

2.      Организационно - техническое обеспечение, которое представляет собой комплекс координируемых мероприятий и технических мер, реализующих практические механизмы защиты. Условно эти мероприятия подразделяются на системообразующие и надзорные (контрольные). Особенностью надзорных мероприятий является необходимость создания независимого, вне отраслевого надзора за защитой и уровнем безопасности информации.

.        Страховое обеспечение, предназначенное для защиты собственника информации или средств информатизации как от традиционных угроз (кражи, стихийные бедствия), так и от угроз, возникающих вследствие информатизации (утечки информации, хищения, модификации, уничтожения, отказа в обслуживании и др.).

Все мероприятия по обеспечению информационной безопасности должны привести к достижению следующих целей:

-     предупреждение появления угроз информации;

-     выявление возможных направлений и степени нарастания опасности нарушения ИБ;

-     обнаружение реальных фактов нарушения ИБ;

-     пресечение разглашения, утечки и несанкционированного доступа к информации, нарушения ее целостности;

-     ликвидация или снижение уровня ущерба от нарушения ИБ и ее использования соумышленниками.

Таким образом, информация, а также средства вычислительной техники (СВТ), автоматизированная система (АС) и их компоненты, выполняющие роль носителя информационных процессов и самой информации, выступают в качестве объекта защиты, поэтому в первую очередь необходимо выявить те нежелательные воздействия, которым может подвергнуться этот объект. Выявление, предотвращение и ликвидация последствий этих воздействий, согласно общим определениям теории безопасности, и составляет суть функционирования средств защиты информации от несанкционированного доступа (НСД).

Исходя из этих рассуждений, можно говорить, что информационная безопасность в узком смысле - это совокупность свойств информации, связанной с обеспечением запрещения несанкционированного доступа, а также любых других действий с личной, конфиденциальной или секретной информацией, представленной в любом физическом виде.

При построении систем защиты информации, большое значение имеет определение ценности защищаемой информации, поскольку стоимость самой системы защиты не может превышать стоимости защищаемой информации. Поэтому основополагающими для сферы защиты информации являются понятия информации как защищаемого объекта и ценности информации как одного из свойств объекта защиты, существенно влияющих на организацию системы безопасности.

Информация, содержащаяся в базе данных предприятия является ценной, так как в ней хранятся все технологии изготовления продукции, конструкторские разработки, техническая документация изделий и т.д. Раскрытие этой информации, в результате промышленного шпионажа может привести к снижению прибыли предприятия, а также банкротству.

Разработанный программный продукт, непосредственно работает с базой данных предприятия.

Для Системы управления базами данных (СУБД) важны три основных аспекта информационной безопасности - конфиденциальность, целостность и доступность.

Также, непосредственно важна, возможность для ответственных за защиту информации лиц восстанавливать процесс нарушения или попытки нарушения безопасности информационной системы.

Произведем оценку безопасности программного продукта согласно критериям по оценке безопасности ГОСТ 15408/2002.

6.1 Основные понятия и определения оценки объекта


Для того чтобы оценить безопасность проекта, необходимо чтобы критерии оценки удовлетворяли всем системам. При разработке профиля защиты необходимо помнить, что он не регламентирует, каким образом будут выполнения требования, обеспечивая тем самым независимость от реализации продукта описания этих требований.

Ресурсы, задействованные при разработке и функционировании продукта, могут быть различными. В данном случае целесообразно рассмотреть следующие виды ресурсов: физические, программные и информационные. К физическим ресурсам можно отнести все оборудование, используемое для разработки и внедрения программного продукта: компьютерное оборудование (процессоры, мониторы, системные блоки, модемы), коммуникационное оборудование (маршрутизаторы, АТС, факсы, автоответчики), магнитные носители (ленты и диски), другое техническое оборудование (источники питания, кабели, кондиционеры), мебель помещения. В нашей задаче физической средой является персональный компьютер, на котором происходит разработка программного продукта, и сеть предприятия.

Программные ресурсы: прикладное программное обеспечение, системное программное обеспечение, средства разработки и утилиты. В данном случае системным программным обеспечением является операционная система Windows, СУБД Paradox - средство разработки программы.

Информационные ресурсы: базы данных и файлы данных, системная документация, руководства пользователей, обучающие материалы, операционные процедуры или процедуры поддержки, планы обеспечения непрерывности бизнеса, процедуры восстановления, заархивированная информация.

Итак, под объектом оценки (ОО) понимается аппаратно - программный продукт или система информационных технологий (ИТ) с соответствующими документами.

Система ИТ - специфическое воплощение изделия с конкретным назначением и условиями эксплуатации.

Продукт ИТ, согласно определению общих критериев, есть совокупность программных, программно - аппаратных и/или аппаратных средств ИТ, предоставляющая определенные функциональные возможности и предназначенная для непосредственного использования или включения в различные системы ИТ. В данном случае наш программный продукт предназначен для расчета нормативного запаса готовой продукции, реализуемый в СУБД Paradox.

Понятие объекта оценки непосредственно в нашем случае связано с понятием среды безопасности, а именно с той областью среды, в пределах которой предусматривается обеспечение необходимых условий для поддержания требуемого режима безопасности изделия ИТ. Сюда можно отнести:

-     административная область (политика безопасности предприятия);

-     законодательная область (совокупность законодательных актов, нормативных актов);

-     физическая область (физическая среда и средства физической защиты);

-     программная область (область применения и предназначение объекта оценки, и все ресурсы, которые необходимы для его функционирования, требующие защиты).

Следующим шагом в оценке является описание следующих материалов:

-     изложение предположений, которым удовлетворяла бы среда разрабатываемой ИТ для того, чтобы она считалась безопасной, то есть чтобы объект оценки считался защищенным;

-     изложение угроз объекту оценки, причем они рассматриваются с точки зрения различных аспектов: источник угрозы (нападающий),

-     метод действия, активы, которые могут подвергнуться нападению, уязвимости, являющиеся предпосылкой для нападения;

-     изложение политики безопасности, применяемой в организации.

Для системы ИТ такая политика может быть описана достаточно точно, а для продукта ИТ могут быть сделаны только рабочие предположения.

Результаты этого анализа должны использоваться для установки целей безопасности, направленные на обеспечение противостояния угрозам и выполнение политики безопасности. Далее, эти цели преобразуются в требования безопасности, которые являются совокупностью требований безопасности для объекта оценки и требований безопасности для среды, которые в случае их удовлетворения обеспечат для ОО способность достижения целей безопасности. Перечень стандартизированных требований достаточно обширен - это обеспечивает универсальность общих критериев (ОК).

Имеются две различные категории требований безопасности - функциональные требования и требования доверия. Функциональные требования налагаются на те функции, которые предназначены для поддержания безопасности ОО и определяют желательный безопасный режим функционирования. Требования доверия соответствуют пассивному аспекту, предъявляются к технологии разработки и процессу эксплуатации ОО.

В соответствии с ОК организация требований безопасности осуществляется в виде иерархии: класс - семейство - компонент - элемент. Термин класс применяется для общего группирования требований безопасности. Составляющие класса называются семействами, под которыми понимается группа наборов требования безопасности, имеющих общие цели безопасности, но различающихся акцентами или строгостью. Составляющие семейства называются компонентами, которые представляют специфический набор требований безопасности, являющийся наименьшим выбираемым набором требований безопасности для включения в структуры, определяемые ОК. Компоненты составлены из отдельных элементов.

Каждый элемент определяет требования безопасности на самом нижнем уровне. Он является тем неделимым требованием безопасности, которое может быть верифицировано при оценке.

Рис. 6.1 Последовательность формирования требований информационной безопасности

Сформулировав требования доверия, функциональные требования и требования к среде, можно оценивать безопасность продукта ИТ. Для этого рассмотрим понятие профиля защиты.

6.2 Профиль защиты


В состав профиля защиты (ПЗ) входят:

.        Введение ПЗ (идентификация ПЗ, аннотация ПЗ).

2.      Описание объекта оценки (ОО).

.        Среда безопасности ОО (предположение безопасности, угрозы, политика безопасности организации).

.        Цели безопасности (цели безопасности для ОО, цели безопасности для среды).

.        Требования безопасности ИТ (для среды ИТ).

.        Требования безопасности для ОО (функциональные требования безопасности ОО, требования доверия к безопасности ОО).

.        Замечания по применению.

.        Обоснование (логическое обоснование целей безопасности, логическое обоснование требований безопасности).

Идентификация ПЗ

Название: Профиль защиты. Контролируемый доступ.

Обозначение: ПЗ КД.

Ключевые слова: управление доступом, дискреционное управление доступом, операционная система общего назначения, защита информации.

Аннотация ПЗ

Профиль защиты с контролируемым доступом, разработанный на основе Общих критериев версия 2.1, определяет набор функциональных требований и требований доверия для продуктов информационных технологий. ПЗ КД-совместимые продукты поддерживают такое управление доступом, которое позволяет ограничивать действия отдельных пользователей и доступ к данным объектов. ПЗ КД-совместимые продукты также предоставляют возможности аудита, при котором осуществляется регистрация важных для безопасности событий.

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

В общем случае ПЗ КД применим для распределенных систем, но не учитывает требования безопасности, выходящие за рамки потребностей распределения ресурсов внутри сети.

Стойкость, обусловленная средой

ПЗ КД определен для некой обобщенной среды со средним уровнем риска для активов. Требования доверия и минимально допустимая стойкость функций выбраны в соответствии с этим уровнем риска.

ОУД3 (EAL3) является оценочным уровнем доверия к безопасности ОО, а средняя стойкость функции безопасности является для данного профиля минимально допустимой стойкостью функций безопасности, реализуемых вероятностными и/или перестановочными (но не криптографическими) механизмами.

В данном профиле используются следующие термины:

-     пользователь;

-     уполномоченный пользователь;

-     уполномоченный администратор;

-     политика дискреционного управления доступом (DAC);

-     посредничество;

-     доступ;

-     полномочие.

Пользователь - лицо, обращающееся к сервисам, предоставляемым объектом оценки.

Уполномоченным пользователем является пользователь, который был должным образом идентифицирован и аутентифицирован. Такие пользователи рассматриваются как законные пользователи ОО.

Уполномоченным администратором является уполномоченный пользователь, которому предоставлены полномочия на управление ОО. Предполагается, что эти пользователи используют полномочия только в рамках, предписанных руководством администратора.

Политика дискреционного управления доступом (DAC) является основной политикой, которую ПЗ КД-совместимые ОО осуществляют по отношению к пользователям и ресурсам.

Политика DAC состоит из правил двух типов: те, которые применимы к поведению уполномоченных пользователей (обозначаемые правилами доступа), и те, которые применимы к поведению уполномоченных администраторов (обозначаемые правилами полномочий). Если удовлетворен запрос уполномоченного пользователя на операцию с объектом, то говорят, что пользователь получил доступ к объекту. Если уполномоченным администратором предоставлен запрошенный сервис, то говорят, что пользователь имеет полномочия на запрошенный сервис или объект. Как и в случае с доступом, полномочия могут быть множественными. Типичным примером полномочий являются полномочия аудита, которые позволяют администратору просматривать записи аудита, пользоваться средствами аудита.

6.3 Описание объекта оценки


ПЗ КД определяет набор требований безопасности, предъявляемых к объектам оценки. К этим ОО относятся однопользовательские и многопользовательские информационные системы на базе компьютеров, ПЭВМ и рабочих станций с операционными системами общего назначения. В такие системы может входить один хост или множество взаимодействующих хостов в распределенной конфигурации.

Такие системы могут содержать один или несколько процессоров с периферийными и запоминающими устройствами, используемыми многими пользователями для выполнения различных функций, требующих управляемого, коллективного доступа к информации, хранимой в системе.

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

ПЗ КД предполагает, что ответственность за сохранность данных, защищаемых функциями безопасности объекта оценки, может быть делегирована пользователям ОО. Все данные находятся под управлением ОО.

Данные хранятся в объектах, и ФБО могут связать с каждым управляемым объектом описание прав доступа к нему.

Каждому пользователю назначается уникальный идентификатор. Идентификатор поддерживает индивидуальную ответственность пользователя. ФБО удостоверяют идентичность пользователя до того, как пользователь выполнит любые действия, требующие посредничества ФБО, кроме действий, помогающих уполномоченному пользователю получить доступ к ОО.

6.4 Среда безопасности ОО


Этот подраздел описывает аспекты безопасности среды, в которой объект оценки будет использоваться или предназначен для использования. Подраздел включает в себя информацию о физической защите, персональных аспектах и аспектах связности.

Предполагается, что для ПЗ КД - совместимого ОО приняты эффективные меры безопасности в невраждебной среде, если ОО установлен, управляется и используется корректно.

Операционная среда должна управляться в соответствии с документацией по установке, функционированию и руководствами пользователя и администратора, отвечающими требованиям доверия.

Предположения безопасности:

-     для управления ОО и безопасностью информации назначены компетентные лица;

-     системный административный персонал является ответственным, управляемым и невраждебным и строго придерживается инструкций административной документации;

-     уполномоченные пользователи владеют необходимыми полномочиями на доступ, по крайней мере, к некоторой части информации, управляемой ОО, и могут совместно работать в дружественной среде;

-     любые системы, с которыми ОО взаимодействует, находятся под таким же управлением и функционируют по тем же правилам политики безопасности, что и ОО. ПЗ КД - совместимые ОО применимы только к тем сетевым или распределенным средам, в которых вся сеть работает с одинаковыми правилами политики безопасности и остается в пределах одной области управления;

-     все связи с периферийными устройствами остаются в пределах возможностей контролируемого доступа. ПЗ КД - совместимые ОО предполагают условия безопасности, предусматривающие обращение к объекту оценки через санкционированные точки. Внутренние пути к точкам доступа, таким как терминалы, надежно защищены;

-     пользователи осведомлены о политике безопасности предприятия

Угрозы безопасности:

1.      Раскрытие конфиденциальной информации (несанкционированный доступ к БД, прослушивание каналов связи).

2.      Компрометация информации (несанкционированное применение информационных ресурсов).

.        Несанкционированный обмен информацией (при закрытом доступе).

.        Ошибочное использование информационных ресурсов (чаще всего программные ошибки).

.        Отказ от информации (не признание факта получения или отправления), отказ от обслуживания (отказ системы).

.        Незаконное проникновение на территорию организации.

.        Компьютерные вирусы и другие вредоносные программы.

Политика безопасности предприятия:

-     управление доступом - присвоение каждому пользователю персонального идентификатора, опознание подлинности идентификатора, проверка полномочий (уровень доступа к системе),

разрешение и создание условий для работы, протоколирование обращения к разрешенным ресурсам, реагирование (сигнализация, отключение, задержка работ);

-     на пользователей возложена ответственность за действия в системе (пользователи вынуждены соблюдать правила обработки, передачи и использования защищаемой информации, под угрозой материальной и административной ответственности).

Вычислительные ресурсы сосредоточены в контролируемой зоне.

Аппаратное и программное обеспечение ОО защищено от несанкционированной физической модификации.

6.5 Цели безопасности


Цели безопасности для ИТ

1.      ФБО должны обеспечивать, чтобы только уполномоченные пользователи могли получить доступ к ОО и его ресурсам. Предусматривается так же и физическая защита ресурсов.

2.      ФБО должны управлять доступом к ресурсам, который основан на идентификаторах пользователей. ФБО должны позволять уполномоченным пользователям определять, какие ресурсы могут быть доступны.

.        ФБО должны регистрировать относящиеся к безопасности ОО действия пользователей. ФБО должны предоставлять эту информацию уполномоченным администраторам.

.        ФБО должны обеспечивать, чтобы любая информация, содержащаяся в защищаемом ресурсе, не раскрывалась при перераспределении ресурса.

.        ФБО должны предоставлять все необходимые функции и возможности для поддержки уполномоченных администраторов, которые являются ответственными за управление безопасностью ОО.

.        ФБО должны быть спроектированы и реализованы таким образом, чтобы обеспечивалось осуществление политики безопасности организации в предопределенной среде.

Цели безопасности, не относящиеся к ИТ

1.      Предполагается, что ПЗ КД - совместимый ОО является полным и самодостаточным и поэтому не зависит от любых других продуктов для правильного выполнения своих функций. Однако, определенные цели, связанные со средой функционирования ОО, должны быть достигнуты.

2.      Ответственные за ОО лица должны обеспечить, чтобы ОО был поставлен, инсталлирован, управлялся и функционировал в соответствии с целями безопасности ИТ.

.        Ответственные за ОО лица должны обеспечить, чтобы части ОО, критичные по безопасности, были защищены от физических атак, которые могут скомпрометировать цели безопасности ИТ.

.        Ответственные за ОО лица должны обеспечить защиту информации, аутентификации в соответствии с целями безопасности ИТ.

.        Ответственные за ОО лица должны обеспечить ликвидацию данных аутентификации и привилегий пользователей, лишенных доступа.

6.6 Требования безопасности


Требования безопасности для среды ИТ

В целях обеспечения безопасности системы управления базами данных (СУБД) идентификация и аутентификация пользователей СУБД может быть возложена на операционную систему (ОС), под управлением которой функционирует СУБД. На ОС также может быть возложена задача защиты от обхода пользователями механизмов управления доступом СУБД при непосредственном обращении к файлам базы данных.

Уровень доверия к реализации ФТБ для ИТ - среды должен быть не ниже уровня доверия к реализации ФТБ объектом оценки.

Функциональные требования безопасности

ОК предусматривают 11 классов функциональных требований:

.        FAU - аудит безопасности;

2.      FCO - связь;

.        FCS - криптографическая поддержка;

.        FDP - защита данных пользователя;

.        FIA - идентификация и аутентификация;

.        FMT - управление безопасностью;

.        FPR - приватность;

.        FPT - защита ФБО;

.        FRU - использование ресурсов;

.        FTA - доступ к ОО;

.        FTP - доверенный маршрут/канал.

Обозначим конкретнее те из них, которые соответствуют нашему продукту и нашим целям.

Класс FAU:

-     генерация данных аудита безопасности, FAU_GEN;

-     просмотр аудита безопасности, FAU_SAR;

-     выбор событий аудита, FAU_SEL;

-     хранение данных аудита, FAU_STG.

Класс FDP:

-     политика управления доступом, FDP_ACC;

-     функции управления доступом, FDP_ACF;

-     защита остаточной информации, FDP_RIP;

-     защита конфиденциальности данных при передаче между ФБО, FDP_UCT.

Класс FIA:

-     аутентификация пользователя, FIA_UAU;

-     идентификация пользователя, FIA_UID;

-     определение атрибутов пользователя, FIA_ATD;

-     спецификация секретов, FIA_SOS;

-     связывание пользователь - субъект, FIA_USB.

Класс FMT:

-     управление атрибутами безопасности, FMT_MSA;

-     управление данными, FMT_MTD;

-     отмена, FMT_REV;

-     роли управления безопасностью, FMT_SMR.

Класс FPT:

-     тестирование базовой абстрактной машины, FPT_AMT;

-     посредничество при обращениях, FPT_RVM;

-     разделение домена, FPT_SEP;

-     надежные метки времени, FPT_STM.

Далее приведем таблицу зависимости требований. Знак "x" означает однозначную зависимость между компонентами, "o" - зависимость может быть выбрана, "-" - косвенная зависимость.

Таблица 6.1. Зависимости требований


F A U _ G E N.1

F A U _ S A R.1

F A U _ S T G.1

F D P _ A C C.1

F D P _ A C F.1

F D P _ I F C.1

F D P _ I F F.1

F I A _ A T D.1

F I A _ U A U.1

F I A _ U I D.1

F MT _ MS A.1

F MT _ MS A.3

F MT _ MT D.1

F MT _ S MR.1

F P T _ A MT.1

F P T _ S T M.1

FAU_GEN.1
















x

FAU_GEN.2

x









x






-

FAU_SAR.1

x















-

FAU_SAR.2

-

x














-

FAU_SAR.3

-

x














-

FAU_SEL.1

x









-



x

-


-

FAU_STG.1

x















-

FAU_STG.2

x















-

FAU_STG.3

-


x













-

FAU_STG.4

x















-

FDP_ACC.1




-

x

-

-



-

-

-


-



FDP_ACC.2




-

x

-

-



-

-


-



FDP_ACF.1




x

-

-

-



-

-

x


-



FDP_RIP.1

















FDP_RIP.2

















FDP_UCT.1




o

-

o

-



-

-

-


-



FIA_ATD.1

















FIA_SOS.1

















FIA_SOS.2

















FIA_UAU.1










x







FIA_UAU.2










x







FIAUAU.7









x

-







FIA_UID.1

















FIA_UID.2

















FIA_USB.1








x









FMT_MSA.1




o

-

o

-



-

-

-


x



FMT_MSA.2




o

-

o

-



-

x

-


x



FMT_MSA.3




-

-

-

-



-

x

-


x



FMT_MTD.1










-




x



FMT_MTD.2










-



x

x



FMT_MTD.3










-



x

-



FMT_REV.1










-




x



FMT_SMR.1










x







FMT_SMR.2

















FMT_SMR.3










-




x



FPT_AMT.1

















FPT_RVM.1

















FPT_SEP.1-3


















Требования доверия

Требования доверия также подразделяются на классы.

.        Класс АСМ - Управление конфигурацией (УК):

-     средства контроля УК, ACM_CAP;

-     охват УК объекта оценки, ACM_SCP.

2.      Класс ADO - Поставка и эксплуатация:

-     поставка, ADO_DEL;

-     установка, генерация, запуск, ADO_IGS.

3.      Класс ADV - Разработка:

-     функциональная спецификация, ADV_FSP;

-     детализация вопросов безопасности в проекте верхнего уровня, ADV_HLD;

-     соответствие представлений, ADV_RCR.

4.      Класс AGD - Руководства:

-     руководство администратора, AGD_ADM;

-     руководство пользователя, AGD_USR.

5.      Класс ALC - Поддержка жизненного цикла:

-     безопасность разработки, ALC_DVS.

.        Класс ATE - Тестирование:

-     анализ покрытия, ATE_COV;

-     анализ глубины, ATE_DPT;

-     функциональное тестирование, ATE_FUN;

-     независимое тестирование, ATE_IND.

7.      Класс AVA - Оценка уязвимостей:

-     неправильное применение, AVA_MSU;

-     оценка стойкости функций безопасности ОО, AVA_SOF;

-     анализ уязвимостей, AVA_VLA.

Далее приведем таблицу сводного описания оценочного уровня доверия ОУД3. [15]

Таблица 6.2. Сводное описание оценочного уровня доверия

Класс доверия

Компоненты доверия

Управление конфигурацией

 ACM_CAP.3 Средства контроля авторизации


ACM_SCP.1 Охват УК объекта оценки

Поставка и эксплуатация

ADO_DEL.1 Процедуры поставки


ADO_IGS.1 Процедуры установки, генерации и запуска

Разработка

ADV_FSP.1 Неформальная функциональная спецификация


ADV_HLD.2 Детализация вопросов безопасности в проекте верхнего уровня


ADV_RCR.1 Неформальная демонстрация соответствия

Руководства

AGD_ADM.1 Руководство администратора


AGD_USR.1 Руководство пользователя

Поддержка жизненного цикла

ALC_DVS.1 Идентификация мер безопасности

Тестирование

 ATE_COV.2 Анализ покрытия


ATE_DPT.1 Тестирование: проект верхнего уровня


ATE_FUN.1 Функциональное тестирование


ATE_IND.2 Выборочное независимое тестирование

Оценка уязвимостей

AVA_MSU.1 Экспертиза руководств


AVA_SOF.1 Оценка стойкости функции безопасности ОО


AVA_VLA.1 Анализ уязвимостей разработчиком


Перекрестные ссылки между компонентами доверия. В таблице 10 объединены как прямые, так и косвенные зависимости. Косвенные зависимости являются, в конечном счете, результатом последовательного учета всех зависимостей каждого компонента, приведенного в списке зависимостей. [15]

Таблица 7.3. Зависимости компонентов доверия

Имена компо-нентов

A U T

C A P

S C P

D E L

I G S

F S P

H L D

I M P

I N T

L L D

R C R

S P M

A D M

U S R

D V S

F L R

L C D

T A T

C O V

D P T

F U N

I N D

C C A

M S U

S O F

V L A

 CAP.1-2



























 CAP.3-4



1












1












 CAP.5



1












2












 SCP.1-3


3













1












 DEL.1



























 DEL.2-3


3

1












1












 IGS.1-2






1





1


1














 FSP.1-4











1
















 HLD.1-2






1





1
















 HLD.3-4






3





2
















 HLD.5






4





3
















 RCR.1-3



























 ADM.1






1





1
















 USR.1






1





1
















 DVS.1-2



























 COV.1-3






1





1










1






 DPT.1






1

1




1










1






 DPT.2






1

2



1

1










1






 DPT.3






1

2

2


1

1







1



1






 FUN.1-2



























 IND.1






1





1


1

1













 IND.2-3






1





1


1

1







1






 MSU.1-3





1

1





1


1

1













 SOF.1






1

1




1
















 VLA.1






1

1




1


1

1













 VLA.2-4






1

2

1


1

1


1

1




1










Здесь курсивом выделены косвенные зависимости, а полужирным шрифтом - прямые.

Проанализировав все вышеперечисленные требования и цели безопасности, можно отнести данную автоматизированную систему (АС) по уровню защищенности от несанкционированного доступа к группе "1" (многопользовательские системы, в которых одновременно обрабатывается информация различных уровней конфиденциальности), классу "Г" в соответствии с руководящими документами Гостехкомиссии России. Обозначим подсистемы и требования к данному классу.

Таблица 7.4. Подсистемы и требования к классу 1Г

Подсистема

Требования

Управление доступом

Идентификация, проверка подлинности, контроль доступа субъекта в систему


Идентификация, проверка подлинности, контроль доступа субъекта к терминалам ЭВМ, каналам связи, внешним устройствам


Контроль доступа к программам


Контроль доступа к томам, каталогам, файлам, записям, полям записей.

Регистрация и учет

Регистрация и учет входа/ выхода субъектов доступа в/из системы.


Регистрация выдачи печатных выходных документов


Регистрация запуска/ завершения программ, процессов


Регистрация доступа программ субъекта, к терминалам ЭВМ, файлам.


Учет носителей информации


Очистка освобождаемых носителей ОЗУ

Обеспечение целостности

Обеспечение целостности программных средств и обрабатываемой информации


Физическая охрана средств вычислительной техники и носителей информации


Периодическое тестирование средств защиты информации


Наличие средств восстановления для средств защиты информации


6.7 Обоснования


Логическое обоснование целей безопасности. Цели безопасности ОО получены, исходя исключительно из положений политики безопасности организации, и поэтому в их содержании явно не определены угрозы, которым необходимо противостоять.

Этот пункт предоставляет свидетельство, демонстрирующее охват политики безопасности организации целями безопасности, относящимися и не относящимися к ИТ. Далее рассматривается учет каждого положения политики безопасности.

Управление доступом.

Эта политика осуществляется с помощью цели 1 и 2. Цель 4 обеспечивает то, что информация не будет предоставлена пользователям, у которых нет необходимости знать о ней, когда ресурсы повторно используются. Цель 5 поддерживает эту политику с помощью требования, чтобы уполномоченные администраторы были способны управлять функциями безопасности, а цель 6 обеспечивает, что функции вызываются и выполняются корректно.

На пользователей возложена ответственность за действия в системе.

Эта политика осуществляется с помощью цели 3, требующей, чтобы действия регистрировались в журнале аудита. Цель 5 поддерживает эту политику с помощью требования, чтобы уполномоченный администратор был способен управлять функциями безопасности, а цель 6 обеспечивает, что функции вызываются и выполняются корректно.

Логическое обоснование требований безопасности

.        Пользователи, уполномоченные на доступ к ОО, определяются процессом идентификации и аутентификации [FIA_UID.1, FIA_UAU.1]. Для обеспечения авторизованного доступа к ОО данные аутентификации защищены [FIA_ATD.1, FIA_UAU.7]. Эффективность механизма аутентификации должна быть достаточной для обеспечения того, что неуполномоченные пользователи не смогут легко получить доступ [FIA_SOS.1].

2.      Дискреционное управление доступом должно иметь определенные границы управления [FDP_ACC.1]. Должны быть определены правила политики DAC [FDP_ACF.1], атрибуты безопасности объектов и субъектов, используемые для установления политики [FIA_ATD.1, FIA_USB.1]. Уполномоченные пользователи должны быть способны управлять доступом к объектам [FMT_MSA.1] и отменять доступ [FMT_REV.1]. Защита объектов должна быть непрерывной с момента их создания [FMT_MSA.3].

.        Относящиеся к безопасности действия должны быть определены, подвержены аудиту [FAU_GEN.1] и ассоциироваться с отдельными пользователями [FAU_GEN.2, FIA_USB.1].

Журнал аудита должен быть защищен таким образом, чтобы только уполномоченные пользователи имели доступ к нему [FAU_SAR.2].

ФБО должны предоставлять возможность аудита действий отдельного пользователя [FAU_SAR.3, FAU_SEL.1, FIA_USB.1]. Журнал аудита должен быть полноценным [FAU_STG.1, FAU_STG.4]. Метки времени должны быть надежными [FPT_STM.1]. Уполномоченный администратор должен иметь возможность управлять журналом аудита [FAU_STG.3, FMT_REV.1] и просматривать его [FAU_SAR.1].

.        Остаточная информация, ассоциированная с определенными объектами в ОО, должна быть очищена (убрана из объекта) до повторного использования объекта [FDP_RIP.2].

5.      Уполномоченному администратору должны предоставляться ФБО для управления ОО [FMT_SMR.1]. Администратор должен быть способен управлять возможностями пользователя [FMT_SMR.1, FMT_MTF.1, FMT_REV.1]. Администратор должен быть способен управлять просмотром журнала аудита [FAU_SAR.1, FAU_SAR.3, FAU_SEL.1, FAU_STG.3, FAU_STG.4, FMT_MTD.1, FMT_REV.1].

.        ФБО должны осуществлять ПБО [FPT_RVM.1]. При этом должна быть организована защита от вмешательства, препятствующего выполнению ФБО [FPT_SEP.1]. ОО должен демонстрировать правильность функционирования абстрактной машины, положенной в основу ФБО [FPT_AMT.1], что достигается, в частности, через требования доверия, определенные в ПЗ. Эта цель предоставляет общую поддержку для других целей безопасности, защищая части ОО, осуществляющие и поддерживающие ПБО.

Выводы

1.      Программный продукт является автоматизированной системой.

2.      Сформулированы функциональные требования и требования к среде.

.        Разработан профиль защиты автоматизированной системы на основе государственного стандарта ГОСТ 15408/2002.

Данная автоматизированная система по уровню защищенности от несанкционированного доступа относится к группе "1" (многопользовательские системы, в которых одновременно обрабатывается информация различных уровней конфиденциальности), к классу "Г" в соответствии с руководящими документами Гостехкомиссии России.

Заключение


В рамках дипломного проектирования была разработана информационная система "Автотранспорт", позволяющий автоматизировать деятельность автотранспортного предприятия и являющаяся актуальной на современном местном рынке программного обеспечения.

Примененные в ходе решения инструменты, средства и методы позволили добиться поставленных целей: программный продукт обладает необходимой функциональностью, удобным интерфейсом и системными требованиями, не выходящими за рамки средней конфигурации. Произведенный экономический анализ показал, что разработка и внедрение ИС "Автотранспорт" принесет выгоду разработчику.

ИС "Автотранспорт" может быть внедрена на предприятиях малого и среднего звена для автоматизации деятельности предприятия, связанной с локальными и междугородними грузоперевозками, включая временное хранение товара на складах предприятия.

Список литературы


1.      Конопка Р. Создание оригинальных компонент в среде Delphi / Пер. с англ. К.: ДиаСофт Лтд. 1996, 512 с.;

2.      Ковязин А., Востриков С. Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/Firebird/Yaffil / П.: КУДИЦ-Образ, 2005, 496 с.;

.        Бирш Т. Firebird. Быстрый старт / Пер. с англ., 2003,19 с.

4.      URL: http://megalib.com/books/1057/firebird_qsg. pdf <http://megalib.com/books/1057/firebird_qsg.pdf>

5.      KDV Использование InterBase eXpress в приложениях / 2007, 32 с.

6.      URL: http://www.ibase.ru/devinfo/ibx. htm <http://www.ibase.ru/devinfo/ibx.htm>

7.      KDV Версионность метаданных/ 2004, 2 с.

8.      URL: http://www.ibase.ru/devinfo/metaver. htm <http://www.ibase.ru/devinfo/metaver.htm>

9.      Кузьменко Д. Генераторы и их использование / 2005, 18 с.

10.    URL: http://www.ibase.ru/devinfo/generator. htm <http://www.ibase.ru/devinfo/generator.htm>

11.    Штунц К. Жизненный цикл транзакций / Пер. с англ., 2004, 12 с.

12.    URL: http://www.ibase.ru/devinfo/utl. htm <http://www.ibase.ru/devinfo/utl.htm>

13.    KDV Кооперативная сборка мусора/ 2005, 6 с.

14.    URL: http://www.ibase.ru/devinfo/garbage. htm <http://www.ibase.ru/devinfo/garbage.htm>

15.    Харрисон А. Как работает версионность данных / Пер. с англ., 2001, 14 с.

16.    URL: http://www.ibase.ru/devinfo/versions. htm <http://www.ibase.ru/devinfo/versions.htm>

17.    Кузьменко Д. Транзакции в InterBase / 2005, 38 с.

18.    URL: http://www.ibase.ru/devinfo/ibtrans. htm <http://www.ibase.ru/devinfo/ibtrans.htm>

19.    Служба поддержки iBase.ru Выбор компонент доступа / 2006, 9 с.

20.    URL: http://www.ibase.ru/devinfo/choosecomp. htm <http://www.ibase.ru/devinfo/choosecomp.htm>

Приложение А


Текст программы:uMain;

interface, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Menus, ImgList, ActnList, ComCtrls, XPMan, StdCtrls, IBDatabase;= class (TForm): TStatusBar;: TImageList;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TXPManifest;: TLabel;: TActionList;: TAction;: TAction;: TAction;: TAction;: TAction;: TButton;FormClose (Sender: TObject; var Action: TCloseAction);FormShow (Sender: TObject);actSettingsDBExecute (Sender: TObject);actAboutExecute (Sender: TObject);actLogoutExecute (Sender: TObject);actExitExecute (Sender: TObject);actChangeModuleExecute (Sender: TObject);

{ Private declarations }FreeFrames;

{ Public declarations }Initialize: boolean;InitUser (db: TIBDatabase; login, pass: string): boolean;InitFrame: boolean;SelectFrame: boolean;;: TfrMain;uFrmUsers, uSettings, uDM, uLogin, uConnect, uFrmPattern,, uAbout, uConstants, uDBState, uFrmPark, uFrmRequest,;

{$R *. dfm}TfrMain. FormShow (Sender: TObject);Initialize and InitFrameSelectFrameClose;;TfrMain. FormClose (Sender: TObject; var Action: TCloseAction);;;TfrMain. Initialize;: boolean;: = ProductName;: = false;: = false;TfrLogin. Create (nil) do trynot Passed do

// отображение окна авторизацииShowModal = mrCancel then begin: = true;: = false;if dm. DBMain. TestConnectedIsPositiveResult (ConnectTo (dm. DBMain, 'Главная БД')) thenInitUser (dm. DBMain, edtLogin. Text, edtPass. Text) then begin: = true;: = true;;;;;TfrMain. FreeFrames;Assigned (frmPattern) then begin. Finalize;. Free;: = nil;;Assigned (frmUsers) then begin. Finalize;. Free;: = nil;;Assigned (frmPark) then begin. Finalize;. Free;: = nil;;Assigned (frmRequest) then begin. Finalize;. Free;: = nil;;Assigned (frmStore) then begin. Finalize;. Free;: = nil;;;TfrMain. InitUser (db: TIBDatabase; login, pass: string): boolean;: = false;db. TestConnected then tryDM. qRead do beginActive then Close;. Text: = 'select * from USERS where UPPER (LOGIN) =: LOGIN';('LOGIN'). AsString: = AnsiUpperCase (Login);;EOFMessageDlg ('База данных: ' + db. DatabaseName + #13 + 'Пользователь не найден: ' + Login, mtError, [mbOK], 0)trim (FieldByName ('PASS'). AsString) = trim (Pass) then begindm. User do begin: = FieldByName ('UID'). AsInteger;: = FieldByName ('LOGIN'). AsString;: = FieldByName ('NAME'). AsString;: = FieldByName ('RULES'). AsString;;;: = true;MessageDlg ('База данных: ' + db. DatabaseName + #13 + 'Неверный пароль: ' + Pass, mtError, [mbOK], 0);;: = false;;;TfrMain. InitFrame: boolean;: = true;;

// Инициализация фреймов для данного пользователя. listFrames. Clear;DM. User do begin( (pos ('c', Rules) > 0) or (pos ('a', Rules) > 0)) then begin: = TfrmPark. Create (nil);. Parent: = self;. listFrames. AddItem (frmPark. ModuleName, frmPark);;( (pos ('e', Rules) > 0) or (pos ('a', Rules) > 0)) then begin: = TfrmRequest. Create (nil);. Parent: = self;. listFrames. AddItem (frmRequest. ModuleName, frmRequest);;( (pos ('s', Rules) > 0) or (pos ('a', Rules) > 0)) then begin: = TfrmStore. Create (nil);. Parent: = self;. listFrames. AddItem (frmStore. ModuleName, frmStore);;pos ('a', Rules) > 0 then begin: = TfrmUsers. Create (nil);. Parent: = self;. listFrames. AddItem (frmUsers. ModuleName, frmUsers);;

{else begin: = false;

MessageDlg ('Ваша учетная запись не имеет прав в системе ' + ProductName + #13 + 'Обратитесь к администратору. ', mtError, [mbOK], 0); };e: exception do begin: = false;(e. Message, mtError, [mbOK], 0);;;;TfrMain. SelectFrame: boolean;: = true;

// Скрытие всех фреймовAssigned (frmUsers) then frmUsers. Visible: = false;Assigned (frmPark) then frmPark. Visible: = false;Assigned (frmRequest) then frmRequest. Visible: = false;Assigned (frmStore) then frmStore. Visible: = false;frSelectFrame do begin

// если инициализирован хотя бы 1 фрейм,

// установка курсора в списке фреймовlistFrames. Items. Count > 0 then begin. ItemIndex: = 0;. Visible: = false;listFrames. Items. Count > 1 then begin

// если фреймов несколько, показ окна выбора фрейма

btnChangeModul. Visible: = true;isPositiveResult (ShowModal)

then lblMain. Caption: = ''

// если отменили, выход

else begin. Caption: = 'Выберите модуль';: = false;;;;

// отображение выбранного (или единственного) фреймаDM do begin

// Вызывается переопределенный Initialize:

// Если соединение с необходимой БД неактивно, то модуль не отображается.

// Отображение происходит при последующем соединении с БД (повторно вызывается SelectFrame)

if Initialize then begin. Caption: = ProductName + ' - ' + ModuleName + ' - ' + ' [' + User. Name + '] ';: = true;else MessageDlg ('Отсутствует соединение с БД, необходимой '#13'для работы модуля', mtError, [mbOK], 0);;;;;TfrMain. actSettingsDBExecute (Sender: TObject);(TfrDBState. Create (nil)) do try

// Если произошло изменение подлючений БД, присходит закрытие

// модулей и отображение окна выбора модуля

if not IsPositiveResult (ShowModal)SelectFrame;Free;;;TfrMain. actChangeModuleExecute (Sender: TObject);;;TfrMain. actLogoutExecute (Sender: TObject);;;;TfrMain. actAboutExecute (Sender: TObject);TfrAbout. Create (nil) doShowmodalFree;;;TfrMain. actExitExecute (Sender: TObject);;;.

unit uFrmRequest;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, uFrmPattern, PropFilerEh, PropStorageEh, ImgList, ActnList,

ComCtrls, Grids, DBGridEh, ToolWin, ExtCtrls;= class (TfrmPattern): TAction;: TAction;: TAction;: TPanel;: TSplitter;: TDBGridEh;: TPanel;: TToolBar;: TToolButton;: TAction;: TAction;: TAction;: TToolButton;: TToolButton;: TAction;: TPanel;: TPanel;: TToolBar;: TToolButton;: TToolButton;: TToolButton;: TToolButton;: TDBGridEh;: TPanel;: TSplitter;: TPanel;: TToolBar;: TToolButton;: TToolButton;: TToolButton;: TDBGridEh;: TAction;: TAction;: TAction;actNewRequestExecute (Sender: TObject);actEditRequestExecute (Sender: TObject);actDelRequestExecute (Sender: TObject);actNewGoodsExecute (Sender: TObject);actEditGoodsExecute (Sender: TObject);actDelGoodsExecute (Sender: TObject);actFilterRequestExecute (Sender: TObject);actNewCPExecute (Sender: TObject);actEditCPExecute (Sender: TObject);actDelCPExecute (Sender: TObject);

{ Private declarations }

{ Public declarations }Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;: TfrmRequest;uDM, uConnect, uEditRequest, uEditReqGoods, DB, uFilterRequest, uEditRoute;

{$R *. dfm}TfrmRequest. Create (AOwner: TComponent);;: = 'Офис';;TfrmRequest. Initialize: boolean;dm. DBMain. TestConnectedresult: = trueresult: = IsPositiveResult (ConnectTo (dm. dbMain, 'Главная БД'));result then begin. LoadProperties;DM do begin. Open;. FetchAll;. Open;. FetchAll;. Open;. FetchAll;;;;TfrmRequest. Finalize: boolean;. SaveProperties;DM do begintrnWriteMain. InTransaction then. Rollback;qRequest. Active then qCar. Close;qReqGoods. Active then qReqGoods. Close;qRoute. Active then qRoute. Close;;;TfrmRequest. actNewRequestExecute (Sender: TObject);TfrEditRequest. Create (self) do try: = 'Добавить заявку';DM do begin. UpdateTransaction. StartTransaction;qRequest do begin;. SQL. Text: = 'select tID,NAME from request_type';. Open;. FetchAll;. First;. KeyValue: = qRead. FieldByName ('tID'). AsInteger;('COMPLETED'). AsInteger: = 0;isPositiveResult (Showmodal) then beginclientID <> - 1 then FieldByName ('CLIENT'). AsInteger: = clientID;('USER_ADD'). AsInteger: = User. ID;FieldByName ('COMPLETED'). AsInteger = 1 then('USER_CLOSE'). AsInteger: = User. ID;('request_type'). AsInteger: = cbRequestType. KeyValue;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;. Close;;;;Free;;TfrmRequest. actEditRequestExecute (Sender: TObject);complet: integer;not DM. qRequest. IsEmpty thenTfrEditRequest. Create (self) do try: = 'Изменить заявку';DM do begin. UpdateTransaction. StartTransaction;qRequest do begin;. SQL. Text: = 'select tID,NAME from request_type';. Open;. FetchAll;. Text: = FieldByName ('CLIENT_NAME'). AsString;not FieldByName ('CLIENT'). IsNull then: = FieldByName ('CLIENT'). AsInteger;: = FieldByName ('COMPLETED'). AsInteger;isPositiveResult (Showmodal) then beginclientID <> - 1 then FieldByName ('CLIENT'). AsInteger: = clientID;FieldByName ('COMPLETED'). AsInteger <> complet then('USER_CLOSE'). AsInteger: = User. ID;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;. Close;;;;Free;;TfrmRequest. actDelRequestExecute (Sender: TObject);DM do if not qRequest. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;TfrmRequest. actNewGoodsExecute (Sender: TObject);DM do beginnot qRequest. IsEmpty thenTfrEditReqGoods. Create (self) do try: = 'Добавить детализацию';. UpdateTransaction. StartTransaction;qReqGoods do begin;('CNT'). AsInteger: = 1;('WEIGHT'). AsInteger: = 0;isPositiveResult (Showmodal) then begin('REQUEST'). AsInteger: = qRequest. FieldByName ('rID'). AsInteger;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;Free;;;TfrmRequest. actEditGoodsExecute (Sender: TObject);DM do beginnot qReqGoods. IsEmpty thenTfrEditReqGoods. Create (self) do try: = 'Изменить детализацию';. UpdateTransaction. StartTransaction;qReqGoods do begin;isPositiveResult (Showmodal) then begin;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;Free;;;TfrmRequest. actDelGoodsExecute (Sender: TObject);DM do if not qReqGoods. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;TfrmRequest. actNewCPExecute (Sender: TObject);DM do beginnot qRequest. IsEmpty thenTfrEditRoute. Create (self) do try: = 'Добавить пункт маршрута';. UpdateTransaction. StartTransaction;qRoute do begin;. Checked: = false;isPositiveResult (Showmodal) then begincbPassed. Checked then begin('PASSED'). AsInteger: = 1;VarType (edtDate_pass. Value) <> varNull then('DATE_PASS'). AsDateTime: = edtDate_pass. Value;FieldByName ('PASSED'). AsInteger: = 0;('REQUEST'). AsInteger: = qRequest. FieldByName ('rID'). AsInteger;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;;TfrmRequest. actEditCPExecute (Sender: TObject);DM do beginnot qRoute. IsEmpty thenTfrEditRoute. Create (self) do try: = 'Изменить пункт маршрута';. UpdateTransaction. StartTransaction;qRoute do begin;FieldByName ('PASSED'). AsInteger = 1cbPassed. Checked: = truecbPassed. Checked: = false;not FieldByName ('DATE_PASS'). IsNull then_pass. Value: = FieldByName ('DATE_PASS'). AsVariant;isPositiveResult (Showmodal) then begincbPassed. Checked then begin('PASSED'). AsInteger: = 1;VarType (edtDate_pass. Value) <> varNull then('DATE_PASS'). AsDateTime: = edtDate_pass. Value;FieldByName ('PASSED'). AsInteger: = 0;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;;TfrmRequest. actDelCPExecute (Sender: TObject);DM do if not qRoute. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;TfrmRequest. actFilterRequestExecute (Sender: TObject);DM do

// with TfrFilterRequest. Create (self) do tryfrFilterRequest do beginisPositiveResult (Showmodal) then begin. Close;. SQL. LoadFromFile (ExtractFilePath (Application. ExeName) + '\Res\Request. Select. sql');. SQL. Add (FilterSQL);. SQL. Add (' order by rID ');. Open;. FetchAll;. Open;. FetchAll;else begin;;;.

unit uDM;

interface, SysUtils, Classes, DB, IBCustomDataSet, IBQuery, IBDatabase, IBUpdateSQL,, PropStorageEh, PropFilerEh, IniFiles, Dialogs;= record: integer;: string;: string;: string;;= class (TDataModule): TIBDatabase;: TIBTransaction;: TIBTransaction;: TIBQuery;: TIBQuery;: TDataSource;: TIBUpdateSQLW;: TIBQuery;: TIntegerField;: TIBStringField;: TIBStringField;: TIBStringField;: TIBStringField;: TDataSource;: TIniPropStorageManEh;: TIBDatabase;: TIBTransaction;: TIBTransaction;: TIBTransaction;: TIBTransaction;: TIBDatabase;: TDataSource;: TIBQuery;: TIntegerField;: TIBStringField;: TFloatField;_CNT: TIntegerField;: TIntegerField;: TIBUpdateSQLW;: TIBQuery;: TIBUpdateSQLW;: TDataSource;: TIBQuery;: TDataSource;: TIntegerField;: TIBStringField;: TIBStringField;: TIntegerField;: TIBQuery;: TIntegerField;: TIBStringField;: TIBStringField;: TIntegerField;: TIntegerField;: TIBStringField;: TIBQuery;: TDataSource;: TIBUpdateSQLW;: TIBQuery;: TDataSource;: TIBUpdateSQLW;: TIntegerField;: TIBStringField;_TYPE: TIntegerField;_ADD: TIntegerField;_CLOSE: TIntegerField;_TYPE_NAME: TIBStringField;: TIntegerField;: TIntegerField;: TIBQuery;: TDataSource;: TIBUpdateSQLW;: TIntegerField;_NAME: TIBStringField;: TIntegerField;: TIntegerField;_NUM: TIBStringField;: TIBStringField;: TFloatField;: TIntegerField;_NAME: TIBStringField;_NAME: TIBStringField;: TIntegerField;_OLD: TIntegerField;: TIntegerField;: TIntegerField;: TIntegerField;: TIBUpdateSQLW;: TDataSource;: TIntegerField;: TIntegerField;_NUM: TIBStringField;: TIBStringField;: TIntegerField;: TIBStringField;: TFloatField;: TIBQuery;: TIntegerField;: TIBStringField;_PASS: TDateTimeField;: TIntegerField;: TIntegerField;DBMainAfterConnect (Sender: TObject);DBMainBeforeDisconnect (Sender: TObject);DataModuleCreate (Sender: TObject);DataModuleDestroy (Sender: TObject);DBParkAfterConnect (Sender: TObject);dbParkBeforeDisconnect (Sender: TObject);qCarDriverAfterOpen (DataSet: TDataSet);DBStoreAfterConnect (Sender: TObject);DBStoreBeforeDisconnect (Sender: TObject);

{ Private declarations }: integer;LoadINIDB (filename: string);SaveINIDB (filename: string);LoadINISQL;SaveINISQL (filename: string);

{ Public declarations }: TUser;: string;;: TDM;

{$R *. dfm}uConstants;TDM. SaveINIDB (filename: string);TIniFile. Create (filename) do try(iniDBMainSection, 'DBName', DBMain. DatabaseName);(iniDBMainSection, 'Param0', DBMain. Params. Strings [0]);(iniDBMainSection, 'Param1', DBMain. Params. Strings [1]);(iniDBParkSection, 'DBName', DBPark. DatabaseName);(iniDBParkSection, 'Param0', DBPark. Params. Strings [0]);(iniDBParkSection, 'Param1', DBPark. Params. Strings [1]);(iniDBStoreSection, 'DBName', DBStore. DatabaseName);(iniDBStoreSection, 'Param0', DBStore. Params. Strings [0]);(iniDBStoreSection, 'Param1', DBStore. Params. Strings [1]);;;e: Exception do MessageDlg ('Ошибка ini-файла: ' + e. Message, mtError, [mbOK], 0);;TDM. LoadINIDB (filename: string);TIniFile. Create (filename) do try. DatabaseName: = ReadString (iniDBMainSection, 'DBName', '');. Params. Strings [0]: = ReadString (iniDBMainSection, 'Param0', '');. Params. Strings [1]: = ReadString (iniDBMainSection, 'Param1', '');. DatabaseName: = ReadString (iniDBParkSection, 'DBName', '');. Params. Strings [0]: = ReadString (iniDBParkSection, 'Param0', '');. Params. Strings [1]: = ReadString (iniDBParkSection, 'Param1', '');. DatabaseName: = ReadString (iniDBStoreSection, 'DBName', '');. Params. Strings [0]: = ReadString (iniDBStoreSection, 'Param0', '');. Params. Strings [1]: = ReadString (iniDBStoreSection, 'Param1', '');;e: Exception do MessageDlg ('Ошибка ini-файла: ' + e. Message, mtError, [mbOK], 0);;TDM. SaveINISQL (filename: string);TIniFile. Create (filename) do try;e: Exception do MessageDlg ('Ошибка ini-файла: ' + e. Message, mtError, [mbOK], 0);;TDM. LoadINISQL;AppFolder: string;: = ExtractFilePath (Application. ExeName);. SQL. LoadFromFile (AppFolder + '\Res\Request. Select. sql');. SQL. Add ('order by rID');. RefreshSQL. LoadFromFile (AppFolder + '\Res\Request. Refresh. sql');. SQL. LoadFromFile (AppFolder + '\Res\ReqGoods. Select. sql');. RefreshSQL. LoadFromFile (AppFolder + '\Res\ReqGoods. Refresh. sql');. SQL. LoadFromFile (AppFolder + '\Res\Car. Select. sql');. RefreshSQL. LoadFromFile (AppFolder + '\Res\Car. Refresh. sql');. SQL. LoadFromFile (AppFolder + '\Res\CarDriver. Select. sql');. SQL. LoadFromFile (AppFolder + '\Res\Driver. Select. sql');. RefreshSQL. LoadFromFile (AppFolder + '\Res\Driver. Refresh. sql');. SQL. LoadFromFile (AppFolder + '\Res\StoreGoods. Select. sql');. SQL. Add ('order by gID');. RefreshSQL. LoadFromFile (AppFolder + '\Res\StoreGoods. Refresh. sql');;TDM. DBMainAfterConnect (Sender: TObject);. StartTransaction;;TDM. DBMainBeforeDisconnect (Sender: TObject);trnReadMain. InTransaction then trnReadMain.commit;trnWriteMain. InTransaction then trnWriteMain. Rollback;;TDM. DataModuleCreate (Sender: TObject);. IniFileName: = ExtractFilePath (Application. ExeName) + iniControls;(ExtractFilePath (Application. ExeName) + iniDB);;;TDM. DataModuleDestroy (Sender: TObject);(ExtractFilePath (Application. ExeName) + iniDB);;TDM. DBParkAfterConnect (Sender: TObject);. StartTransaction;;TDM. dbParkBeforeDisconnect (Sender: TObject);trnReadPark. InTransaction then trnReadPark.commit;trnWritePark. InTransaction then trnWritePark. Rollback;;TDM. qCarDriverAfterOpen (DataSet: TDataSet);. FetchAll;;TDM. DBStoreAfterConnect (Sender: TObject);. StartTransaction;;TDM. DBStoreBeforeDisconnect (Sender: TObject);trnReadStore. InTransaction then trnReadStore.commit;trnWriteStore. InTransaction then trnWriteStore. Rollback;;.

unit uFrmPark;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, uFrmPattern, ImgList, ActnList, ComCtrls, DB, IBCustomDataSet,, IBUpdateSQLW, IBQuery, Grids, DBGridEh, ToolWin,, PropStorageEh, ExtCtrls, uFrmDrivers, StdCtrls, DBCtrls;= class (TfrmPattern): TAction;: TPageControl;: TTabSheet;: TToolBar;: TToolButton;: TDBGridEh;: TToolButton;: TAction;: TAction;: TToolButton;: TPanel;: TAction;: TAction;: TTabSheet;: TDBGridEh;: TSplitter;: TToolBar;: TToolButton;: TToolButton;: TPanel;: TPanel;: TSplitter;: TAction;: TPanel;: TPanel;: TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TButton;actNewCarExecute (Sender: TObject);actEditCarExecute (Sender: TObject);actDelCarExecute (Sender: TObject);actRemoveDriverExecute (Sender: TObject);actAssignDriverExecute (Sender: TObject);tabDriversShow (Sender: TObject);actUpdateReqStateExecute (Sender: TObject);

{ Private declarations }

{ Public declarations }Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;: TfrmPark;: TfrmDrivers;uDM, uConnect, uEditCar, uAssignDriver;

{$R *. dfm}TfrmPark. Create (AOwner: TComponent);;: = 'Автопарк';;CarAfterScroll;frmPark do begin. Caption: = dm. qCar. fieldByName ('cID'). AsString;. Caption: = '';. Caption: = '';. Caption: = '';. Caption: = '';;;TfrmPark. Initialize: boolean;dm. DBPark. TestConnectedresult: = trueresult: = IsPositiveResult (ConnectTo (dm. dbPark, 'БД Автопарк'));result then begin

@dm. qCar. AfterScroll: = @CarAfterScroll;: = TfrmDrivers. Create (nil);. Parent: = tabDrivers;. Visible: = true;: = frmDrivers. Initialize;result then begin. LoadProperties;DM do begin. Open;. FetchAll;. Open;. FetchAll;;;;;TfrmPark. Finalize: boolean;. SaveProperties;DM do begintrnWritePark. InTransaction then. Rollback;qCar. Active then qCar. Close;qCarDriver. Active then qCarDriver. Close;qDriver. Active then qDriver. Close;;Assigned (frmDrivers) then begin. Finalize;. Free;: = nil;;;TfrmPark. actNewCarExecute (Sender: TObject);TfrEditCar. Create (self) do try: = 'Добавить автомашину';DM do begin. UpdateTransaction. StartTransaction;qCar do begin;. Text: = '0';_cnt. Text: = '0';isPositiveResult (Showmodal) then begin;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;TfrmPark. actEditCarExecute (Sender: TObject);not dm. qCar. IsEmpty thenTfrEditCar. Create (self) do try: = 'Изменить автомашину';DM do begin. UpdateTransaction. StartTransaction;qCar do begin;isPositiveResult (Showmodal) then begin;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;TfrmPark. actRemoveDriverExecute (Sender: TObject);DM do if not qCarDriver. IsEmpty then begin. Transaction. StartTransaction;qWritepark do begin. Text: = 'update driver set driver. CAR = NULL where dID =: dID';('dID'). AsInteger: = qCarDriver. FieldByName ('dID'). AsInteger;;;. Transaction.commit;. Close;. Open;;;TfrmPark. actAssignDriverExecute (Sender: TObject);TfrAssignDriver. Create (self) do tryDM do beginqCar do beginisPositiveResult (Showmodal) and (dID <> 0) then begin. Transaction. StartTransaction;qWritePark do begin. Text: = 'update driver set driver. CAR =: CAR where DID =: DID';('dID'). AsInteger: = dID;('CAR'). AsInteger: = qCar. FieldByName ('cID'). AsInteger;;;. Transaction.commit;. Close;. Open;;;;Free;;TfrmPark. actDelCarExecute (Sender: TObject);DM do if not qCar. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;TfrmPark. tabDriversShow (Sender: TObject);DM do begin. Close;. Open;;;TfrmPark. actUpdateReqStateExecute (Sender: TObject);dm. DBMain. TestConnected or IsPositiveResult (ConnectTo (dm. dbMain, 'Главная БД'))DM. qRead do begin. LoadFromFile (ExtractFilePath (Application. ExeName) + '\Res\Car. Request. sql');('RID'). AsInteger: = dm. qCar. FieldByName ('request'). AsInteger;;. Caption: = dm. qCar. FieldByName ('CID'). AsString;. Caption: = FieldByName ('rID'). AsString;. Caption: = FieldByName ('client_name'). AsString;. Caption: = FieldByName ('request_type_name'). AsString;not FieldByName ('completed'). IsNull thenFieldByName ('completed'). AsInteger = 0txReqCompleted. Caption: = 'Не выполнена'txReqCompleted. Caption: = 'Выполнена';;

endMessageDlg ('Отсутствует соединение с БД, необходимой '#13'для работы модуля', mtError, [mbOK], 0);

end;.

unit uFrmUsers;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, uFrmPattern, ImgList, ActnList, ComCtrls, StdCtrls, ExtCtrls,, DBGridEh, ToolWin, PropFilerEh, PropStorageEh, DB, DBGrids;= class (TfrmPattern): TDBGridEh;: TPanel;: TLabel;: TLabel;: TToolBar;: TToolButton;: TToolButton;: TToolButton;: TAction;: TAction;: TAction;: TAction;: TAction;: TLabel;: TLabel;: TLabel;: TPanel;: TDataSource;actNewUserExecute (Sender: TObject);actEditUserExecute (Sender: TObject);actDelUserExecute (Sender: TObject);actSaveUserExecute (Sender: TObject);actCancelUserExecute (Sender: TObject);

{ Private declarations }

{ Public declarations }

{ModuleName: string;: integer; }Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;: TFrmUsers;uDM, uSettings, uConstants, uConnect, uEditUsers;

{$R *. dfm}TFrmUsers. Create (AOwner: TComponent);;: = 'Пользователи';;TFrmUsers. Initialize: boolean;dm. DBMain. TestConnectedresult: = trueresult: = IsPositiveResult (ConnectTo (dm. DBMain, 'Главная БД'));result then begin. LoadProperties;DM do begin. Open;. FetchAll;;;;TFrmUsers. Finalize: boolean;. SaveProperties;DM do begintrnWriteMain. InTransaction then. Rollback;qUsers. Active then qUsers. Close;;;TFrmUsers. actNewUserExecute (Sender: TObject);uID: integer;DM doTfrEditUsers. Create (self) do try: = 'Добавить пользователя';isPositiveResult (Showmodal) then begin. StartTransaction;qWrite do begin. Text: = 'select * from users_insert (: pass,: rules,: name,: login) ';('name'). AsString: = edtName. Text;('rules'). AsString: = edtRules. Text;('pass'). AsString: = edtPass. Text;('login'). AsString: = edtLogin. Text;;: = FieldByName ('uID'). AsInteger;;;.commit;qUsers do begin;;;('uID',uID, []);;;;Free;;TFrmUsers. actEditUserExecute (Sender: TObject);uID: integer;DM doTfrEditUsers. Create (self) do try: = 'Изменить пользователя';qUsers do begin. Text: = FieldByName ('name'). AsString;. Text: = FieldByName ('rules'). AsString;. Text: = FieldByName ('pass'). AsString;. Text: = FieldByName ('login'). AsString;AnsiUpperCase (FieldByName ('login'). AsString) = 'ADMIN'begin. Enabled: = false;. Enabled: = false;;;isPositiveResult (Showmodal) then begin. StartTransaction;qWrite do begin. Text: = 'execute procedure users_update (: rules,: pass,: name,: uid,: login) ';('uid'). AsInteger: = qUsers. FieldByName ('uID'). AsInteger;('name'). AsString: = edtName. Text;('rules'). AsString: = edtRules. Text;('pass'). AsString: = edtPass. Text;('login'). AsString: = edtLogin. Text;;;.commit;qUsers do begin: = FieldByName ('uID'). AsInteger;;;;('uID',uID, []);;;;Free;;TFrmUsers. actDelUserExecute (Sender: TObject);uID: integer;DM do if not qUsers. IsEmpty then beginAnsiUpperCase (qUsers. FieldByName ('login'). AsString) <> 'ADMIN' then begin. StartTransaction;qWrite do begin. Text: = 'execute procedure users_delete (: uid) ';('uid'). AsInteger: = qUsers. FieldByName ('uID'). AsInteger;;;.commit;qUsers do begin: = FieldByName ('uID'). AsInteger;;;;('uID',uID, []);

EnableControls;;else MessageDlg ('Невозможно удалить запись администратора! ', mtError, [mbOK], 0);;;TFrmUsers. actSaveUserExecute (Sender: TObject);fID: integer;DM doqUsers dotrnWriteMain. InTransaction then beginModified then qUsers. Post;: = FieldByName ('uID'). AsInteger;.commit;;;;('uID',fID, []);;;;TFrmUsers. actCancelUserExecute (Sender: TObject);fID: integer;DM doqUsers dotrnWriteMain. InTransaction then beginModified then CancelUpdates;: = FieldByName ('uID'). AsInteger;. Rollback;;;;('uID',fID, []);;;;.

unit uSettings;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, PropFilerEh, PropStorageEh, ExtCtrls, iniFiles;= class (TForm): TGroupBox;: TComboBox;: TLabel;: TLabel;: TEdit;: TLabel;: TEdit;: TEdit;: TLabel;: TPanel;: TButton;: TButton;: TButton;: TOpenDialog;FormShow (Sender: TObject);cmdConnectionChange (Sender: TObject);btnLocateDbClick (Sender: TObject);FormCloseQuery (Sender: TObject; var CanClose: Boolean);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }: string;

{ Public declarations }: string;, iniSection: string;SaveINI (filename, section: string);LoadINI (filename, section: string);;: TfrSettings;uDM;

{$R *. dfm}isInt (str: string): boolean;: = true;(str);E: EConvertError do result: = false;;;TfrSettings. SaveINI (filename, section: string);TIniFile. Create (filename) do try(section, 'cmdConnectionIndex', cmdConnection. ItemIndex);(section, 'labelIPVisible', labelIP. Visible);(section, 'labelPortVisible', labelPort. Visible);(section, 'edtIPVisible', edtIP. Visible);(section, 'edtPortVisible', edtPort. Visible);(section, 'edtIP', edtIP. Text);(section, 'edtPort', edtPort. Text);(section, 'edtDB', edtDB. Text);;;e: Exception do MessageDlg ('Ошибка ini-файла: ' + e. Message, mtError, [mbOK], 0);;TfrSettings. LoadINI (filename, section: string);TIniFile. Create (filename) do try. ItemIndex: = ReadInteger (section, 'cmdConnectionIndex', 0);. Visible: = ReadBool (section, 'edtIPVisible', true);. Visible: = ReadBool (section, 'edtPortVisible', true);. Visible: = ReadBool (section, 'edtIPVisible', true);. Visible: = ReadBool (section, 'edtPortVisible', true);. Text: = ReadString (section, 'edtIP', '');. Text: = ReadString (section, 'edtPort', '');. Text: = ReadString (section, 'edtDB', '');;e: Exception do MessageDlg ('Ошибка ini-файла: ' + e. Message, mtError, [mbOK], 0);;TfrSettings. FormShow (Sender: TObject);

begin

// к этому моменту должны быть заданы iniFilename, iniSection

LoadINI (iniFilename, iniSection);cmdConnection. ItemIndex = 0ConnectionString: = edtDB. Text // Локальное подключениеConnectionString: = edtIP. Text + '/ ' + edtPort. Text + ': ' + edtDB. Text; // Удаленное: = ConnectionString;;TfrSettings. cmdConnectionChange (Sender: TObject);(sender as TComboBox). ItemIndex = 0 then begin. Visible: = false;. Visible: = false;. Visible: = false;. Visible: = false;: = edtDB. Text;. Visible: = true;begin. Visible: = true;. Visible: = true;. Visible: = true;. Visible: = true;. Visible: = false;: = edtIP. Text + '/ ' + edtPort. Text + ': ' + edtDB. Text;;;TfrSettings. btnLocateDbClick (Sender: TObject);dlgLocateDb. Execute and (dlgLocateDb. FileName <> '') then. Text: = dlgLocateDb. FileName;;TfrSettings. FormCloseQuery (Sender: TObject;CanClose: Boolean);ModalResult = mrOK then begin: = false;(cmdConnection. ItemIndex = 1) and (length (edtIP. Text) = 0)MessageDlg ('Ошибка ввода'#13'Поле "IP-адрес сервера" не может быть пустым', mtError, [mbOK], 0)(cmdConnection. ItemIndex = 1) and (length (edtPort. Text) = 0)MessageDlg ('Ошибка ввода'#13'Поле "Порт" не может быть пустым', mtError, [mbOK], 0)length (edtDB. Text) = 0MessageDlg ('Ошибка ввода'#13'Поле "Путь к файлу БД" не может быть пустым', mtError, [mbOK], 0)begin. InitialDir: = ExtractFilePath (dlgLocateDb. FileName);(iniFilename, iniSection);cmdConnection. ItemIndex = 0ConnectionString: = edtDB. TextConnectionString: = edtIP. Text + '/ ' + edtPort. Text + ': ' + edtDB. Text;: = true;;;;TfrSettings. FormClose (Sender: TObject; var Action: TCloseAction);ConnectionString = ConnectionStringLastModalResult: = mrCancel;;.

unit uDBState;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, IBDAtabase;= class (TForm): TPanel;: TButton;: TGroupBox;: TLabel;: TButton;: TButton;: TButton;: TLabel;: TGroupBox;

Label2: TLabel;: TLabel;: TButton;

btnConnectDBPark: TButton;: TButton;: TGroupBox;: TLabel;: TButton;: TButton;: TButton;: TLabel;btnDBMainClick (Sender: TObject);FormShow (Sender: TObject);btnDBParkClick (Sender: TObject);btnDBStoreClick (Sender: TObject);btnConnectDBMainClick (Sender: TObject);btnConnectDBParkClick (Sender: TObject);btnConnectDBStoreClick (Sender: TObject);btnDct1Click (Sender: TObject);btnDct2Click (Sender: TObject);btnDct3Click (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }: boolean;TestConnected;TryConnect (DB: TIBDatabase; FormCaption: string);

{ Public declarations };: TfrDBState;uDM, uSettings, uConstants, UConnect;

{$R *. dfm}TfrDBState. TryConnect (DB: TIBDatabase; FormCaption: string);(DB, FormCaption);;: = true;;TfrDBState. TestConnected;DM do beginDBMain. TestConnected then begin. Font. Color: = clGreen;. Caption: = 'Активно';else begin. Font. Color: = clRed;. Caption: = 'Неактивно';;DBPark. TestConnected then begin. Font. Color: = clGreen;. Caption: = 'Активно';else begin. Font. Color: = clRed;. Caption: = 'Неактивно';;DBStore. TestConnected then begin. Font. Color: = clGreen;. Caption: = 'Активно';else begin. Font. Color: = clRed;. Caption: = 'Неактивно';;;;TfrDBState. FormShow (Sender: TObject);;: = false;;TfrDBState. btnDBMainClick (Sender: TObject);cs: string;(TfrSettings. Create (nil)) do try: = ExtractFilePath (Application. ExeName) + iniDB;: = iniDBMainSection;isPositiveResult (ShowModal) then begindm. DBMain. TestConnected then begin. DBMain. Close;;;. DBMain. DatabaseName: = ConnectionString;;Free;;;TfrDBState. btnDBParkClick (Sender: TObject);(TfrSettings. Create (nil)) do try: = ExtractFilePath (Application. ExeName) + iniDB;: = iniDBParkSection;isPositiveResult (ShowModal) then begindm. DBPark. TestConnected then begin. DBPark. Close;;;. DBPark. DatabaseName: = ConnectionString;;Free;;;TfrDBState. btnDBStoreClick (Sender: TObject);(TfrSettings. Create (nil)) do try: = ExtractFilePath (Application. ExeName) + iniDB;: = iniDBStoreSection;isPositiveResult (ShowModal) then begindm. DBStore. TestConnected then begin. DBStore. Close;;;. DBStore. DatabaseName: = ConnectionString;;Free;;;TfrDBState. btnConnectDBMainClick (Sender: TObject);(dm. DBMain, 'Главная БД');;TfrDBState. btnConnectDBParkClick (Sender: TObject);(dm. DBPark, 'БД Автопарк');;TfrDBState. btnConnectDBStoreClick (Sender: TObject);(dm. DBStore, 'БД Склад');;TfrDBState. btnDct1Click (Sender: TObject);dm. DBMain. TestConnected then begin. DBMain. Connected: = false;;: = true;;;TfrDBState. btnDct2Click (Sender: TObject);dm. DBPark. TestConnected then begin. DBPark. Connected: = false;;: = true;;;TfrDBState. btnDct3Click (Sender: TObject);dm. DBStore. TestConnected then begin. DBStore. Connected: = false;;: = true;;;TfrDBState. FormClose (Sender: TObject; var Action: TCloseAction);modified then ModalResult: = mrCancel else ModalResult: = mrOk;;.

unit uFrmStore;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, uFrmPattern, PropFilerEh, PropStorageEh, ImgList, ActnList,

ComCtrls, Grids, DBGridEh, ExtCtrls, ToolWin;= class (TfrmPattern): TDBGridEh;: TToolBar;: TToolButton;: TAction;: TAction;: TAction;: TPanel;: TToolButton;: TToolButton;: TAction;: TToolButton;actNewGoodsExecute (Sender: TObject);actDelGoodsExecute (Sender: TObject);actEditGoodsExecute (Sender: TObject);actFilterGoodsExecute (Sender: TObject);

{ Private declarations }

{ Public declarations }Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;: TfrmStore;uDM, uConnect, uEditStoreGoods, uFilterStoreGoods;

{$R *. dfm}TfrmStore. Create (AOwner: TComponent);;: = 'Склад';;TfrmStore. Initialize: boolean;dm. DBStore. TestConnectedresult: = trueresult: = IsPositiveResult (ConnectTo (dm. DBStore, 'БД Склад'));result then begin. LoadProperties;DM do begin. Open;. FetchAll;;;;TfrmStore. Finalize: boolean;. SaveProperties;DM do begintrnWriteStore. InTransaction then. Rollback;qStoreGoods. Active then qStoreGoods. Close;;;TfrmStore. actNewGoodsExecute (Sender: TObject);TfrEditStoreGoods. Create (self) do try: = 'Добавить товар';DM do begin. UpdateTransaction. StartTransaction;qStoreGoods do begin;('IS_OLD'). AsInteger: = 0;('CNT'). AsInteger: = 1;isPositiveResult (Showmodal) then beginclientID <> - 1 then FieldByName ('CLIENT'). AsInteger: = clientID;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;;Free;;TfrmStore. actEditGoodsExecute (Sender: TObject);not dm. qStoreGoods. IsEmpty thenTfrEditStoreGoods. Create (self) do try: = 'Добавить товар';DM do begin. UpdateTransaction. StartTransaction;qStoreGoods do begin;. Text: = FieldByName ('CLIENT_NAME'). AsString;not FieldByName ('CLIENT'). IsNull then: = FieldByName ('CLIENT'). AsInteger;isPositiveResult (Showmodal) then beginclientID <> - 1 then FieldByName ('CLIENT'). AsInteger: = clientID;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;;Free;;TfrmStore. actFilterGoodsExecute (Sender: TObject);DM doftFilterStoreGoods do beginisPositiveResult (Showmodal) then begin. Close;. SQL. LoadFromFile (ExtractFilePath (Application. ExeName) + '\Res\StoreGoods. Select. sql');. SQL. Add (FilterSQL);. SQL. Add (' order by gID ');. Open;. FetchAll;else begin;;;TfrmStore. actDelGoodsExecute (Sender: TObject);DM do if not qStoreGoods. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;.

unit uFrmClient;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, uFrmPattern, PropFilerEh, PropStorageEh, ImgList, ActnList,, IBCustomDataSet, IBUpdateSQL, IBUpdateSQLW, DB, IBQuery, Grids,

DBGridEh, IBDatabase, ActnMan, ActnColorMaps, ToolWin, ExtCtrls;= class (TfrmPattern): TDBGridEh;: TDataSource;: TIBQuery;: TIBUpdateSQLW;: TIBStringField;: TIBStringField;: TToolBar;: TToolButton;: TIBTransaction;: TAction;: TAction;: TAction;: TIntegerField;: TToolButton;: TToolButton;: TPanel;actNewClientExecute (Sender: TObject);ectEditClientExecute (Sender: TObject);actDelClientExecute (Sender: TObject);

{ Private declarations }: TIBDatabase;Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;uDM, uConnect, uEditClient;

{$R *. dfm}TfrmClient. Create (AOwner: TComponent);;: = 'Склад';;TfrmClient. Initialize: boolean;

// К этому моменту свойство DB должно быть заданоDB. TestConnectedresult: = trueresult: = IsPositiveResult (ConnectTo (DB, 'База данных'));result then begin. LoadProperties;DM do begin. DefaultDatabase: = DB; // Пишущая транзакция. Transaction: = DB. DefaultTransaction; // Читающая транзакция. Database: = DB;. Open;. FetchAll;;;;TfrmClient. Finalize: boolean;. SaveProperties;DM do begintrnWriteClient. InTransaction then. Rollback;qClient. Active then qClient. Close;;;TfrmClient. actNewClientExecute (Sender: TObject);TfrEditClient. Create (self) do try: = 'Добавить клиента';. UpdateTransaction. StartTransaction;qClient do begin;. Text: = '';. Text: = '';isPositiveResult (Showmodal) then begin('NAME'). AsString: = edtName. Text;('DETAIL'). AsString: = edtDetail. Text;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;Free;;TfrmClient. ectEditClientExecute (Sender: TObject);not qClient. IsEmpty thenTfrEditClient. Create (self) do try: = 'Изменить клиента';. UpdateTransaction. StartTransaction;qClient do begin;. Text: = FieldByName ('NAME'). AsString;. Text: = FieldByName ('DETAIL'). AsString;isPositiveResult (Showmodal) then begin('NAME'). AsString: = edtName. Text;('DETAIL'). AsString: = edtDetail. Text;;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;Free;;TfrmClient. actDelClientExecute (Sender: TObject);not qClient. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;.

unit uFrmDrivers;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, uFrmPattern, PropFilerEh, PropStorageEh, ImgList, ActnList,

ComCtrls, Grids, DBGridEh, ToolWin, ExtCtrls;= class (TfrmPattern): TToolBar;: TToolButton;: TToolButton;: TToolButton;: TDBGridEh;: TAction;: TAction;: TAction;: TPanel;actNewDriverExecute (Sender: TObject);actEditDriverExecute (Sender: TObject);actDelDriverExecute (Sender: TObject);

{ Private declarations }

{ Public declarations }Create (AOwner: TComponent); override;Initialize: boolean; override;Finalize: boolean; override;;uDM, uEditDriver;

{$R *. dfm}TfrmDrivers. Create (AOwner: TComponent);;: = 'Водители';;TfrmDrivers. Initialize: boolean;dm. DBPark. TestConnected then begin. LoadProperties;DM do beginqDriver. Active then qDriver. Close;. Open;. FetchAll;;: = trueresult: = false;;TfrmDrivers. Finalize: boolean;. SaveProperties;;TfrmDrivers. actNewDriverExecute (Sender: TObject);TfrEditDriver. Create (self) do try: = 'Добавить водителя';DM do begin. UpdateTransaction. StartTransaction;qDriver do begin;isPositiveResult (Showmodal) then begin;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;TfrmDrivers. actEditDriverExecute (Sender: TObject);not dm. qDriver. IsEmpty thenTfrEditDriver. Create (self) do try: = 'Изменить водителя';DM do begin. UpdateTransaction. StartTransaction;qDriver do begin;isPositiveResult (Showmodal) then begin;. UpdateTransaction.commit;else begin;. UpdateTransaction. Rollback;;;;Free;;TfrmDrivers. actDelDriverExecute (Sender: TObject);DM do if not qDriver. IsEmpty then begin. UpdateTransaction. StartTransaction;. Delete;. UpdateTransaction.commit;;;.

unit uConnect;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, IBDatabase;= 10;= 3;= class (TForm): TButton;: TLabel;: TTimer;: TLabel;TimerTimer (Sender: TObject);FormShow (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }: string;: TIBDatabase;TryConnect: boolean;

{ Public declarations };: TfrConnect;: integer;: boolean;ConnectTo (DB: TIBDatabase; FormCaption: string): integer;

{$R *. dfm}uDM;ConnectTo (DB: TIBDatabase; FormCaption: string): integer;(TfrConnect. Create (nil)) do try: = db;: = FormCaption;: = ShowModal;Free;;;TfrConnect. TryConnect;t: integer;: = false;fDB. Connected then begin. CloseDataSets;. Connected: = false;;. Connected: = true;fDB. TestConnected then: = true;E: Exception do begin. Caption: = 'Ошибка подключения'; // + e. Message;: = false;;;;TfrConnect. TimerTimer (Sender: TObject);. Caption: = '';(i);(i = 0) then beginClosingModalResult: = mrOKbegin. Caption: = 'Подключение. ';

Update;TryConnect then begin

// Подключение успешно, отсчет до закрытия окна. Caption: = 'Подключение установлено';;

btnCancel. ModalResult: = mrOK;. Caption: = 'Закрыть [' + inttostr (WaitClose) +'] ';: = WaitClose;: = true;begin. Caption: = 'Ошибка подключения';;

i: = WaitConnect; // Ошибка подключения, сброс таймера

end;;// i <> 0, отсчетClosingbtnCancel. Caption: = 'Закрыть [' + inttostr (i) + '] 't2. Caption: = 'Повтор через ' + inttostr (i) + ' секунд';;TfrConnect. FormShow (Sender: TObject);: = 1;. ModalResult: = mrCancel;. Caption: = 'Отмена';. Caption: = 'Подключение. ';. Caption: = '';: = false;. Enabled: = true;;TfrConnect. FormClose (Sender: TObject; var Action: TCloseAction);. Enabled: = false;;.

unit uFilterRequest;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, DBCtrls;= class (TForm): TPanel;: TButton;: TButton;: TLabel;: TEdit;: TLabel;: TCheckBox;: TComboBox;FormClose (Sender: TObject; var Action: TCloseAction);FormShow (Sender: TObject);

{ Private declarations }MakeFilter: boolean;

{ Public declarations }: string;;: TfrFilterRequest;uDM;

{$R *. dfm}TfrFilterRequest. MakeFilter: boolean;: = false;: = '';length (edtName. Text) > 0 then: = FilterSQL + ' (UPPER (c. name) LIKE ''%' + AnsiUpperCase (edtName. Text) + '%'') and ';Integer (cbRequestType. Items. Objects [cbRequestType. ItemIndex]) <> 0 then: = FilterSQL + ' (r. request_type = ' + inttostr (Integer (cbRequestType. Items. Objects [cbRequestType. ItemIndex])) + ') and ';not (cbCompleted. State = cbGrayed) thencbCompleted. CheckedFilterSQL: = FilterSQL + ' (r.completed = 1) and 'FilterSQL: = FilterSQL + ' (r.completed = 0) and ';length (FilterSQL) > 0 then begin: = ' where ' + FilterSQL;(FilterSQL, length (FilterSQL) - 4);;;TfrFilterRequest. FormClose (Sender: TObject;Action: TCloseAction);;;TfrFilterRequest. FormShow (Sender: TObject);. SetFocus;cbRequestType. Items. Count = 0 then begin. Clear;. AddItem ('Нет', nil);. ItemIndex: = 0;dm. DBMain. TestConnected thenDM. qRead do begin. Text: = 'select tID,NAME from request_type';;;;not EOF do begin. AddItem (FieldByName ('NAME'). AsString, pointer (FieldByName ('tID'). AsInteger));;;;MessageDlg ('Отсутствует соединение с БД, необходимой '#13'для работы модуля', mtError, [mbOK], 0);;;.

unit uEditStoreGoods;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Mask, DBCtrlsEh, ExtCtrls, DBCtrls;= class (TForm): TPanel;: TButton;: TButton;: TGroupBox;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;: TDBEditEh;: TDBEditEh;: TDBEditEh;: TDBEditEh;: TDBEditEh;: TGroupBox;: TEdit;: TButton;_OLD: TDBCheckBox;: TLabel;: TDBEditEh;: TGroupBox;

Label7: TLabel;: TDBEditEh;: TLabel;

edtShelf: TDBEditEh;btnAssignClientClick (Sender: TObject);FormCreate (Sender: TObject);FormCloseQuery (Sender: TObject; var CanClose: Boolean);

{ Private declarations }

{ Public declarations }: integer;;: TfrEditStoreGoods;uDM, uAssignClient, uConstants;

{$R *. dfm}TfrEditStoreGoods. btnAssignClientClick (Sender: TObject);TfrAssignClient. Create (self) do try: = dm. DBStore;isPositiveResult (Showmodal) then begin: = cID;. Text: = cNAME;;Free;;TfrEditStoreGoods. FormCreate (Sender: TObject);: = - 1;;TfrEditStoreGoods. FormCloseQuery (Sender: TObject;CanClose: Boolean);: = true;(ModalResult = mrOK) then begin(length (edtName. Text) = 0) then begin

MessageDlg ('Поле "Наименование" не может быть пустым! ', mtError, [mbOK], 0);: = false;else(not IsInt (edtCnt. Text)) then begin('Поле "Количество" должно содержать целое числовое значение', mtError, [mbOK], 0);

CanClose: = false;;;;.

unit uFilterStoreGoods;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls;= class (TForm): TPanel;: TButton;: TButton;: TLabel;: TEdit;: TLabel;_OLD: TCheckBox;: TEdit;: TLabel;: TEdit;FormShow (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }MakeFilter: boolean;

{ Public declarations }: string;;: TftFilterStoreGoods;

{$R *. dfm}TftFilterStoreGoods. MakeFilter: boolean;: = false;: = '';length (edtName. Text) > 0 then: = FilterSQL + ' (UPPER (g. name) LIKE ''%' + AnsiUpperCase (edtName. Text) + '%'') and ';length (edtRequest. Text) > 0 then: = FilterSQL + ' (g. request = ' + AnsiUpperCase (edtRequest. Text) + ') and ';length (edtClient. Text) > 0 then: = FilterSQL + ' (UPPER (c. name) LIKE ''%' + AnsiUpperCase (edtClient. Text) + '%'') and ';not (cbIS_OLD. State = cbGrayed) thencbIS_OLD. CheckedFilterSQL: = FilterSQL + ' (g. is_old = 1) and 'FilterSQL: = FilterSQL + ' (g. is_old = 0) and ';length (FilterSQL) > 0 then begin: = ' where ' + FilterSQL;(FilterSQL, length (FilterSQL) - 4);;;TftFilterStoreGoods. FormShow (Sender: TObject);. SetFocus;;TftFilterStoreGoods. FormClose (Sender: TObject;Action: TCloseAction);;;.

unit uAssignClient;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, IBDatabase;= class (TForm): TPanel;: TButton;: TButton;FormShow (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }

{ Public declarations }: TIBDatabase;: integer;: string;;: TfrAssignClient;

{$R *. dfm}ufrmClient, DB;frmClient: TfrmClient;TfrAssignClient. FormShow (Sender: TObject);

begin

// свойство DB должно быть уже задано

cID: = 0;: = TfrmClient. Create (nil);. Parent: = self;. DB: = DB;frmClient. Initializebegin. Visible: = true;. gridClient. SetFocus;

endbegin('Отсутствует соединение с БД, необходимой '#13'для работы модуля', mtError, [mbOK], 0);

Close;;;TfrAssignClient. FormClose (Sender: TObject;Action: TCloseAction);frmClient do if qClient. Active then begin: = qClient. FieldByName ('cID'). AsInteger;: = qClient. FieldByName ('NAME'). AsString;updClient. UpdateTransaction. InTransaction then. UpdateTransaction. Rollback;. Close;;Assigned (frmClient) then begin. Finalize;. Free;: = nil;;;.

unit uEditRoute;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, DBCtrlsEh, StdCtrls, ExtCtrls, Mask, DBCtrls, dateutils;= class (TForm): TLabel;: TDBEditEh;: TPanel;: TButton;: TButton;: TGroupBox;_pass: TDBDateTimeEditEh;: TLabel;: TCheckBox;FormCloseQuery (Sender: TObject; var CanClose: Boolean);FormShow (Sender: TObject);cbPassedClick (Sender: TObject);

{ Private declarations }

{ Public declarations };: TfrEditRoute;

{$R *. dfm}uDM, Math;TfrEditRoute. FormCloseQuery (Sender: TObject;CanClose: Boolean);: = true;(ModalResult = mrOK) then begin(length (edtName. Text) = 0) then begin

MessageDlg ('Поле "Наименование" не может быть пустым! ', mtError, [mbOK], 0);: = false;;;;TfrEditRoute. FormShow (Sender: TObject);_pass. Enabled: = cbPassed. Checked;;TfrEditRoute. cbPassedClick (Sender: TObject);cbPassed. Checked then begin_pass. Enabled: = true;VarType (edtDate_pass. Value) = varNulledtDate_pass. Value: = now;edtDate_pass. Enabled: = false;_pass. Enabled: = cbPassed. Checked;;.

unit uEditCar;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, Mask, DBCtrlsEh, ExtCtrls;= class (TForm): TLabel;: TLabel;: TLabel;: TDBEditEh;: TDBEditEh;_cnt: TDBEditEh;: TPanel;: TButton;: TButton;: TLabel;: TDBEditEh;FormCloseQuery (Sender: TObject; var CanClose: Boolean);

{ Private declarations }

{ Public declarations };: TfrEditCar;uConstants, uDM;

{$R *. dfm}TfrEditCar. FormCloseQuery (Sender: TObject;CanClose: Boolean);: = true;(ModalResult = mrOK) then begin(length (edtName. Text) = 0) then begin('Поле "Наименование" не может быть пустым! ', mtError, [mbOK], 0);: = false;else(not IsInt (edtCargo. Text)) or (not IsInt (edtTrailer_cnt. Text)) then begin('Поля "Вместимость", "Число прицепов"'#13'должны содержать целое числовое значение', mtError, [mbOK], 0);

CanClose: = false;;;;.

unit uLogin;

interface, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Mask, StdCtrls, DB, Grids, DBGrids, PropFilerEh, PropStorageEh,;= class (TForm): TLabel;: TLabel;: TEdit;: TMaskEdit;: TPropStorageEh;: TPanel;: TButton;: TButton;: TButton;FormShow (Sender: TObject);btnSettingsClick (Sender: TObject);FormClose (Sender: TObject; var Action: TCloseAction);

{ Private declarations }

{ Public declarations };: TfrLogin;: string;

{$R *. dfm}uDM, uConnect, uSettings, uConstants, uDBState;TfrLogin. FormShow (Sender: TObject);. SetFocus;. LoadProperties;;TfrLogin. btnSettingsClick (Sender: TObject);(TfrDBState. Create (nil)) do try;Free;;;TfrLogin. FormClose (Sender: TObject; var Action: TCloseAction);. SaveProperties;;.

unit uEditRequest;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Dialogs, StdCtrls, ExtCtrls, Mask, DBCtrlsEh, DBCtrls;= class (TForm): TLabel;: TPanel;: TButton;: TButton;: TDBLookupComboBox;: TLabel;: TDBCheckBox;: TButton;: TEdit;btnAssignClientClick (Sender: TObject);FormCreate (Sender: TObject);

{ Private declarations }

{ Public declarations }: integer;;: TfrEditRequest;uDM, uAssignClient;

{$R *. dfm}TfrEditRequest. btnAssignClientClick (Sender: TObject);TfrAssignClient. Create (self) do try: = dm. DBMain;isPositiveResult (Showmodal) then begin: = cID;. Text: = cNAME;;Free;;TfrEditRequest. FormCreate (Sender: TObject);: = - 1;;.

unit uEditClient;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, Mask, DBCtrlsEh;= class (TForm): TLabel;: TLabel;: TPanel;: TButton;: TButton;: TEdit;: TEdit;FormCloseQuery (Sender: TObject; var CanClose: Boolean);

{ Private declarations }

{ Public declarations };: TfrEditClient;

{$R *. dfm}TfrEditClient. FormCloseQuery (Sender: TObject;CanClose: Boolean);: = true;(ModalResult = mrOK) then begin(length (edtName. Text) = 0) then begin('Поле "Наименование" не может быть пустым! ', mtError, [mbOK], 0);: = false;;;;.

unit uSelectFrame;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls;= class (TForm): TPanel;: TButton;: TButton;: TListBox;listFramesDblClick (Sender: TObject);FormShow (Sender: TObject);

{ Private declarations }

{ Public declarations };: TfrSelectFrame;

{$R *. dfm}TfrSelectFrame. listFramesDblClick (Sender: TObject);

//

{showmessage (inttostr ( (Sender as TListBox). ItemAtPos (mouse. CursorPos, false)));(Sender as TListBox). ItemAtPos (mouse. CursorPos, true) <> - 1} ModalResult: = mrOK;;TfrSelectFrame. FormShow (Sender: TObject);. SetFocus;;.

unit uFrmPattern;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, ComCtrls, ImgList, ActnList, PropFilerEh, PropStorageEh;= class (TFrame): TActionList;: TImageList;: TStatusBar;: TPropStorageEh;

{ Private declarations }

{ Public declarations }: string;

ModuleID: integer;

// Абстрактный метод инициализации модуля, переопределяется в потомках

// Должен возвращать true, если открыта необходимая БД или false, если закрыта

function Initialize: boolean; virtual; abstract;

// Абстрактный метод завершения работы модуля, переопределяется в потомках

function Finalize: boolean; virtual; abstract;;: TfrmPattern;

{$R *. dfm}.

unit uEditUsers;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls;= class (TForm): TPanel;: TButton;: TButton;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TEdit;: TLabel;: TLabel;: TLabel;: TLabel;: TLabel;FormShow (Sender: TObject);

{ Private declarations }

{ Public declarations };: TfrEditUsers;

{$R *. dfm}TfrEditUsers. FormShow (Sender: TObject);

// edtName. SetFocus;;.

unit uEditReqGoods;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, Mask, DBCtrlsEh;= class (TForm): TLabel;: TDBEditEh;: TPanel;: TButton;: TButton;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;

{ Private declarations }

{ Public declarations };: TfrEditReqGoods;uDM;

{$R *. dfm}.

unit uEditGoods;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, Mask, DBCtrlsEh;= class (TForm): TLabel;: TDBEditEh;: TPanel;: TButton;: TButton;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;: TLabel;: TDBEditEh;

{ Private declarations }

{ Public declarations };: TfrEditGoods;uDM;

{$R *. dfm}.

unit uFrmRoute;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, uFrmPattern, PropFilerEh, PropStorageEh, ImgList, ActnList,

ComCtrls, ExtCtrls, ToolWin, Grids, DBGridEh;= class (TfrmPattern): TDBGridEh;: TToolBar;: TPanel;: TAction;: TAction;: TAction;

{ Private declarations }

{ Public declarations };: TfrmRoute;

{$R *. dfm}.

unit uEditDriver;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ExtCtrls, Mask, DBCtrlsEh;= class (TForm): TLabel;: TDBEditEh;: TPanel;: TButton;: TButton;: TLabel;: TDBEditEh;

{ Private declarations }

{ Public declarations };: TfrEditDriver;

{$R *. dfm}uDM;.

unit uConstants;

interfaceSysUtils;= 'Автотранспорт';= 'DB. ini';= 'SQL. ini';= 'DBMain';= 'DBPark';= 'DBStore';= 'Controls. ini'; // гриды и тдisInt (str: string): boolean;isInt (str: string): boolean;: = true;(str);E: EConvertError do result: = false;;;.

unit uAbout;

interface, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls;= class (TForm): TLabel;

{ Private declarations }

{ Public declarations };: TfrAbout;

{$R *. dfm}.

Похожие работы на - Разработка базы данных для транспортного предприятия

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!