Разработка базы данных (работа 2)
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
1. АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРНЫХ ИСТОЧНИКОВ
1.1 Основные понятия систем баз данных
1.2 База данных
1.3 Архитектура системы баз данных
1.4 Модель данных
1.5 Реляционная модель
2. ПОСТАНОВКА ЗАДАЧИ
3. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РЕЛЯЦИОННЫХ БАЗЫ ДАННЫХ
3.1 Реляционная алгебра
3.1.1 Общая интерпретация реляционных операций
3.1.2 Замкнутость реляционной алгебры и операция переименования
3.1.3 Особенности теоретико-множественных операций реляционной алгебры
3.2 Реляционное исчисление
3.2.1 Кортежные переменные и правильно построенные формулы
3.2.2 Целевые списки и выражения реляционного исчисления
3.2.3 Реляционное исчисление доменов
3.3 Целостность данных
3.4 Проектирование баз данных
4. РАЗРАБОТКА БАЗЫ ДАННЫХ
4.1 Предметная область базы данных
4.2 Построение инфологической модели
4.3 Проектирование базы данных
5. РАЗРАБОТКА ПРИЛОЖЕНИЯ-КЛИЕНТА
5.1 Обоснование выбора среды программирования
5.2 Средства Delphi для работы с базами данных
5.3 Реализация приложения
5.3.1 Общее описание форм и модулей
5.3.2 Форма MainForm и модуль Main
5.3.3 Модуль данных DataModule1 и модуль DBUnit
5.3.4 Форма EditForm и модуль Edit
5.3.5 Форма DeleteForm и модуль Delete
5.3.6 Форма FindForm и модуль Find
5.3.7 Форма FilterForm и модуль Filter
5.3.8 Форма DirSourceForm и модуль DirSource
5.3.9 Форма PathForm и модуль Path
5.3.10 Форма UserForm и модуль User
5.3.11 Форма AboutBox и модуль About
5.3.12 Модуль Files
6. ЭКОНОМИЧЕСКАЯ ЧАСТЬ
6.1 Предметная область базы данных и её разработка
6.2 Разработка сетевого графика работ проведения НИР
6.3 Расчет сметы затрат на проведение НИР
7. ОХРАНА ТРУДА
7.1 Общие вопросы охраны труда
7.2 Производственная санитария
7.3 Техника безопасности
7.4 Эксплутационные меры
7.5 Пожарная безопасность
7.6 Охрана окружающей среды
8. ГРАЖДАНСКАЯ ОБОРОНА
ВЫВОД
СПИСОК ССЫЛОК
ПРИЛОЖЕНИЯ
ВВЕДЕНИЕ
Для принятия обоснованных и эффективных решений в производственной деятельности, в управлении экономикой и в политике современный специалист должен уметь с помощью компьютеров и средств связи получать, накапливать, хранить и обрабатывать данные, представляя результат в виде наглядных документов. В современном обществе информационные технологии развиваются очень стремительно, они проникают во все сферы человеческой деятельности.
Целью данной дипломной работы является разработка удалённой базы данных и приложения-клиента для доступа к электронным источникам литературы, содержащихся на жёстком диске сервера предприятия в виде файлов и пакетов фалов (текстовых документов различных типов, гипертекста HTML, исполняемых файлов и др.). Архитектура клиент-сервер, используемая при реализации поставленной задачи на данный момент является наиболее прогрессивной. Она даёт возможность разделить задачу на две подзадачи: разработка собственно удалённой базы данных, физически расположённой на сервере и управляемой СУБД, и приложения, осуществляющего доступ к данной базе данных при помощи SQL-запросов и располагающееся на рабочих станциях пользователей сети. При такой реализации нагрузка также распределяется между сервером и рабочими станциями, что позволяет увеличить скорость работы программы.
Для управления базой данных была выбрана СУБД InterBase 6.0 фирмы Borland. Для разработки клиентской части приложения использовалась среда программирования Borland Dalphi 7.0 Eneterprise Edition, предоставляющая удобные средства для быстрого и наглядного создания подобных приложений.
Разработанная в ходе дипломной работы база данных позволяет увеличить скорость поиска и доступа пользователя к необходимым источникам литературы, позволяет упорядочить и систематизировать их. А это в свою очередь может повлиять на производительность труда пользователя, которому не надо тратить большое количество времени на поиск необходимой информации.
1. АНАЛИТИЧЕСКИЙ ОБЗОР ЛИТЕРАТУРНЫХ ИСТОЧНИКОВ
1.1 Основные понятия систем баз данных
Система баз данных – это компьютеризированная система хранения записей, т.е. компьютеризированная система, основное назначение которой – хранить информацию, предоставляя пользователям средства её извлечения и модификации [1].
Преимущества системы с базой данных по сравнению традиционным методом ведения учёта:
компактность;
скорость;
низкие трудозатраты;
актуальность;
централизованное управление данными;
независимость данных.
Система баз данных включает в себя четыре основных компонента: данные, аппаратное обеспечение, программное обеспечение (в частности систему управления базами данных, или СУБД) и пользователи.
Системы баз данных бывают однопользовательские и многопользовательские. Однопользовательская система – это система, в которой одновременно к базе данных может получить доступ не более одного пользователя, а многопользовательская система – это такая система, в которой к базе данных могут получить доступ сразу несколько пользователей.
В общем случае данные в базе данных являются интегрированными и разделяемыми. Под понятием интегрированности данных подразумевается возможность представить базу данных как объединение нескольких отдельных файлов данных полностью или частично исключающих избыточность хранения информации. Под понятием разделяемости данных подрозумевается возможность использования отдельных элементов, хранимых в базе данных несколькими различными пользователями.
К аппаратному обеспечению системы относят следующее:
1) Тома вторичной (внешней) памяти, используемые для хранения информации, а также соответствующие устройства ввода-вывода, контроллеры устройств, каналы ввода-вывода и т.д.
2) Аппаратный процессор (или процессоры) вместе с основной (первичной) памятью, предназначенные для поддержки работы программного обеспечения системы баз данных.
Между собственно физической базой данных и пользователями системы располагается уровень программного обеспечения, который можно называть по-разному: менеджер базы данных, сервер базы данных или система управления базами данных (СУБД). Все запросы пользователя на доступ к базе данных обрабатываются СУБД. Все имеющиеся средства добавления файлов (или таблиц), выборки и обновления в этих файлах или таблицах также предоставляются СУБД. Основная задача СУБД – предоставить пользователю базы данных возможность работать с ней, не вникая в детали на уровне аппаратного обеспечения.
Пользователей можно разделить на три большие и отчасти перекрывающиеся группы. Первая группа – прикладные программисты, которые отвечают за написание прикладных программ, использующих базу данных. Прикладные программисты получают доступ к базе данных посредством выдачи соответствующего запроса к СУБД. Вторая группа – конечные пользователи, которые работают с системой баз данных непосредственно через рабочую станцию или терминалы. Конечный пользователь может получить доступ к базе данных, применяя одно из интерактивных приложений или же интерфейс, интегрированный в программное обеспечение самой СУБД. Третья группа – администраторы базы данных (АБД). Они отвечают за администрирование базы данных и всей системы баз данных в соответствии с требованиями, устанавливаемыми администратором данных.
1.2 База данных
База данных – это некоторый набор перманентных (постоянных) данных, используемых прикладными системами какого-либо предприятия, организации.
База данных представляет собой совокупность связанных данных конкретной предметной области. [2]
Сущность – любой отличимый объект, который может быть представлен в базе данных. Кроме собственно основных сущностей, существуют ещё и связи между ними, которые объединяют эти основные сущности. В реляционных базах данных и основные сущности и связи между ними представляются с помощь таблиц. Связь можно понимать как связь особого типа.
Сущности (а значит, и связи) имеют некоторые свойства, соответствующие тем данным о них, которые мы желаем записать. В общем случае свойства могут быть как простыми, так и сложными, причём настолько, насколько это потребуется.
Независимость может быть реализована на двух уровнях: физическом и логическом. Независимость баз данных может быть определена как иммунитет прикладных программ к изменениям способа хранения данных и используемых методов доступа. Среди прочего для независимости данных требуется строгое разделение между моделью данных и её реализацией.
Системы баз данных обычно поддерживают транзакции или логические единицы работы. Основное преимущество транзакций заключается в том, что они гарантируют атомарность выполняемых действий, несмотря на возможные сбои системы, имевшие место до завершения выполнения транзакции.
1.3 Архитектура системы баз данных
Архитектура системы баз данных включает три уровня: внутренний, внешний и концептуальный. Внутренний уровень (также называемый физическим) наиболее близок к физическому хранилищу информации, т.е. связан со способами хранения информации на физических устройствах. Внешний уровень (также называемый пользовательским логическим) наиболее близок к пользователям, т.е. связан со способами представления данных с отдельными пользователями. Концептуальный уровень (также называемый общим логическим или просто логическим) является “промежуточным” уровнем между первым и вторым.
Если внешний уровень связан с индивидуальными представлениями пользователей, то концептуальный уровень связан с обобщённым представлением пользователей. Иначе говоря может существовать несколько внешних представлений, каждое из которых состоит из более или менее абстрактного представления определённой части базы данных, и только одно концептуальное представление, состоящее из абстрактного представления базы данных в целом.
Архитектура базы данных, кроме элементов самих трёх уровней включает определённые отображения. Отображение “концептуальный-внутренний” устанавливает соответствие между концептуальным представлением и хранимой базой данных, т.е. описывает как концептуальные записи и поля представлены на внутреннем уровне. При изменении структуры хранимой базы данных отображение “концептуальный-внутренний” также изменится, причём таким образом, чтобы концептуальная схема осталась неизменной. Отображение “внешний-концептуальный” определяет соответствие между некоторым внешним представлением и концептуальным представлением.
Пользователи, т.е. конечные пользователи и прикладные программисты, работающие на внешнем уровне, взаимодействует с данными с помощью подъязыка, который включает по крайней мере два компонента: язык определения данных (ЯОД) и язык манипулирования данными (ЯМД).
Система управления базой данных (СУБД) представляет собой программное обеспечение, которое управляет всем доступом к базе данных.
Функции СУБД:
определение данных;
обработка данных;
оптимизация и выполнение;
защита и сохранение целостности данных;
восстановление данных и поддержка параллельности;
словарь данных.
На высоком уровне систему баз данных можно рассматривать как систему с очень простой структурой, состоящей из двух частей – сервера (внутреннего компонента или машины баз данных) и набора клиентов (внешнего компонента или внешнего интерфейса).
Сервер – это сама СУБД. Он поддерживает все основные функции СУБД и предоставляет полную поддержку внешнего, концептуального и внутреннего уровня.
Клиенты – это различные приложения, которые выполняются поверх СУБД: как приложения написанные пользователями, так и встроенные приложения, предоставляемые поставщиком СУБД или некоторыми сторонними поставщиками программного обеспечения
Распределённая обработка - это возможность соединить разные машины в коммуникационную сеть для организации совместного решения одной задачи обработки данных на нескольких машинах сети. Взаимодействие между различными машинами осуществляется с помощью специального программного обеспечения, предназначенного для управления сетью. В общем случае каждый сервер может обслуживать много клиентов, а каждый клиент может работать со многими серверами. Если система обеспечивает полную прозрачность доступа, то в таком случае мы имеем настоящую распределённую систему баз данных.
Каталог (словарь данных) – это набор системных переменных-отношений, содержащих метаданные о различных элементах, важных для системы. Пользователи могут опрашивать каталог теми же методами, которые они применяют для доступа к собственным данным.
1.4 Модель данных
Модель данных – это абстрактное, самодостаточное, логическое определение объектов, операторов и прочих элементов, в совокупности составляющих абстрактную машину, с которой взаимодействует пользователь. [1] Упомянутые объекты позволяют моделировать структуру данных, а операторы – поведение данных.
Реализация заданной модели данных – это физическое воплощение на реальной машине компонентов абстрактной машины, которые в совокупности составляют эту модель.
Цель инфологического моделирования – обеспечение наиболее естественных для человека способов сбора и представления той информации, которую предполагается хранить в создаваемой базе данных. Поэтому инфологическую модель данных пытаются строить по аналогии с естественным языком (последний не может быть использован в чистом виде из-за сложности компьютерной обработки текстов и неоднозначности любого естественного языка). Основными конструктивными элементами инфологических моделей являются сущности, связи между ними и их свойства (атрибуты).
Сущность – любой различимый объект (объект, который мы можем отличить от другого), информацию о котором необходимо хранить в базе данных. Сущностями могут быть люди, места, самолеты, рейсы, вкус, цвет и т.д. Необходимо различать такие понятия, как тип сущности и экземпляр сущности. Понятие тип сущности относится к набору однородных личностей, предметов, событий или идей, выступающих как целое. Экземпляр сущности относится к конкретной вещи в наборе.
Атрибут – поименованная характеристика сущности. Его наименование должно быть уникальным для конкретного типа сущности, но может быть одинаковым для различного типа сущностей. Атрибуты используются для определения того, какая информация должна быть собрана о сущности. Абсолютное различие между типами сущностей и атрибутами отсутствует. Атрибут является таковым только в связи с типом сущности. В другом контексте атрибут может выступать как самостоятельная сущность.
Ключ – минимальный набор атрибутов, по значениям которых можно однозначно найти требуемый экземпляр сущности. Минимальность означает, что исключение из набора любого атрибута не позволяет идентифицировать сущность по оставшимся.
Связь – ассоциирование двух или более сущностей. Если бы назначением базы данных было только хранение отдельных, не связанных между собой данных, то ее структура могла бы быть очень простой. Однако одно из основных требований к организации базы данных – это обеспечение возможности отыскания одних сущностей по значениям других, для чего необходимо установить между ними определенные связи. А так как в реальных базах данных нередко содержатся сотни или даже тысячи сущностей, то теоретически между ними может быть установлено более миллиона связей. Наличие такого множества связей и определяет сложность инфологических моделей.
Система баз данных может быть основана на нескольких различных подходах. Иерархическая и сетевая модели данных стали применяться в системах управления базами данных в начале 60-х годов. В начале 70-х годов была предложена реляционная модель данных. Эти три модели различаются в основном способом представления взаимосвязей между объектами. [2]
Иерархическая модель данных строится по принципу иерархии типов объектов, т.е. один тип объектов является главным, а остальные, находящиеся на низших уровнях, подчинёнными. Между главным и подчинёнными типами объекта устанавливается взаимосвязь “один ко многим”. Иными словами, для данного главного типа объекта существует несколько подчинённых типов объекта.
Иерархическая древовидная структура строится из узлов и ветвей. Узел представляет собой совокупность атрибутов данных, описывающих некоторый объект. Зависимые узлы располагаются на более низких уровнях дерева.
Достоинства иерархической модели данных:
простота понимания и использования;
обеспечение определенного уровня независимости данных;
простота оценки операционных характеристик благодаря заранее заданным взаимосвязям.
Недостатки модели:
избыточное хранение данных;
из-за строгой иерархической упорядоченности объектов модели значительно усложняются операции включения и удаления;
удаление исходных объектов влечёт удаление порождённых;
процедурность операций манипулирования данными;
корневой тип узла является главным, доступ к любому порождённому узлу возможен только через исходный.
В сетевой модели данных понятия главного и подчинённых объектов несколько расширены. Любой объект может быть и главным и подчинённым. Главный объект обозначается термином “владелец набора”, а подчинённый – “член набора”. Один и тот же объект одновременно может выступать и в роли владельца и в роли члена набора. Это означает, что каждый объект может участвовать в любом случае взаимосвязей.
В сетевой модели данных объекты объединяются в “сеть”. Каждый тип записи может содержать нуль, один или несколько атрибутов.
Достоинства сетевой модели:
возможность построения вручную эффективных прикладных систем;
возможность экономии памяти за счет разделения подобъектов;
простота реализации часто встречающихся в реальном мире взаимосвязей “многие ко многим”.
Недостатки сетевой модели данных:
сложность модели;
возможная потеря данных при реорганизации базы данных.
Реляционные системы основаны на формальной теории, называемой реляционной моделью данных, которая предполагает следующее:
1) данные представлены посредством строк в таблицах, и эти строки могут быть непосредственно интерпретированы как истинные высказывания;
для обработки строк данных предоставляются операторы, которые напрямую поддерживают процесс логического получения дополнительных истинных высказываний из существующих высказываний.
1.5 Реляционная модель
К числу достоинств реляционного подхода можно отнести:
наличие небольшого набора абстракций, которые позволяют сравнительно просто моделировать большую часть распространенных предметных областей и допускают точные формальные определения, оставаясь интуитивно понятными;
наличие простого и в то же время мощного математического аппарата, опирающегося главным образом на теорию множеств и математическую логику и обеспечивающего теоретический базис реляционного подхода к организации баз данных;
возможность ненавигационного манипулирования данными без необходимости знания конкретной физической организации баз данных во внешней памяти.
Реляционные системы далеко не сразу получили широкое распространение. В то время, как основные теоретические результаты в этой области были получены еще в 70-х, и тогда же появились первые прототипы реляционных СУБД, долгое время считалось невозможным добиться эффективной реализации таких систем. Однако отмеченные выше преимущества и постепенное накопление методов и алгоритмов организации реляционных баз данных и управления ими привели к тому, что уже в середине 80-х годов реляционные системы практически вытеснили с мирового рынка ранние СУБД.
В настоящее время основным предметом критики реляционных СУБД является не их недостаточная эффективность, а присущая этим системам некоторая ограниченность (прямое следствие простоты) при использование в так называемых нетрадиционных областях (наиболее распространенными примерами являются системы автоматизации проектирования), в которых требуются предельно сложные структуры данных. Еще одним часто отмечаемым недостатком реляционных баз данных является невозможность адекватного отражения семантики предметной области. Другими словами, возможности представления знаний о семантической специфике предметной области в реляционных системах очень ограничены. Современные исследования в области постреляционных систем главным образом посвящены именно устранению этих недостатков.
Каждое отношение имеет заголовок и тело. Заголовок – это набор пар “имя столбца: имя типа”, а тело отношения состоит из набора строк, которые соответствуют заголовку. Заголовок любого отношения можно рассматривать как предикат, а каждую строку в теле отношения – как некоторое истинное высказывание, образованное в результате подстановки определённых значений аргументов соответствующего типа вместо местодержателей или параметров этого предиката.
Исходные переменные-отношения в некоторой базе данных называются базовыми переменными-отношениями, а их значения называются базовыми отношениями. Отношение, которое получено из таких базовых отношений путём вычисления некоторого реляционного выражения, называются производными. Представление – это переменная-отношение, значение которой в любой данный момент является некоторым производным отношением. Значение такой переменной-отношения в любой момент представляет собой результат вычисления соответствующего реляционного выражения, определяющего это представление. Поэтому можно сказать, что базовые переменные-отношения существуют независимо, а представления – нет.
2. ПОСТАНОВКА ЗАДАЧИ
Целью данной дипломной работы является разработка удалённой базы данных и приложения-клиента для доступа к электронным источникам литературы, содержащихся на жёстком диске сервера предприятия в виде упакованных архивов файлов и пакетов фалов (текстовых документов различных типов, гипертекста HTML, исполняемых файлов и др.). Каждый источник литературы характеризуется следующими атрибутами:
фамилия и инициалы автора (авторов);
название;
язык;
список тем, к которым относится источник;
путь и название файла архива;
название основного файла источника.
На сервере необходимо создать распределённую БД, содержащую данную информацию обо всех источниках.
Клиентское приложение должно удовлетворять следующим требованиям:
максимальное удобство пользователя при работе (современный и понятный интерфейс);
максимальная переносимость исходного кода программы для платформы Linux;
наличие процедуры поиска источника по атрибутам;
возможность фильтрации источников;
возможность запуска соответствующего средства для просмотра выбранного источника средствами программы.
3. ТЕОРЕТИЧЕСКИЕ ОСНОВЫ РЕЛЯЦИОННЫХ БАЗЫ ДАННЫХ
3.1 Реляционная алгебра
Основная идея реляционной алгебры состоит в том, что коль скоро отношения являются множествами, то средства манипулирования отношениями могут базироваться на традиционных теоретико-множественных операциях, дополненных некоторыми специальными операциями, специфичными для баз данных.
В состав теоретико-множественных операций входят операции:
объединения отношений;
пересечения отношений;
взятия разности отношений;
прямого произведения отношений.
Специальные реляционные операции включают:
ограничение отношения;
проекцию отношения;
соединение отношений;
деление отношений.
Кроме того, в состав алгебры включается операция присваивания, позволяющая сохранить в базе данных результаты вычисления алгебраических выражений, и операция переименования атрибутов, дающая возможность корректно сформировать заголовок (схему) результирующего отношения.
3.1.1 Общая интерпретация реляционных операций
Если не вдаваться в некоторые тонкости, которые мы рассмотрим в следующих подразделах, то почти все операции предложенного выше набора обладают очевидной и простой интерпретацией.
При выполнении операции объединения двух отношений производится отношение, включающее все кортежи, входящие хотя бы в одно из отношений-операндов.
Операция пересечения двух отношений производит отношение, включающее все кортежи, входящие в оба отношения-операнда.
Отношение, являющееся разностью двух отношений включает все кортежи, входящие в отношение - первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом.
При выполнении прямого произведения двух отношений производится отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов.
Результатом ограничения отношения по некоторому условию является отношение, включающее кортежи отношения-операнда, удовлетворяющее этому условию.
При выполнении проекции отношения на заданный набор его атрибутов производится отношение, кортежи которого производятся путем взятия соответствующих значений из кортежей отношения-операнда.
При соединении двух отношений по некоторому условию образуется результирующее отношение, кортежи которого являются конкатенацией кортежей первого и второго отношений и удовлетворяют этому условию.
У операции реляционного деления два операнда - бинарное и унарное отношения. Результирующее отношение состоит из одноатрибутных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) совпадает со множеством значений второго операнда.
Операция переименования производит отношение, тело которого совпадает с телом операнда, но имена атрибутов изменены.
Операция присваивания позволяет сохранить результат вычисления реляционного выражения в существующем отношении БД.
Поскольку результатом любой реляционной операции (кроме операции присваивания) является некоторое отношение, можно образовывать реляционные выражения, в которых вместо отношения-операнда некоторой реляционной операции находится вложенное реляционное выражение.
3.1.2 Замкнутость реляционной алгебры и операция переименования
Как мы говорили в предыдущей лекции, каждое отношение характеризуется схемой (или заголовком) и набором кортежей (или телом). Поэтому, если действительно желать иметь алгебру, операции которой замкнуты относительно понятия отношения, то каждая операция должна производить отношение в полном смысле, т.е. оно должно обладать и телом, и заголовком. Только в этом случае будет действительно возможно строить вложенные выражения.
Заголовок отношения представляет собой множество пар <имя-атрибута, имя-домена>. Если посмотреть на общий обзор реляционных операций, приведенный в предыдущем подразделе, то видно, что домены атрибутов результирующего отношения однозначно определяются доменами отношений-операндов. Однако с именами атрибутов результата не всегда все так просто.
Например, представим себе, что у отношений-операндов операции прямого произведения имеются одноименные атрибуты с одинаковыми доменами. Каким был бы заголовок результирующего отношения? Поскольку это множество, в нем не должны содержаться одинаковые элементы. Но и потерять атрибут в результате недопустимо. А это значит, что в этом случае вообще невозможно корректно выполнить операцию прямого произведения.
Аналогичные проблемы могут возникать и в случаях других двуместных операций. Для их разрешения в состав операций реляционной алгебры вводится операция переименования. Ее следует применять в любом случае, когда возникает конфликт именования атрибутов в отношениях - операндах одной реляционной операции. Тогда к одному из операндов сначала применяется операция переименования, а затем основная операция выполняется уже безо всяких проблем.
В дальнейшем изложении мы будем предполагать применение операции переименования во всех конфликтных случаях.
3.1.3 Особенности теоретико-множественных операций реляционной алгебры
Хотя в основе теоретико-множественной части реляционной алгебры лежит классическая теория множеств, соответствующие операции реляционной алгебры обладают некоторыми особенностями.
Начнем с операции объединения (все, что будет говориться по поводу объединения, переносится на операции пересечения и взятия разности). Смысл операции объединения в реляционной алгебре в целом остается теоретико-множественным. Но если в теории множеств операция объединения осмысленна для любых двух множеств-операндов, то в случае реляционной алгебры результатом операции объединения должно являться отношение. Если допустить в реляционной алгебре возможность теоретико-множественного объединения произвольных двух отношений (с разными схемами), то, конечно, результатом операции будет множество, но множество разнотипных кортежей, т.е. не отношение. Если исходить из требования замкнутости реляционной алгебры относительно понятия отношения, то такая операция объединения является бессмысленной.
Все эти соображения приводят к появлению понятия совместимости отношений по объединению: два отношения совместимы по объединению в том и только в том случае, когда обладают одинаковыми заголовками. Более точно, это означает, что в заголовках обоих отношений содержится один и тот же набор имен атрибутов, и одноименные атрибуты определены на одном и том же домене.
Если два отношения совместимы по объединению, то при обычном выполнении над ними операций объединения, пересечения и взятия разности результатом операции является отношение с корректно определенным заголовком, совпадающим с заголовком каждого из отношений-операндов. Напомним, что если два отношения "почти" совместимы по объединению, т.е. совместимы во всем, кроме имен атрибутов, то до выполнения операции типа соединения эти отношения можно сделать полностью совместимыми по объединению путем применения операции переименования.
Заметим, что включение в состав операций реляционной алгебры трех операций объединения, пересечения и взятия разности является очевидно избыточным, поскольку известно, что любая из этих операций выражается через две других. Тем не менее, Кодд в свое время решил включить все три операции, исходя из интуитивных потребностей потенциального пользователя системы реляционных БД, далекого от математики.
Другие проблемы связаны с операцией взятия прямого произведения двух отношений. В теории множеств прямое произведение может быть получено для любых двух множеств, и элементами результирующего множества являются пары, составленные из элементов первого и второго множеств. Поскольку отношения являются множествами, то и для любых двух отношений возможно получение прямого произведения. Но результат не будет отношением! Элементами результата будут являться не кортежи, а пары кортежей.
Поэтому в реляционной алгебре используется специализированная форма операции взятия прямого произведения - расширенное прямое произведение отношений. При взятии расширенного прямого произведения двух отношений элементом результирующего отношения является кортеж, являющийся конкатенацией (или слиянием) одного кортежа первого отношения и одного кортежа второго отношения.
Но теперь возникает второй вопрос - как получить корректно сформированный заголовок отношения-результата? Очевидно, что проблемой может быть именование атрибутов результирующего отношения, если отношения-операнды обладают одноименными атрибутами.
Эти соображения приводят к появлению понятия совместимости по взятию расширенного прямого произведения. Два отношения совместимы по взятию прямого произведения в том и только в том случае, если множества имен атрибутов этих отношений не пересекаются. Любые два отношения могут быть сделаны совместимыми по взятию прямого произведения путем применения операции переименования к одному из этих отношений.
Следует заметить, что операция взятия прямого произведения не является слишком осмысленной на практике. Во-первых, мощность ее результата очень велика даже при допустимых мощностях операндов, а во-вторых, результат операции не более информативен, чем взятые в совокупности операнды. Как мы увидим немного ниже, основной смысл включения операции расширенного прямого произведения в состав реляционной алгебры состоит в том, что на ее основе определяется действительно полезная операция соединения.
По поводу теоретико-множественных операций реляционной алгебры следует еще заметить, что все четыре операции являются ассоциативными.
3.2 Реляционное исчисление
3.2.1 Кортежные переменные и правильно построенные формулы
Реляционное исчисление является прикладной ветвью формального механизма исчисления предикатов первого порядка. Базисными понятиями исчисления являются понятие переменной с определенной для нее областью допустимых значений и понятие правильно построенной формулы, опирающейся на переменные, предикаты и кванторы.
В зависимости от того, что является областью определения переменной, различаются исчисление кортежей и исчисление доменов. В исчислении кортежей областями определения переменных являются отношения базы данных, т.е. допустимым значением каждой переменной является кортеж некоторого отношения. В исчислении доменов областями определения переменных являются домены, на которых определены атрибуты отношений базы данных, т.е. допустимым значением каждой переменной является значение некоторого домена. Мы рассмотрим более подробно исчисление кортежей, а в конце лекции коротко опишем особенности исчисления доменов.
Правильно построенные формулы (WFF - Well-Formed Formula) служат для выражения условий, накладываемых на кортежные переменные. Основой WFF являются простые сравнения (comparison), представляющие собой операции сравнения скалярных значений (значений атрибутов переменных или литерально заданных констант). По определению, простое сравнение является WFF, а WFF, заключенная в круглые скобки, является простым сравнением.
Более сложные варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN. Так, если form - WFF, а comp - простое сравнение, то NOT form, comp AND form, comp OR form и IF comp THEN form являются WFF.
Наконец, допускается построение WFF с помощью кванторов. Если form - это WFF, в которой участвует переменная var, то конструкции EXISTS var (form) и FORALL var (form) представляют wff.
Переменные, входящие в WFF, могут быть свободными или связанными. Все переменные, входящие в WFF, при построении которой не использовались кванторы, являются свободными. Фактически, это означает, что если для какого-то набора значений свободных кортежных переменных при вычислении WFF получено значение true, то эти значения кортежных переменных могут входить в результирующее отношение. Если же имя переменной использовано сразу после квантора при построении WFF вида EXISTS var (form) или FORALL var (form), то в этой WFF и во всех WFF, построенных с ее участием, var - это связанная переменная. Это означает, что такая переменная не видна за пределами минимальной WFF, связавшей эту переменную. При вычислении значения такой WFF используется не одно значение связанной переменной, а вся ее область определения.
На самом деле, правильнее говорить не о свободных и связанных переменных, а о свободных и связанных вхождениях переменных. Легко видеть, что если переменная var является связанной в WFF form, то во всех WFF, включающих данную, может использоваться имя переменной var, которая может быть свободной или связанной, но в любом случае не имеет никакого отношения к вхождению переменной var в WFF form.
3.2.2 Целевые списки и выражения реляционного исчисления
Итак, WFF обеспечивают средства формулировки условия выборки из отношений БД. Чтобы можно было использовать исчисление для реальной работы с БД, требуется еще один компонент, который определяет набор и имена столбцов результирующего отношения. Этот компонент называется целевым списком (target_list).
Целевой список строится из целевых элементов, каждый из которых может иметь следующий вид:
var.attr, где var - имя свободной переменной соответствующей WFF, а attr - имя атрибута отношения, на котором определена переменная var;
var, что эквивалентно наличию подсписка var.attr1, var.attr2, ..., var.attrn, где attr1, attr2, ..., attrn включает имена всех атрибутов определяющего отношения;
new_name = var.attr; new_name - новое имя соответствующего атрибута результирующего отношения.
Последний вариант требуется в тех случаях, когда в WFF используются несколько свободных переменных с одинаковой областью определения.
Выражением реляционного исчисления кортежей называется конструкция вида target_list WHERE wff. Значением выражения является отношение, тело которого определяется WFF, а набор атрибутов и их имена - целевым списком.
3.2.3 Реляционное исчисление доменов
В исчислении доменов областью определения переменных являются не отношения, а домены.
Основным формальным отличием исчисления доменов от исчисления кортежей является наличие дополнительного набора предикатов, позволяющих выражать так называемые условия членства. Если R - это n-арное отношение с атрибутами a>1>, a>2>, ..., a>n>, то условие членства имеет вид
R (ai1:vi1, ai2:vi2, ..., aim:vim) (m <= n),
где v>ij> - это либо литерально задаваемая константа, либо имя кортежной переменной. Условие членства принимает значение true в том и только в том случае, если в отношении R существует кортеж, содержащий указанные значения указанных атрибутов. Если v>ij> - константа, то на атрибут a>ij> задается жесткое условие, не зависящее от текущих значений доменных переменных; если же v>ij> - имя доменной переменной, то условие членства может принимать разные значения при разных значениях этой переменной.
Во всех остальных отношениях формулы и выражения исчисления доменов выглядят похожими на формулы и выражения исчисления кортежей. В частности, конечно, различаются свободные и связанные вхождения доменных переменных.
Реляционное исчисление доменов является основой большинства языков запросов, основанных на использовании форм. В частности, на этом исчислении базировался известный язык Query-by-Example, который был первым (и наиболее интересным) языком в семействе языков, основанных на табличных формах.
3.3 Целостность реляционных данных
В любой реляционной базе данных должны выполняться два ограничения:
1) целостность сущностей;
целостность внешних ключей.
Прежде, чем говорить о целостности сущностей, опишем использование null-значений в реляционных базах данных.
Основное назначение баз данных состоит в том, чтобы хранить и предоставлять информацию о реальном мире. Для представления этой информации в базе данных используются привычные для программистов типы данных - строковые, численные, логические и т.п. Однако в реальном мире часто встречается ситуация, когда данные неизвестны или не полны. Например, место жительства или дата рождения человека могут быть неизвестны (база данных разыскиваемых преступников). Если вместо неизвестного адреса уместно было бы вводить пустую строку, то что вводить вместо неизвестной даты? Ответ - пустую дату - не вполне удовлетворителен, т.к. простейший запрос "выдать список людей в порядке возрастания дат рождения" даст заведомо неправильных ответ.
Для того чтобы обойти проблему неполных или неизвестных данных, в базах данных могут использоваться типы данных, пополненные так называемым null-значением. Null-значение - это, собственно, не значение, а некий маркер, показывающий, что значение неизвестно.
Практически все реализации современных реляционных СУБД позволяют использовать null-значения, несмотря на их недостаточную теоретическую обоснованность. Мнение автора (очень скромное по сравнению с мнением корифеев реляционной теории) состоит в том, что желательно избегать null-значений. Тем не менее, приведем здесь описание трехзначной логики, необходимой для работы с null-значениями.
Т.к. null-значение обозначает на самом деле тот факт, что значение неизвестно, то любые алгебраические операции (сложение, умножение, конкатенация строк и т.д.) должны давать также неизвестное значение, т.е. null. Действительно, если, например, вес детали неизвестен, то неизвестно также, сколько весят 10 таких деталей.
При сравнении выражений, содержащих null-значения, результат также может быть неизвестен. Таким образом, определение истинности логических выражений базируется на трехзначной логике (three-valued logic, 3VL), в которой кроме значений T - ИСТИНА и F - ЛОЖЬ, введено значение U - НЕИЗВЕСТНО.
По определению, тело отношения есть множество кортежей, поэтому отношения не могут содержать одинаковые кортежи. Это значит, что каждый кортеж должен обладать свойством уникальности. На самом деле, свойством уникальности в пределах отношения могут обладать отдельные атрибуты кортежей или группы атрибутов. Такие уникальные атрибуты удобно использовать для идентификации кортежей.
Пусть дано отношение . Подмножество атрибутов отношения будем называть потенциальным ключом, если обладает следующими свойствами:
Свойством уникальности - в отношении не может быть двух различных кортежей, с одинаковым значением .
Свойством неизбыточности - никакое подмножество в не обладает свойством уникальности.
Любое отношение имеет по крайней мере один потенциальный ключ. Действительно, если никакой атрибут или группа атрибутов не являются потенциальным ключом, то, в силу уникальности кортежей, все атрибуты вместе образуют потенциальный ключ.
Потенциальный ключ, состоящий из одного атрибута, называется простым. Потенциальный ключ, состоящий из нескольких атрибутов, называется составным.
Отношение может иметь несколько потенциальных ключей. Традиционно, один из потенциальных ключей объявляется первичным, а остальные - альтернативными. Различия между первичным и альтернативными ключами могут быть важны в конкретной реализации реляционной СУБД, но с точки зрения реляционной модели данных, нет оснований выделять таким образом один из потенциальных ключей.
Т.к. потенциальные ключи фактически служат идентификаторами объектов предметной области (т.е. предназначены для различения объектов), то значения этих идентификаторов не могут содержать неизвестные значения. Действительно, если бы идентификаторы могли содержать null-значения, то мы не могли бы дать ответ "да" или "нет" на вопрос, совпадают или нет два идентификатора.
Правило целостности сущностей. Атрибуты, входящие в состав некоторого потенциального ключа не могут принимать null-значений.
Различные объекты предметной области, информация о которых хранится в базе данных, всегда взаимосвязаны друг с другом. Например, накладная на поставку товара содержит список товаров с количествами и ценами, сотрудник предприятия имеет детей, числится в подразделении и т.д. Термины "содержит", "имеет", "числится" отражают взаимосвязи между понятиями "накладная" и "список товаров", "сотрудник" и "дети", "сотрудник" и "подразделение". Такие взаимосвязи отражаются в реляционных базах данных при помощи внешних ключей, связывающих несколько отношений.
В реляционных базах данных основными являются взаимосвязи типа "один-ко-многим". Взаимосвязи типа "много-ко-многим" реализуются использованием нескольких взаимосвязей типа "один-ко-многим". Отношение, входящее в связь со стороны "один", называют родительским отношением. Отношение, входящее в связь со стороны "много", называется дочернем отношением.
Механизм реализации взаимосвязи "один-ко-многим" состоит в том, что в дочернее отношение добавляются атрибуты, являющиеся ссылками на ключевые атрибуты родительского отношения. Эти атрибуты и являются внешними ключами, определяющими, с какими кортежами родительского отношения связаны кортежи дочернего отношения. Такие атрибуты еще называют мигрирующими из родительского отношения.
Пусть дано отношение . Подмножество атрибутов отношения будем называть внешним ключом, если:
Существует отношение ( и не обязательно различны) с потенциальным ключом .
Каждое значение в отношении всегда совпадает со значением для некоторого кортежа из , либо является null-значением.
Отношение называется родительским отношением, отношение называется дочерним отношением.
Т.к. внешние ключи фактически служат ссылками на кортежи в другом (или в том же самом) отношении, то эти ссылки не должны указывать на несуществующие объекты. Это определяет следующее правило целостности внешних ключей:
Правило целостности внешних ключей. Внешние ключи не должны быть несогласованными, т.е. для каждого значения внешнего ключа должно существовать соответствующее значение первичного ключа в родительском отношении.
Существуют две основные стратегии поддержания ссылочной целостности:
RESTRICT (ОГРАНИЧИТЬ)- не разрешать выполнение операции, приводящей к нарушению ссылочной целостности. Это самая простая стратегия, требующая только проверки, имеются ли кортежи в дочернем отношении, связанные с некоторым кортежем в родительском отношении.
CASCADE (КАСКАДИРОВАТЬ)- разрешить выполнение требуемой операции, но внести при этом необходимые поправки в других отношениях так, чтобы не допустить нарушения ссылочной целостности и сохранить все имеющиеся связи. Изменение начинается в родительском отношении и каскадно выполняется в дочернем отношении. В реализации этой стратегии имеется одна тонкость, заключающаяся в том, что дочернее отношение само может быть родительским для некоторого третьего отношения. При этом может дополнительно потребоваться выполнение какой-либо стратегии и для этой связи и т.д. Если при этом какая-либо из каскадных операций (любого уровня) не может быть выполнена, то необходимо отказаться от первоначальной операции и вернуть базу данных в исходное состояние. Это самая сложная стратегия, но она хороша тем, что при этом не нарушается связь между кортежами родительского и дочернего отношений.
Эти стратегии являются стандартными и присутствуют во всех СУБД, в которых имеется поддержка ссылочной целостности.
Можно рассмотреть дополнительные стратегии поддержания ссылочной целостности:
SET NULL (УСТАНОВИТЬ В NULL) - разрешить выполнение требуемой операции, но все возникающие некорректные значения внешних ключей изменять на null-значения. Эта стратегия имеет два недостатка. Во-первых, для нее требуется допустить использование null-значений. Во-вторых, кортежи дочернего отношения теряют всякую связь с кортежами родительского отношения. Установить, с каким кортежем родительского отношения были связаны измененные кортежи дочернего отношения, после выполнения операции уже нельзя.
SET DEFAULT (УСТАНОВИТЬ ПО УМОЛЧАНИЮ) - разрешить выполнение требуемой операции, но все возникающие некорректные значения внешних ключей изменять на некоторое значение, принятое по умолчанию. Достоинство этой стратегии по сравнению с предыдущей в том, что она позволяет не пользоваться null-значеними. Недостатки заключаются в следующем. Во-первых, в родительском отношении должен быть некий кортеж, потенциальный ключ которого принят как значение по умолчанию для внешних ключей. В качестве такого "кортежа по умолчанию" обычно принимают специальный кортеж, заполненный нулевыми значениями (не null-значениями!). Этот кортеж нельзя удалять из родительского отношения, и в этом кортеже нельзя изменять значение потенциального ключа. Таким образом, не все кортежи родительского отношения становятся равнозначными, поэтому приходится прилагать дополнительные усилия для отслеживания этой неравнозначности. Это плата за отказ от использования null-значений. Во-вторых, как и в предыдущем случае, кортежи дочернего отношения теряют всякую связь с кортежами родительского отношения. Установить, с каким кортежем родительского отношения были связаны измененные кортежи дочернего отношения, после выполнения операции уже нельзя.
В некоторых реализация СУБД рассматривается еще одна стратегия поддержания ссылочной целостности:
IGNORE (ИГНОРИРОВАТЬ) - выполнять операции, не обращая внимания на нарушения ссылочной целостности.
3.4 Проектирование базы данных
Каждой нормальной форме соответствует некоторый определенный набор ограничений, и отношение находится в некоторой нормальной форме, если удовлетворяет свойственному ей набору ограничений. Примером набора ограничений является ограничение первой нормальной формы - значения всех атрибутов отношения атомарны. Поскольку требование первой нормальной формы является базовым требованием классической реляционной модели данных, мы будем считать, что исходный набор отношений уже соответствует этому требованию.
В теории реляционных баз данных обычно выделяется следующая последовательность нормальных форм:
первая нормальная форма (1NF);
вторая нормальная форма (2NF);
третья нормальная форма (3NF);
нормальная форма Бойса-Кодда (BCNF);
четвертая нормальная форма (4NF);
пятая нормальная форма, или нормальная форма проекции-соединения (5NF или PJ/NF).
Основные свойства нормальных форм:
каждая следующая нормальная форма в некотором смысле лучше предыдущей;
при переходе к следующей нормальной форме свойства предыдущих нормальных свойств сохраняются.
В основе процесса проектирования лежит метод нормализации, декомпозиция отношения, находящегося в предыдущей нормальной форме, в два или более отношения, удовлетворяющих требованиям следующей нормальной формы.
Наиболее важные на практике нормальные формы отношений основываются на фундаментальном в теории реляционных баз данных понятии функциональной зависимости.
В отношении R атрибут Y функционально зависит от атрибута X (X и Y могут быть составными) в том и только в том случае, если каждому значению X соответствует в точности одно значение Y: R.X (r) R.Y.
Функциональная зависимость R.X (r) R.Y называется полной, если атрибут Y не зависит функционально от любого точного подмножества X.
Функциональная зависимость R.X (r) R.Y называется транзитивной, если существует такой атрибут Z, что имеются функциональные зависимости R.X (r) R.Z и R.Z (r) R.Y и отсутствует функциональная зависимость R.Z --> R.X. (При отсутствии последнего требования мы имели бы "неинтересные" транзитивные зависимости в любом отношении, обладающем несколькими ключами.)
Неключевым атрибутом называется любой атрибут отношения, не входящий в состав первичного ключа (в частности, первичного).
Два или более атрибута взаимно независимы, если ни один из этих атрибутов не является функционально зависимым от других.
Отношение R находится во второй нормальной форме (2NF) в том и только в том случае, когда находится в 1NF, и каждый неключевой атрибут полностью зависит от первичного ключа.
Отношение R находится во второй нормальной форме (2NF) в том и только в том случае, когда оно находится в 1NF, и каждый неключевой атрибут полностью зависит от каждого ключа R.
Отношение R находится в третьей нормальной форме (3NF) в том и только в том случае, если находится в 2NF и каждый неключевой атрибут нетранзитивно завис
Отношение R находится в третьей нормальной форме (3NF) в том и только в том случае, если находится в 1NF, и каждый неключевой атрибут не является транзитивно зависимым от какого-либо ключа R.
На практике третья нормальная форма схем отношений достаточна в большинстве случаев, и приведением к третьей нормальной форме процесс проектирования реляционной базы данных обычно заканчивается. Однако иногда полезно продолжить процесс нормализации.
Детерминант - любой атрибут, от которого полностью функционально зависит некоторый другой атрибут.
Отношение R находится в нормальной форме Бойса-Кодда (BCNF) в том и только в том случае, если каждый детерминант является возможным ключом.
В отношении R (A, B, C) существует многозначная зависимость R.A (r) (r) R.B в том и только в том случае, если множество значений B, соответствующее паре значений A и C, зависит только от A и не зависит от С.
Легко показать, что в общем случае в отношении R (A, B, C) существует многозначная зависимость R.A (r) (r) R.B в том и только в том случае, когда существует многозначная зависимость R.A (r) (r) R.C.
Теорема Фейджина. Отношение R (A, B, C) можно спроецировать без потерь в отношения R1 (A, B) и R2 (A, C) в том и только в том случае, когда существует MVD A (r) (r) B | C.
Под проецированием без потерь понимается такой способ декомпозиции отношения, при котором исходное отношение полностью и без избыточности восстанавливается путем естественного соединения полученных отношений.
Отношение R находится в четвертой нормальной форме (4NF) в том и только в том случае, если в случае существования многозначной зависимости A (r) (r) B все остальные атрибуты R функционально зависят от A.
Отношение R (X, Y, ..., Z) удовлетворяет зависимости соединения * (X, Y, ..., Z) в том и только в том случае, когда R восстанавливается без потерь путем соединения своих проекций на X, Y, ..., Z.
Отношение R находится в пятой нормальной форме (нормальной форме проекции-соединения - PJ/NF) в том и только в том случае, когда любая зависимость соединения в R следует из существования некоторого возможного ключа в R.
Пятая нормальная форма - это последняя нормальная форма, которую можно получить путем декомпозиции. Ее условия достаточно нетривиальны, и на практике 5NF не используется. Заметим, что зависимость соединения является обобщением как многозначной зависимости, так и функциональной зависимости.
4. РАЗРАБОТКА БАЗЫ ДАННЫХ
4.1 Предметная область базы данных
База данных предназначена для хранения информации об электронных источниках литературы в виде файлов, упакованных в архивы. Файлы архивов физически располагаются на сервере предприятия и не упорядочены между собой. Названия файлов архивов и файлов источников могут не иметь семантической связи с тематикой источников. Пользователями БД являются работники предприятия, которым требуется тот или иной источник литературы или группа источников по заданной тематике.
Анализ запросов на литературу показывает, что для поиска подходящих источников (по тематике, названию, автору) и отбора нужного следует выделить следующие атрибуты источников литературы:
автор (фамилия и имена (инициалы) или псевдоним каждого автора источника литературы);
название (заглавие) источника литературы;
язык, на котором написан источник;
список тем (разделов), с которыми связан данный источник литературы.
К объектам и атрибутам, позволяющим охарактеризовать место расположение файлов источников, можно отнести:
полное файловое имя (путь и имя файла) архива источника литературы;
название основного (первого) файла источника литературы.
4.2 Построение инфологической модели
Анализ определенных выше объектов и атрибутов позволяет выделить сущности проектируемой базы данных и, приняв решение о создании реляционной базы данных, построить ее инфологическую модель на языке "Таблицы-связи" (рис. 4.1). Для того, чтобы БД сохраняла целостность при любых операциях над ней (вставка, удаление, изменение кортежей), все отношения в ней нормализованы (БД приведена к третей нормальной форме).
Выделены следующие сущности:
“Авторы” (“Код автора”, “Автор”) – эта сущность отводится для хранения сведений об авторах литературных источников. Так как фамилия и имена (инициалы) автора (группы авторов) могут быть достаточно громоздкими и будут многократно встречаться в разных источниках, то их целесообразно нумеровать и ссылаться на эти номера. Для этого вводится целочисленный атрибут "Код автора", который будет автоматически наращиваться на единицу при вводе в базу данных нового автора. Самой же информации об авторе соответствует атрибут “Автор”.
“Заглавия” (“Код заглавия”, “Заглавие”). Выделение этой сущности позволит сократить объем данных и снизить вероятность возникновения противоречивости. Как и сущность “Авторы”, данная сущность характеризуется двумя атрибутами – целочисленным "Код заглавия", который будет автоматически наращиваться на единицу при вводе в базу данных нового заглавия и “Заглавие”, непосредственно отражающий заглавие источника литературы.
“Языки” (“Код языка”, “Язык”) – эта сущность отражает информацию об языке, на котором написан источник литературы. Данная сущность также включает в себя два атрибута: “Код языка” – целочисленный автоматически увеличивающийся и “Язык” –название языка источника литературы.
“Книги” (“Код книги”, “Код автора”, “Код заглавия”, “Код языка”, “Темы”, “Архив”, “Файл”) – эта сущность отражает информацию о конкретных источниках литературы.
Рисунок 4.1 Инфологическая модель БД
4.3 Проектирование базы данных
Для физической реализации БД использовалась СУБД InterBase версии 6.0. Эта СУБД была выбрана по ряду причин:
поддержка данной СУБД реляционных и распределённых баз данных;
высокая надёжность;
наличие реализации СУБД для ОС Linux (кроссплатформенность продукта);
соответствие встроенного языка SQL стандарту ANSI SQL-92;
малые требования к дисковому пространству и памяти;
свободное распространение СУБД в открытых кодах.
Полный листинг кода создания БД на языке SQL (встроенный в InterBase) находится в приложении 20. Поэтапно рассмотрим физическую реализацию БД. Зададим 3 диалект БД и русскую кодировку символов WIN1251. Создаём пустую БД от лица суперпользователя SYSDBA со стандартным паролем “masterkey”. Размер страница БД установлен равным размеру кластера в файловой системе NTFS 4048 байт. Для удаления из строк пробелов и преобразования строк к верхнему регистру были декларированы внешние функции Upper и Trim. Они реализованы на языке программирования Delphi и физически расположены в динамически связуемой библиотеке (DLL) Str.dll.
Каждая из полученных сущностей должна быть представлена базовой таблицей:
Таблица Authors – информация об авторах источников, состоящая из следующих полей:
NumAut – числовое автоинкрементное поле, содержащее номер автора и являющееся ключевым полем отношения;
Author – строковое поле, содержащее фамилию и инициалы автора (группы авторов), являющееся уникальным.
Таблица Titles – информация об названиях источников состоящая из следующих полей:
NumTit – числовое автоинкрементное поле, содержащее номер заглавия и являющееся ключевым полем отношения;
Titles – строковое поле, содержащее название источника и являющееся уникальным.
Таблица Languages – языки источников, состоящая из следующих полей:
NumLan – числовое автоинкрементное поле, содержащее номер языка и являющееся ключевым полем отношения;
Language - строковое поле, содержащее язык источника и являющееся уникальным полем.
Таблица Books – информация об источниках литературы, состоящая из следующих полей:
NumBook – числовое автоинкрементное поле, содержащее номер книги и являющееся ключевым полем отношения;
NumAut – числовое поле, содержащее код (номер) автора в таблице Authors;
NumTit - числовое поле, содержащее код (номер) названия в таблице Titles;
NumLan - числовое поле, содержащее код (номер) языка в таблице Languages;
Sections – текстовое (мемо) поле, содержащее список тем, связанных с источником;
Atchive – строковое поле, содержащее полное файловое имя архива источника;
MainFile – строковое поле, содержащее имя главного файла источника.
Таблица Books связана с таблицами Authors, Titles, Languages типом связи “один-ко-многим” посредством внешних ключей NumAut, NumTit и NumLan.
Создаём таблицу Authors с непустыми полями NumAut типа INTEGER и Author типа VARCHAR длиной 50 символов, поле NumAut является первичным ключом, а Author уникальным полем. Аналагично создаём таблицу Titles с непустыми полями NumTit типа INTEGER и Title типа VARCHAR длиной 200 символов, поле NumTit является первичным ключом, а Title уникальным полем. Также создаём таблицу Languages с непустыми полями NumLan типа INTEGER и Language типа VARCHAR длиной 20 символов, поле NumLan является первичным ключом, а Language уникальным полем. Наконец создаём таблицу Books с полями NumLan – непустое поле типа INTEGER, являющееся первичным ключом таблицы; NumAut - поле типа INTEGER; NumTit - поле типа INTEGER; NumLan - поле типа SMALLINT; Sections – поле типа BLOB подтипа TEXT; Archive – непустое поле типа VARCHAR длиной 32765 байт и MainFile – непустое поле типа VARCHAR длиной 255 байт. Также на таблицу Books накладываются ограничения, посредством задания внешних ключей NumAut, NumTit и NumLan, которые связаны с аналогичными полями в таблицах Authors, Titles и Languages.
Для того, чтобы поля таблиц NumBook, NumAut, NumTit и NumLan автоматически увеличивались при добавлении новой записи необходимо задать создать генераторы. Назовём их GenBook, GenAut, GenTit и GenLan для соответственно. Для их увеличения созданы триггеры InsBook, InsAut, InsTit и InsLan, которые активизируются перед занесением новой записи в соответствующую таблицу и выполняют увеличение генераторов на единицу посредством вызова встроенной процедуры GEN_ID.
Создадим представление (VIEW), которое состоит из следующих полей Number, Author, Title, Language, Sections, Archive и File. Они являются результатом выборки следующих полей таблиц Books.NumBook, Authors.Author, Titles.Title, Languages.Language, Books.Sections, Books.Archive, Books.MainFile, при условии
Books.NumAut=Authors.NumAut AND
Books.NumTit=Titles.NumTit AND
Books.NumLan=Languages.NumLan.
Это представление предназначено для скрытия реальной структуры БД от пользователя и облегчения использования БД прикладными программистами.
Для добавления, изменения и удаления записей из таблиц БД и других целей предусмотрены ряд хранимых процедур:
DeleteAll – очистка всей БД (удаление всех записей во всех таблицах) и обнуление генераторов;
DeleteBook – удаление заданного источника;
InsertBook – вставка нового источника;
SearchBook – поиск источника по заданным атрибутам с учётом регистра символов;
SearchUpBook - поиск источника по заданным атрибутам без учёта регистра символов;
UpdateAuthor – изменение автора источника;
UpdateBook – изменение атрибутов источника;
UpdateTilte – изменение названия источника;
UpdateLanguage – изменение языка источника;
IsWriter – проверка прав пользователя на изменение БД.
Для управления безопасностью БД созданы три роли:
Admin – имеет права на любые действия с БД (чтение, изменение структуры и данных);
Writer – имеет права на чтение и изменение данных БД, но не имеет прав на изменение структуры БД;
Reader – имеет права только на чтение данных БД.
Эти роли, исходя из выше сказанного, наделены соответствующими правами на соответствующие таблицы и хранимые процедуры.
5. РАЗРАБОТКА ПРИЛОЖЕНИЯ-КЛИЕНТА
5.1 Обоснование выбора среды программирования
Разработка клиентского приложения осуществлялось на языке Delphi (ранее Object Pascal) в среде программирования Borland Delphi 7.0 Enterprise Edition.
Сформулируем основные критерии, по которым производился выбор среды программирования для создания приложения.
Создание максимально возможного удобства в работе. Для этого программа должна иметь удобный и современный интерфейс пользователя.
Работа модуля должна выполняться с максимально возможной скоростью. Нежелательны ситуации, в которых пользователю длительное время придется ожидать окончания работы модуля.
Поддержка длинных имен файлов.
Минимальные затраты на разработку модуля.
Максимальная переносимость исходного кода программы для платформы Linux.
В ходе последующего анализа имеющихся средств программирования на основании перечисленных критериев был выбран вариант написания данного модуля с использованием системы визуального программирования Borland Delphi 7.0. Данное заключение основывалось на следующем.
Среда визуального программирования Delphi 7.0 работает в среде Windows 9x/NT/2000/XP и предоставляет программисту возможность реализации всех достоинств графического интерфейса этой системы. Так как подавляющее большинство пользователей персональных компьютеров работают сегодня в среде операционных систем семейства Windows, то этот интерфейс является для них наиболее привычным и удобным.
Многие системы разработки приложений для ОС Windows генерируют код-полуфабрикат, который не может быть выполнен процессором без дополнительной трансляции во время работы самой программы, что существенно снижает производительность компьютера. Delphi же использует настоящий компилятор и компоновщик и генерирует стопроцентный машинный код. Такая реализация лишена непроизводительных затрат, что делает программы, написанные на Delphi, максимально эффективными.
Так как Delphi 7.0 является средой программирования для Windows, то, как и сама операционная система Delphi поддерживает длинные имена файлов и папок.
Для запуска программ, написанных на Delphi, не требуются никакие дополнительные библиотеки, интерпретаторы кода и прочее. Достаточно взять один-единственный сгенерированный исполняемый файл и запустить его там, где нужно. Для установки программы на другой компьютер не требуется создание каких-либо дистрибутивов, не нужен процесс инсталляции, достаточно переписать исполняемый файл программы.
Среда визуального программирования Delphi 7.0 является мощным средством для быстрой и качественной разработки программ для операционной системы Windows 95. Имеющаяся библиотека визуальных компонентов позволяет создать интерфейс с пользователем за считанные минуты. Объектно-ориентированный язык Object Pascal, положенный в основу Delphi, является расширением языков Turbo Pascal и Borland Pascal фирмы Borland и нашел в себе отражение новых веяний в программировании. Компонентный принцип, используемый в Delphi, позволяет создавать полноценные Windows-приложения, написав минимальное количество строк кода. Delphi представляет собой открытую систему, позволяя добавлять свои компоненты в систему, модифицировать уже имеющиеся стандартные компоненты благодаря тому, что предоставлены их исходные тексты. Благодаря всему этому разработка программ в среде Delphi становится легкой и приятной.
Также, вследствие того, что большинство компонентов Delphi 7.0 идентично компонентам Kylix, то переход под платформу Linux будет занимать минимально возможное время.
Таким образом, выбранная платформа, как было показано выше, удовлетворяет поставленным требованиям, поэтому выбор был остановлен на данной системе программирования.
5.2 Средства Delphi для работы с базами данных
Хотя Delphi не имеет своего формата таблиц БД, она тем не мене обеспечивает мощную поддержку различных СУБД – как локальных (например, dBase или Paradox), так и промышленных (например, Sybase или InterBase). Средства Delphi для работы с БД можно разделить на три вида:
1) инструментальные средства;
2) компоненты.
К инструментальным средствам относятся специальные программы и пакеты, обеспечивающие обслуживание БД вне разрабатываемых приложений. Компоненты предназначены для создания приложений, осуществляющих операции с БД.
Для операций с БД система Delphi предлагает следующий набор инструментальных средств.
Borland Database Engine (BDE) – процессор баз данных, который представляет собой набор динамических библиотек и драйверов, предназначенных для организации доступа к БД из Delphi-приложений. BDE является центральным звеном при организации доступа к данным.
BDE Administrator – утилита для настройки различных параметров BDE.
Database Desktop – программа создания и редактирования таблиц, SQL- запросов и запросов QBE.
SQL Explorer – проводник БД, позволяющий просматривать и редактировать БД и словари данных.
SQL Builder – программа визуального конструирования SQL-запросов.
SQL Monitor – программа отслеживания порядка выполнения SQL-запросов к удалённым БД.
Data Pump – программа для переноса данных между БД.
IBConsole – программа для управления удалёнными БД.
InterBase Sever Manager – программа для запуска сервера InterBase.
SQL Links – драйверы для доступа к удалённым промышленным СУБД, таким как Microsoft SQL Server или Oracle. К промышленному серверу InterBase, который поставляется совместно с Delphi и является для него родным, доступ также можно организовать напрямую через BDE, не используя драйверы SQL-Links.
dbExpress – набор драйверов для доступа к базам данных SQL с помощью таких компонентов, как SQLConnection, SQLDataSet, SQLQuery, SQLStoredProc и SQLTable. dbExpress включает в свой состав следующие драйверы:
InterBase – DBEXPINT.DLL;
DB2 – DBEXPDB2.DLL;
Oracle – DBEXPORA.DLL;
MySQL – DBEXPMYS.DLL.
InterBase Server – клиентская и серверная часть SQL.
Компоненты, предназначенные для работы с БД, находятся на страницах Data Access, Data Control, dbExpress, BDE, ADO, Decision Cube, QReport и InterBase палитры компонентов. Некоторые компоненты предназначены специально для работы с удалёнными БД в архитектуре “клиент-сервер”.
5.3 Реализация приложения
5.3.1 Общее описание форм и модулей
Для реализации интерфейса с базой данных был выбран набор компонентов прямого доступа к серверу InterBase. Этот выбор имеет ряд преимуществ по сравнению с другими группами компонентов. Основным преимуществом является то, что данный набор компонент предназначен специально для доступа к СУБД InterBase и он позволяет более произвести более тонкие настройки приложения. Нет необходимости установки совместно с программой BDE или копирования библиотек драйверов для доступа к серверу, что способствует экономии дискового пространства и времени при установке. Также компоненты InterBase в Delphi аналогичны компонентам InterBase в Kylix, что существенно снижает затраты при смене платформы приложения.
Листинг файла проекта приложения (Lib.dpr) расположен в приложении Б.
В соответствии с требованиями к приложению для обеспечения заданной функциональности в нём реализованы следующие формы и модули.
MainForm (см. приложение А, рис. А.1), наследник типа TForm – основная форма приложения. На ней располагается ряд визуальных и невизуальных компонентов, обеспечивающих отображение данных, главное меню приложения, навигационный и управляющий интерфейс БД, обработку событий приложения и настройку вида программы. Форме соответствует модуль Main (см. приложение В).
DataModule1 (см. приложение А, рис. А.2), наследник типа TDataModule – простой модуль данных, являющийся контейнером для невизуальных компонентов, реализующих взаимодействие приложения с БД. Данной форме соответствует модуль DBUnit (см. приложение Г).
EditForm (см. приложение А, рис. А.3), наследник типа TForm – диалоговое окно редактирования (добавления/изменения) записей БД. Форме соответствует модуль Edit (см. приложение Д).
DeleteForm (см. приложение А, рис. А.4), наследник типа TForm – диалоговое окно подтверждения удаления текущей записи БД. Форме соответствует модуль Delete (см. приложение Е).
FilterForm (см. приложение А, рис. А.5), наследник типа TForm – диалоговое окно задания фильтра БД. Данной форме соответствует модуль Filter (см. приложение Ж).
FindForm (см. приложение А, рис. А.6), наследник типа TForm – диалоговое окно поиска необходимых записей БД. Код формы реализован в модуле Find (см. приложение З).
DirSourceForm (см. приложение А, рис. А.7), наследник типа TForm – диалоговое окно выбора каталога, содержащего файлы источника. Код реализации формы располагается в модуле DirSource (см. приложение И).
PathForm (см. приложение А, рис. А.8), наследник типа TForm – диалоговое окно задания пути к БД. Форме соответствует модуль Path (см. приложение К).
UserForm (см. приложение А, рис. А.9), наследник типа TForm – диалоговое окно выбора пользователя программы. Форме соответствует модуль User(см. приложение Л).
AboutBox (см. приложение А, рис. А.10), наследник типа TForm – окно информации о программе, данной форме соответствует модуль About (см. приложение М).
Модуль Data содержит строковые, числовые и прочие константы, используемые другими модулями (см. приложение Н).
Модуль Files содержит подпрограммы манипулирования файлами, упаковкой/распаковкой файлов и запуском внешних программ (см. приложение О).
Все визуальные компоненты всех форм для удобства пользователя и увеличения его скорости работы снабжены всплывающими подсказками. Визуальные компоненты, расположенные на главной форме приложения также снабжены дополнительными подсказками, отображающимися в строке статуса. Для того чтобы подсказки отображались, свойство ShowHint всех визуальных компонентов и элементов списка действий ActionList1 устанавливаются в True.
5.3.2 Форма MainForm и модуль Main
Форма MainForm является основным окном программы и контейнером для визуальных и невизуальных компонентов. На ней располагаются следующие невизуальные компоненты.
При создании формы, для обработки события MainForm.OnCreate, выполняется метод TMainForm.FormCreate, в котором инициализируются начальными значениями глобальные переменные и создаются временные каталоги.
При активизации формы и возникновении события MainForm.OnActivate, выполняется метод TMainForm.FormActivate. В нём первоначально восстанавливаются параметры приложения путём считывания их из файлов инициализации при помощи метода TMainForm.RestoreIniFiles. Затем делается попытка соединится с БД (вызов метода DataModule1.InitDBParams), и если она успешна, то устанавливается уровень доступа пользователя (метод DataModule1.SetAccess) и таблица заполняется данными (метод MainForm.DataSetRefrashExecute). В противном случае работа программы завершается.
При уничтожении формы возникает событие OnDestroy, обработка которого осуществляется методом TMainForm.FormDestroy. В ходе его выполнения процедурой Files.DeleteFiles удаляются все временные файлы, затем удаляются все временные каталоги и методом MainForm. SaveIniFiles сохраняются все настройки программы в файле инициализации.
Для сохранения и восстановления настроек программы используются методы TMainForm.SaveIniFiles и TMainForm.RestoreIniFiles.
Компонент ImageList1 типа TImageList – список иконок и рисунков, используемых приложением. Список заполняется вручную на этапе проектирования программы и в дальнейшем не изменяется. Элементы списка используются для прорисовки изображений на кнопках, в главном меню и всплывающих меню.
Компонент ActionList1 типа TActionList – список управляющих элементов программы. Это ключевой невизуальный компонент приложения, он обеспечивает синхронизацию необходимых действий программы при возникновении некоторых событий. ActionList1 содержит ряд элементов (объектов) типа TAction, сгруппированных по следующим категориям:
DataSet - объекты действий для обработке баз данных;
File – объекты действий для задания имени пользователя и пути к фалу БД, а также выход из программы;
Help – объект действия для получения справки о программе;
Options – объекты действий для задания настроек программы;
SortBy – объекты действий для задания поля БД, по которому будет осуществляться сортировка выводимых в таблице записей;
SortDir – объекты действий для задания направления сортировки записей в таблице (по возрастанию или по убыванию).
Рассмотрим подробно элементы списка действий ActionList1.
Объекты DataSetFirst, DataSetPrior, DataSetNext, DataSetLast категории DataSet предназначены для перемещения указателя БД соответственно к первой, предыдущей, следующей или последней записи. Они является стандартными предопределёнными действиями Delphi.
Объект DataSetInsert категории DataSet предназначен для вставки новой записи в БД. Обработка действия осуществляется методом TMainForm.DataSetInsertExecute, в котором активизируется форма редактирования записи EditForm, а ей поля редактирования принимают пустые значения. Затем, по закрытии формы редактирования записей, значения её полей ввода передаются процедуре DataModule1.CallInsertBook, которая создаёт новую запись в БД. Таблица БД обновляется (действие DataSetRefresh) и указатель устанавливается на новую запись (процедура DataModule1.IBDataSet1.Locate). Для быстрой активизации действия предусмотрено сочетание клавиш Ctrl+I.
Объект DataSetUpdate категории DataSet предназначен для изменение существующих записей БД. Обработка действия осуществляется при помощи метода TMainForm.DataSetUpdateExecute, который аналогичен методу TMainForm.DataSetInsertExecute. Отличием является то, что поля редактирования формы EditForm заполняется не пустыми значениями, а значениями редактируемой записи БД. Значения полей ввода формы передаются процедуре DataModule1.CallUpdateBook, которая редактирует выбранную запись в БД. Для активизации действия можно использовать сочетание клавиш Ctrl+E.
Объект DataSetUpdate категории DataSet предназначен для удаления существующих записей БД. Обработка действия осуществляется методом TMainForm.DataSetDeleteExecute. В нём в зависимости от установки соответственного флажка в настройках программы может запрашиваться подтверждение для удаления (для этого активизируется форма DeleteForm). Далее вызывается процедура DataModule1.CallDeleteBook, которая и осуществляет удаление. Для быстрой активизации действия предусмотрено сочетание клавиш Ctrl+D.
Объект DataSetRefrash категории DataSet предназначен для обновления таблицы БД. Обработка действия осуществляется методом TMainForm.DataSetRefrashExecute. При обновлении СУБД передаются запрос на выборку всех записей БД, отсортированных в заданном порядке. Сортировка записей БД осуществляется в зависимости от текущих настроек. Перед обновлением делается закладка на текущий курсор БД, затем после обновления указатель опять устанавливается на ту же запись. Возможна быстрая активизация действия при нажатии клавиш Ctrl+R.
Объект DataSetOpen категории DataSet предназначен для открытия существующего в базе источника для чтения/редактирования. Обработка действия осуществляется методом TMainForm.DataSetOpenExecute. Алгоритм работы метода следующий. Увеличивается глобальный счётчик открытых файлов источников, затем по его значению задаётся название новой папки, в которую распаковываются файлы источника при помощи функции UnPackFiles модуля Files. Далее процедурой Files.OpenFile открывается главный файл источника. Возможна быстрая активизация действия при нажатии клавиш Ctrl+O.
Объект DataSetFind категории DataSet предназначен для поиска существующей в БД записи по задаваемым атрибутам. Обработка действия осуществляется методом TMainForm.DataSetFindExecute. В его теле активизируется форма поиска записи БД FindForm, при помощи обработки событий которой и осуществляется поиск. Далее, в случае если в курсор БД находится не на последней записи, становится доступным действие DataSetFindNext. Для активизации действия возможно использование сочетания клавиш Ctrl+F.
Объект DataSetFindNext категории DataSet предназначен для поиска следующей существующей в БД записи по атрибутам, заданным в действии DataSetFind. Обработка действия осуществляется методом TMainForm.DataSetFindNextExecute. Алгоритм работы метода следующий. Из полей ввода формы FindForm процедурой FindForm.GetLocateParams считываются значения – атрибуты искомой записи. Затем они передаются стандартному методу поиска TIBDataSet.LocateNext, который осуществляет поиск и возвращает указатель на искомую запись. Так как данное действие может повторяться подряд большое количество раз, то для ускорения его активизации предусмотрена горячая клавиша F3.
Объект DataSetFilter категории DataSet предназначен для локальной фильтрации записей БД по задаваемым атрибутам. Обработка действия осуществляется методом TMainForm.DataSetFilterExecute. В ходе выполнения метода активизируется форма FilterForm. И на её обработчики событий возлагается вся дальнейшая работа по фильтрации записей.
Объект DataSetAll категории DataSet предназначен для отмены локальной фильтрации записей БД. Обработка действия осуществляется методом TMainForm.DataSetAllExecute, в котором сбрасывается флаг фильтрации Filtered объекта IBDataSet1, используемого для доступа к БД.
Объект FileDataBasePath категории File предназначен задания пути к файлу БД. Обработка действия осуществляется методом TMainForm. FileDataBasePathExecute. В ней активизируется диалоговое окно задания маршрута, и затем обработчиками событий этой формы выполняются все необходимые действия. После закрытия диалогового окна, происходит обновление данных путём вызова метода TMainForm.DataSetRefrashExecute.
Объект FileUser категории File предназначен задания пути к файлу БД. Обработка действия осуществляется методом TMainForm. FileUserExecute. В ней активизируется диалоговое окно задания пользователя программы, и затем обработчиками событий этой формы выполняются все необходимые действия. После закрытия диалогового окна, происходит попытка установить соединение с БД с новыми параметрами (имя и пароль пользователя) при помощи вызова метода DataModule1.Connect. Праметры пользователя считываются из соответствующих полей ввода формы UserForm. Если соединение неудачно, то приложение автоматически прекращает свою работу, иначе данные в таблице обновляются путём вызова метода TMainForm.DataSetRefrashExecute. Далее при помощи метода DataModule1.SetAccess устанавливается уровень доступа данного пользователя к БД (чтение/изменение или только чтение). В зависимости от уровня доступа становятся доступными или недоступными действия вставки (DataSetInsert), изменения (DataSetUpdate) и удаления (DataSetDelete) записей БД.
Объект FileExit категории File предназначен для завершения работы приложения. Он является стандартным предопределённым объектом Delphi.
Объект HelpAbout – единственный объект категории Help предназначен для активизации информационного окна программы. Это осуществляется путём вызова метода TMainForm.HelpAboutExecute.
Объект OptColor категории Options предназначен для задания цвета фона сетки БД, поля ссылок и полей редактирования. Это осуществляется путём вызова метода TMainForm.OptColorExecute. В нём сначала активируется стандартный диалог выбора цвета ColorDialog1, а затем выбранный цвет присваивается соответственным свойствам упомянутых объектов.
Объект OptFont категории Options предназначен для задания шрифта сетки БД, поля ссылок и полей редактирования. Это осуществляется путём вызова метода TMainForm.OptFontExecute. В нём сначала активируется стандартный диалог выбора шрифта FontDialog1, а затем выбранный шрифт присваивается соответственным свойствам упомянутых объектов.
Объект OptConfDel категории Options предназначен для включения/выключения запроса на подтверждение удаления записи БД. Обработка действия осуществляется методом TMainForm.OptConfDelExecute. При его вызове изменяется значение флага подтверждения удаления ConfirmDelete на противоположное. Для того чтобы объект переходил из выбранного в невыбранное состояние автоматически его свойство AutoCheck установлено в True.
Объекты SortByNum, SortByAut, SortByTit, SortByLan, SortByNo категории SortBy предназначены для задания поля БД, по которому осуществляется сортировка таблицы. Обработка всех действий осуществляется методом TMainForm.RefreshExecute. Для перехода объекта из выбранного в невыбранное состояние автоматически его свойство AutoCheck установлено в True.
Объекты SortdirInc и SortDirDec категории SortDir предназначены для задания направления сортировки БД (по возрастанию или по убыванию). Обработка этих действий осуществляется методом TMainForm.RefreshExecute. Для автоматического перехода объекта из выбранного в невыбранное состояние его свойству AutoCheck присвоено логическое значение True.
Компонент AplicationEvents1 типа TAplicationEvents – основной обработчик событий приложения. В данном приложении на него возложена обработка события OnHint – активизация подсказки. Обработка осуществляется методом TMainForm.ApplicationEvents1Hint, где в строку состояния программы подставляется текущая подсказка приложения, которая в свою очередь берётся из свойства Hint компонента, над которым в данное время расположен курсор.
Компоненты ColorDialog1 типа TColorDialog и FontDialog1 типа TFontDialog предназначены для выбора цветов и шрифтов соответственно. Они реализуют стандартные диалоговые окна и используются в действиях OptColor и OptFont.
Компонент TMainMenu1 типа TMainMenu реализует главное меню программы. Он является контейнером для объектов типа TMenuItem, реализующие пункты главного и выпадающего меню. Все пункты главного меню связаны с элементами списка действий ActionList1 посредством задания в их свойствах Action имён соответствующих объектов действий. Рассмотрим главное меню поэлементно.
“Файл” (объект mmFile) соответствует категории действий File и открывает выпадающее меню, содержащее следующие пункты:
“Путь к базе данных” (объект mmDataBaseFile) связан с действием FileDataBasePath;
“Пользователь” (объект mmUser) связан с действием FileUser;
“Выход” (объект mmExit) связан с действием FileExit.
“Таблица” (объект mmTable) соответствует категории действий DataSet и открывает выпадающее меню, содержащее следующие пункты:
“В начало” (объект mmFirst) связан с действием DataSetFirst;
“Назад” (объект mmPrior) связан с действием DataSetPrior;
“Вперёд” (объект mmNext) связан с действием DataSetNext;
“В конец” (объект mmLast) связан с действием DataSetLast;
“Вставить” (объект mmInsert) связан с действием DataSetInsert;
“Удалить” (объект mmDelete) связан с действием DataSetDelete;
“Редактировать” (объект mmUpdate) связан с действием DataSetUpdate;
“Обновить” (объект mmRefrash) связан с действием DataSetRefrash;
“Открыть” (объект mmOpen) связан с действием DataSetOpen;
“Найти” (объект mmFind) связан с действием DataSetFind;
“Найти далее” (объект mmFindNext) связан с действием DataSetFindNext;
“Фильтр” (объект mmFilter) связан с действием DataSetFilter;
“Показать всё” (объект mmAll) связан с действием DataSetAll;
“Сортировка” (объект mmSort) соответствует двум категориям действий SortBy и SortDir. Данный пункт открывает выпадающее меню, содержащее следующие пункты:
“По номеру” (объект mmSortByNum) связан с действием SortByNum;
“По автору” (объект mmSortByAut) связан с действием SortByAut;
“По названию” (объект mmSortByTit) связан с действием SortByTit;
“По языку” (объект mmSortByLan) связан с действием SortByLan;
“Отсутствует” (объект mmSortByNo) связан с действием SortByNo;
“По возрастанию” (объект mmSortDirInc) связан с действием SortDirInc;
“По убыванию” (объект mmSortDirDec) связан с действием SortDirDec;
“Настройка” (объект mmOptions) соответствует категории действий Options и открывает выпадающее меню, содержащее следующие пункты:
“Цвет” (объект mmColor) связан с действием Opt Color);
“Шрифт” (объект mmFont) связан с действием OptFont;
“Подтверждение удаления” (объект mmConfDel) связан с действием OptConfDel;
“Помощь” (объект mmHelp) соответствует категории действий Help и открывает выпадающее меню, содержащее единственный пункт “О программе” (объект mmAbout), который связан с действием HelpAbout.
Для того чтобы в пунктах меню прорисовывались изображения, в свойстве компонента TMainMenu.Images задано имя списка изображений ImageList1.
Компонент ToolBar1 типа TToolBar является панелью инструментов и предназначен для быстрого вызова основных функций (действий) программы. Он содержит ряд быстрых кнопок типа TToolButton, нажатие на которые активизирует то или иное действие. Все кнопки связаны с определённым действием категории DataSet из списка действий ActionList1, то есть у них в свойство Action заданы имена соответствующих объектов действий. Для того, чтобы кнопки содержали изображения, в свойство компонент Images задано имя списка изображений ImageList1.На панели инструментов расположены следующие кнопки:
TBFirst связана с действием DataSetFirst;
TBPrior связана с действием DataSetPrior;
TBNext связана с действием DataSetNext;
TBLast связана с действием DataSetLast;
TBInsert связана с действием DataSetInsert;
TBDelete связана с действием DataSetDelete;
TBUpdate связана с действием DataSetUpdate;
TBRefarsh связана с действием DataSetRefarsh;
TBOpen связана с действием DataSetOpen;
TBFind связана с действием DataSetFind;
TBFindNext связана с действием DataSetFindNext;
TBFilter связана с действием DataSetFilter;
TBAll связана с действием DataSetAll.
Компонент Edit1 типа TEdit предназначен для редактирования ячеек таблицы. В основном он находится в невидимом состоянии, а становится видным, только когда фокус ввода перейдёт на определённую ячейку таблицы. Он располагается поверх нее, и весь ввод осуществляется через данный компонент. В этот компоненте прописан единственный метод – обработчик события OnExit TMainForm.Edit1Exit. В обработчике изменяется значение соответствующей ячейки на новое, путём вызова ранимой процедуры, а затем обновляется вся таблица.
Компонент StatusBar1 типа TStatusBar предназначен для вывода расширенных подсказок об визуальных компонентах формы, над которыми в данный момент расположен курсор мыши.
Компонент PanelMain типа TPanel является контейнером для двух других панелей (объектов типа TPanel) PanelGrid, PanelMemo и разделителя Splitter1 типа TSplitter. Объект Splitter1 располагается между панелями PanelGrid и панель PanelMemo и предоставляет возможность изменять их размеры. Компонент PanelGrid в свою очередь является контейнером для таблицы DBGrid1 типа TDBGrid и панели Panel2 типа TPanel, содержащей название таблицы. Компонент PanelMemo также является контейнером для редактора DBMemo1 типа TDBMemo и панели Panel1 типа TPanel, содержащей заголовок редактора.
Компонент DBMemo1 связан с мемо-полем БД Sections и предназначен для его отображения на форме. Связь между данным компонентом и БД устанавливается посредством задания свойству DataSource значения DataModule1.DataSource1.
Компонент DBGrid1 связан с БД и предназначен для отображения представления VBooks на форме. Связь между данным компонентом и БД устанавливается посредством задания свойству DataSource значения DataModule1.DataSource1. В данном компоненте прописаны обработчики трёх событий OnColExit, OnDrawColumnCell и OnKeyPress. В методе TMainForm.DBGrid1ColExit при выходе из ячейки таблицы поле редактирования Edit1 снова становится невидимым. В обработчике события TMainForm.DBGrid1DrawColumnCell вместо прорисовки ячейки таблицы прорисовывается поле редактирования Edit1 и весь ввод направляется к нему. В методе TMainForm.DBGrid1KeyPress в случае нажатия клавиши Enter фокус ввода перемещается на компонент Edit1.
база файл домен сервер
5.3.3 Модуль данных DataModule1 и модуль DBUnit
Модуль данных DataModule1 типа TdataModule является контейнером для невизуальных компонентов, связанных с БД. Также он включает в себя методы для установления параметров, уровня доступа и соединения с БД, вызова хранимых процедур и фильтрации БД. Ниже рассмотрим все данные методы и объекты.
Метод TDataModule1.Connect производит соединение с БД. Сначала Определяются параметры соединения (диалект SQL, кодировка символов, имя и пароль пользователя, путь к базе данных), затем непосредственно осуществляется соединение.
Метод TDataModule1.InitDBParams начальную инициализацию параметров соединения с БД и далее вызывает метод TDataModule1.Connect для осуществления соединения. Параметры берутся из командной строки, а если они отсутствуют, то из файла инициализации программы.
Метод TDataModule1.SetAccess осуществляет установку уровня доступа пользователя (возможность просмотра/изменения или только возможность просмотра данных ДБ) путём вызова хранимой процедуры IsWriter. В случае, если не возникает исключения, то пользователь обладает полным доступом, в ином случае – только просмотр.
Три следующих метода TDataModule1.CallInsertBook, TDataModule1.CallDeleteBook и TDataModule1.CallUpdateBook осуществляют соответственно вставку нового источника, удаления существующего источника или редактирования существующего источника посредством вызова хранимых на стороне сервера процедур InsertBook, DeleteBook и UpdateBook.
Метод TDataModule1.SetFilter устанавливает заданные параметры фильтрации записей БД и включает режим локальной фильтрации.
Метод TDataModule1.IsFieldContainStr проверяет, содержит ли заданное поле заданную подстроку.
Объект IBTransaction1 типа TIBTransaction предназначен для осуществления транзакций БД. Он связывается с компонентом БД посредством задания его свойству DefaultDatabase значения IBDatabase1.
Объект IBDatabase1 типа TIBDatabase предназначен для осуществления соединений с БД. Он связывается с компонентом транзакций посредством задания его свойству DefaultTransaction значения IBTransaction1.
Компонент IBDataSet1 типа TIBDataSet предназначен для манипулирования набором данных, получаемом посредством SQL-запроса к БД. Для соединения с БД свойству компонента Database присваивается имя IBDatabase1. Он связывается с компонентом транзакций посредством задания его свойству Transaction значения IBTransaction1. Объект имеет два определённых обработчика событий AfterScroll и OnFilterRecord.
Компонент IBStoredProc1 типа TIBStoredProc предназначена для вызова хранимых на сервере процедур вставки, удаления источников и проверки доступа. Компонент связан с объектами IBDatabase1 и IBTransaction посредством задания соответствующих свойств.
Компонент DataSource1 типа TDataSource предназначен для связи набора данных БД с таблицей БД, то есть является источником данных для таблицы MainForm.DBGrid1. Используется набор данных IBDataSet1.
5.3.4 Форма EditForm и модуль Edit
Форма EditForm представляет собой диалоговое окно, предназначенное для задания пользователем атрибутов новой или редактируемой записи. Форма является контейнером для визуальных компонентов и одного невизуального компонента OpenDialogArc типа TOpenDialog. Он является стандартным диалогом Delphi для открытия файла и предназначен для выбора архива, содержащего файлы источника.
При активизации формы, выполняется метод EditForm.FormActivate, который в свою очередь для каждого комбинированного списка вызывает метод TEditForm.SetComboBox, в котором он заполняется соответствующими значениями из БД.
Ниже рассматриваются все визуальные компоненты формы.
На форме располагаются две панели типа TPanel: Panel1 и Panel2. Они выполняют роль контейнеров для других визуальных элементов и предназначены для облегчения проектирования формы и улучшения её дизайна. На панели Panel1 расположены управляющие кнопки окна, а на панели Panel2 поля ввода, метки к ним и переключатели.
Управляющие кнопки окна представляют собой компоненты BOK и BCancel типа TbitBtn и предназначены для подтверждения (внесения в БД) или отмены введённых в полях ввода данных. Они я являются кнопками предопределенных типов. Свойству Kind этих компонентов присвоены значения bkOK и bkCancel соответственно. Кнопка BOK генерирует результат закрытия формы mrOK, а BCancel mrCancel, которые обрабатываются в соответствующих процедурах.
На панели Panel2 располагаются GroupBoxData типа TGroupBox, GroupBoxSection типа TGroupBox, RadioGroupSource типа TRadioGroup и GroupBoxPath типа TGroupBox.
Компонент GroupBoxData предназначен для выделения компонентов ввода параметров источника и является контейнером для комбинированных списков ввода параметров (типа TComboBox) и меток к ним (типа TLabel): ComboBoxAut и LabelAut – автор источника, ComboBoxTit и Labeltit – название источника, ComboBoxLan и LabelLan – язык источника.
Компонент GroupBoxSource предназначен для выделения поля ввода/редактирования тем, связанных с источником, Memo1 типа TMemo и является контейнером для него.
Компонент RadioGroupSource предназначен для выбора физического расположения файлов источника (дисковый каталог, файл архива или одиночный файл).
Компонент GroupBoxPath предназначен для выделения компонентов ввода путей к файлу (файлам) источника и является контейнером для меток к полям редактирования типа TLabel, полей ввода типа TEdit и кнопок типа TBitBtn для активизации диалогов поиска элементов ввода.
5.3.5 Форма DeleteForm и модуль Delete
Форма DeleteForm представляет собой диалоговое окно, предназначенное для подтверждения или отмены пользователем удаления выбранной записи. Форма является контейнером для пяти визуальных компонентов.
Компонент Bevel1 типа TBevel предназначен для выделения каймой изображения и текста. Компонент Image1 типа TImage выводит на форму изображение для большей наглядности диалогового окна. Компонент Label1 типа TLabel представляет собой вопрос диалогового окна. Компонент BNo и BYes типа TBitBtn являются управляющими кнопками окна и предназначены для подтверждения или отмены удаления.
5.3.6 Форма FindForm и модуль Find
Форма FindForm представляет собой диалоговое окно, предназначенное для задания атрибутов поиска записи в БД. Форма является контейнером для ряда визуальных компонентов. В данном компоненте определён обработчик события OnDeactivate – метод TFindForm.FormDeactivate, в котором, в случае задания пользователем, производится поиск записи стандартным методом Locate.
Форма делится на две части панелями Panel1 и Panel2 типа TPanel. На объекте Panel1 расположены управляющие кнопки BOK и BCancel типа TBitBtn, предназначенные для начатия поиска или его отмены. На панели Panel2 расположены компоненты групп gbValue и gbParam типа TGroupBox. В группу gbValue включены поля редактирования типа TEdit и метки к ним типа Tlabel для задания искомых значений. Поле EditNum и метка LabelNum служат для задания номера источника, поле EditAut и метка LabelAut – задание автора, поле EditTit и метка LabelTit – задание названия, поле EditLan и метка LabelLan– задание языка, поле EditSec и метка LabelSec – задание темы. В группу gbParam включены переключатели с независимой фиксацией типа TCheckBox: CheckBoxCase, предназначенный для задания поиска с учётом регистра символов, и CheckBoxsub>Str, предназначенный для задания поиска с учётом подстрок.
5.3.7 Форма FilterForm и модуль Filter
Форма FilterForm представляет собой диалоговое окно, предназначенное для задания атрибутов фильтрации записи в БД. Форма является контейнером для ряда визуальных компонентов. В данном компоненте определён обработчик события OnDeactivate – метод TFindForm.FormDeactivate. В котором, в случае задания пользователем, производится установка фильтра при помощи вызова метода DataModule1.SetFilter.
Форма делится на две части панелями Panel1 и Panel2 типа TPanel. На объекте Panel1 расположены управляющие кнопки BBOK и BBCancel типа TBitBtn, предназначенные для задания начала фильтрации или выхода из диалогового окна. На панели Panel2 расположены компонент групп GBFilterValue и независимый переключатель CBCase типа TCheckBox, задающий необходимость поиска с учётом регистра символов. В группу GBFilterValue включены поля редактирования типа TEdit и метки к ним типа TLabel для задания допустимых значений. Поле EditAut и метка LabelAut предназначены для задания автора, поле EditTit и метка LabelTit – задание названия, поле EditLan и метка LabelLan– задание языка, поле EditSec и метка LabelSec – задание темы.
5.3.8 Форма DirSourceForm и модуль DirSource
Форма DirSourceForm представляет собой диалоговое окно, предназначенное для выбора каталога, в котором расположены файлы источника. Активация формы происходит при нажатии кнопки просмотра каталогов BBrowseDir на форме EditForm. Форма является контейнером для пяти визуальных компонентов.
Компонент Bevel1 типа TBevel предназначен для выделения каймой списка и дерева каталогов. Компонент BNo и BYes типа TBitBtn являются управляющими кнопками окна и предназначены для подтверждения или отмены выбора каталога.
5.3.9 Форма PathForm и модуль Path
Форма PathForm представляет собой диалоговое окно, предназначенное для задания сетевого пути к файлу БД. Форма является контейнером для ряда визуальных компонентов. В данном компоненте определёны обработчики события OnActivate – метод TPathForm.FormActivate и OnDeactivate – метод TPathForm.FormDeactivate. В первом методе, производится установка начальных значений полей редактирования, а во втором попытка соединится с новым файлом БД. Форма делится на две части панелями Panel1 и Panel2 типа TPanel. На объекте Panel1 расположены управляющие кнопки BBOK и BBCancel типа TBitBtn, предназначенные для задания нового пути или выхода из диалогового окна. На панели Panel2 расположены компоненты поля редактирования с метками типа TLabeledEdit leServer, предназначенный для ввода имени сервера, и leFile, предназначенный для ввода локального пути к файлу БД на сервере.
5.3.10 Форма UserForm и модуль User
Форма UserForm представляет собой диалоговое окно, предназначенное для задания имени пользователя БД. Форма делится на две части панелями Panel1 и Panel2 типа TPanel. На объекте Panel1 расположены управляющие кнопки BBOK и BBCancel типа TBitBtn, предназначенные для задания нового пользователя или выхода из диалогового окна. На панели Panel2 расположены компоненты поля редактирования с метками типа TLabeledEdit leUser, предназначенный для ввода имени пользователя, и lePass, предназначенный для ввода пароля пользователя.
5.3.11 Форма AboutBox и модуль About
Форма AboutBox представляет собой окно, выводящее информацию о программе: название приложения (метка ProductName типа TLabel), версия приложения (метка Version типа TLabel), дата создания приложения (метка Data типа TLabel), авторские права на приложение (метка Copyright типа TLabel), разработчик (метка Comments типа TLabel). Также форма снабжена изображением ProgramIcon типа TImage и кнопкой закрытия окна BitBtnOK типа TBitBtn. Все компоненты, кроме кнопки располагаются на панели Panel1 типа TPanel.
5.3.12 Модуль Files
Модуль Files содержит подпрограммы манипулирования файлами. Функция CopyFiles производит копирование файлов при помощи вызова функции WinAPI SHFileOperation. Процедура DeleteFileExt удаляет расширение в имени файла. Функция DeleteFiles производит удаление файлов при помощи вызова функции WinAPI SHFileOperation. Функция ExtractFileLastDir возвращает каталог нижнего уровня для заданного полного пути файла. Функция GetNewArcName производит поиск нового имени для архива в указанном каталоге в том случае, если уже существует архив с заданным именем. Функция OpenFile открывает заданный файл с помощью зарегистрированных в системе для данного типа файлов средств, это осуществляется путём вызова функций WinAPI FindExecutable и ShellExecute. Функции PackFiles и UnPackFiles выполняют соответственно упаковку и распаковку файлов при помощи архиватора WinRAR (необходимо его наличие в системе). Функция RunApp запускает приложение на выполнения при помощи функции WinAPI CreateProcess, в частности при помощи данной функции выполняется запуск архиватора WinRAR.
6. ЭКОНОМИЧЕСКАЯ ЧАСТЬ
6.1 Предметная область базы данных и её разработка
В данной дипломной работе разработана удалённая база данных и приложение-клиент для доступа к электронным источникам литературы, содержащихся на жёстком диске сервера предприятия в виде файлов и пакетов фалов (текстовых документов различных типов, гипертекста HTML, исполняемых файлов и др.). Архитектура клиент-сервер, используемая при реализации поставленной задачи на данный момент является наиболее прогрессивной. Она даёт возможность разделить задачу на две подзадачи: разработка собственно удалённой базы данных, физически расположённой на сервере и управляемой СУБД, и приложения, осуществляющего доступ к данной базе данных при помощи SQL-запросов и располагающееся на рабочих станциях пользователей сети. При такой реализации нагрузка также распределяется между сервером и рабочими станциями, что позволяет увеличить скорость работы программы.
Каждый источник литературы характеризуется следующими атрибутами: фамилия и инициалы автора (авторов), название источника, язык источника, список тем, к которым относится источник, локальный путь и название архива источника, название основного файла источника.
Разработанная в ходе дипломной работы база данных позволяет увеличить скорость поиска и доступа пользователя к необходимым источникам литературы, позволяет упорядочить и систематизировать их. А это в свою очередь может повлиять на производительность труда пользователя в примерно в 3-4 раза, которому не надо тратить большое количество времени на поиск необходимой информации в подкаталогах и файлах сервера.
6.2 Разработка сетевого графика работ проведения НИР
При подготовке материалов и проведении работ по разработке алгоритмов и написанию программ необходимо координировать время ведения данных работ. Наиболее эффективно такая координация может быть осуществлена при помощи сетевого графика работ, обеспечивающего возможность:
Оценки текущего состояния и предсказание дальнейшего хода работ;
Воздействие на ход реализации процесса, которое обеспечивало бы его выполнение в сжатые строки с наименьшими затратами.
Сетевой график состоит из двух основных элементов: работ и событий. Для событий и работ приняты следующие расчетные параметры.
Для событий:
а) ранний срок свершения событий (j)
,
где - время совершения работ i, j;
б) поздний срок совершения события - минимально допустимый срок совершения относительно исходного события
в) резерв времени события
.
Для работ:
а) сроки начала и окончания работ
раннее начало
раннее окончание
позднее окончание
позднее начало
б) резерв работ
полный резерв работ равен резерву времени максимальному из путей, проходящих через данную работу
частный резерв первого рода – это запас времени, которым можно располагать в предположении, что события свершились в поздние сроки
частный резерв второго рода - это запас времени, которым можно располагать в предположении, что события свершились в ранние сроки
свободный резерв времени – запас времени в случае, когда предшествующие работы заканчиваются в поздние сроки, а последующие начинаются в ранние
Критический путь - самый длинный путь сетевого графика от исходного события до завершающего. События и работы на нем не имеют резервов времени.
Сетевой график представляет собой модель процесса проектирования, которая учитывает длительность работ и связи между ними. На рисунке 4.1. приведен сетевой график с исходными и расчетными данными из таблицы 4.1.
Таблица 6.1. - Перечень событий и работ по выполнению дипломной НИР
Код |
Наименование события |
Код |
Наименование работы |
Кол. испол |
||||
0 |
Назначен руководитель дипломной работы |
0-1 |
Определение темы дипломной работы. Выдача задания на диплом |
2 |
1 |
3 |
2 |
|
1 |
Задание на диплом получено |
1-2 |
Подбор и проработка научной литературы |
1 |
3 |
5 |
4 |
|
2 |
2 |
Подобрана и проработана научная литература |
1-3 |
Проработка технической литературы |
1 |
2 |
4 |
3 |
3 |
Проработана техническая литература в отделе |
2,3-4 |
Аналитическое исследование проблемы |
2 |
2 |
4 |
3 |
|
4 |
Аналитическое исследование |
4-5 |
Написание обзорной части диплома |
1 |
1 |
1 |
1 |
|
5 |
Аналитический обзор |
4-6 |
Построение реляционной модели |
1 |
5 |
7 |
6 |
|
6 |
Реляционная модель построена |
6-7 |
Разработка БД |
1 |
10 |
14 |
12 |
|
7 |
Изучение существующих алгоритмов |
7-8 |
Подготовка базы для построения нового алгоритма |
1 |
17 |
19 |
18 |
|
8 |
Построение алгоритма |
8-9 |
Внесение изменений в алгоритм |
1 |
5 |
7 |
6 |
|
9 |
Модификация алгоритма |
9-10 |
Написание программы |
1 |
6 |
6 |
6 |
|
10 |
Отладка программы на IBM PC |
10-11 |
Проведение тестирования программы |
1 |
4 |
8 |
6 |
|
11 |
Анализ результатов |
11-12 |
Систематизация результатов |
1 |
9 |
13 |
11 |
|
12 |
Написан текст пояснительной записки |
11-13 |
Написания текста пояснительной записки к дипломной работе |
1 |
1 |
2 |
1 |
|
13 |
Плакаты изготовлены |
12,13-14 |
Изготовление плакатов |
2 |
1 |
3 |
2 |
|
14 |
Защита дипломной работы |
13-15 |
Подготовка к защите |
6.3 Расчет сметы затрат на проведение НИР
Выясним затраты на выполнение НИР, необходимые для открытия финансирования.
Представим в таблице 6.2 смету затрат при выполнении НИР.
Таблица 6.2 - Смета затрат на НИР.
N |
Статьи расходов |
Сумма |
1 |
Фонд заработной платы (ФЗП) |
1445 |
2 |
Отчисления на соц. страхование (37,5% от ФЗП) |
296,25 |
3 |
Стоимость потребляемых материалов |
32.5 |
4 |
Затраты на научные командировки |
- |
5 |
Затраты на работы, которые выполняются сторонними организациями, предприятиями |
- |
6 |
Прочие расходы |
60 |
7 |
Накладные расходы (40% от ФЗП) |
316 |
Итого затрат: 2149,75
Таблица 6.3 - Штатное расписание.
№ |
Состав исполнителей |
Часовая ставка, грн |
Кол-во часов |
Сумма зарплаты, Грн |
1 |
Руководитель работы |
5 |
26 |
130 |
2 |
Дипломник (инженер) |
2 |
650 |
1300 |
3 |
Рецензент |
5 |
3 |
15 |
ИТОГО |
1445 |
Таблица 6.4 - Стоимость потребляемых материалов.
N |
Наименование материалов |
Цена единицы |
Количество |
Сумма |
1 |
Папка бумаг для записи |
15 |
1 шт. |
15 |
2 |
Ватман |
1.5 |
5 шт. |
7.5 |
3 |
Катридж для принтера |
14,22 |
1 шт. |
14,22 |
4 |
Дискета |
3 |
1 шт. |
3 |
Итого: 39.72 гр.
ВЫВОД:
В данной работе был разработана база данных и приложение-клиент для быстрого упорядочивания и быстрого доступа к электронным вариантам источников литературы, для этого необходимо финансирование в объеме 2149,75 гривен.
7. ОХРАНА ТРУДА
7.1 Общие вопросы охраны труда
Охрана труда представляет собой систему законодательных актов, социально-экономических, организационных, технических, санитарно-гигиенических и лечебно-профилактических мероприятий и средств, обеспечивающих безопасность, сохранение здоровья и работоспособности человека в процессе труда. 25 ноября 1992 года принят Закон Украины «Об охране труда». Этот закон определяет основные положения по реализации конституционного права граждан на труд, охрану труда, охрану их жизни и здоровья, регулирует взаимоотношения между работниками и администрацией по вопросам охраны труда и распространяется на все виды деятельности. В Украине законодательство по охране труда состоит из Закона “Об охране труда”, Кодекса законов о труде и других нормативных актов. [11].
Улучшение условий труда, повышение его безопасности влияет на производительность труда, качество и себестоимость выпускаемой продукции, а также приводит к снижению производственного травматизма, профессиональных заболеваний, что сохраняет здоровье трудящихся и одновременно приводит к уменьшению затрат на оплату льгот и компенсаций за работу в неблагоприятных условиях, на лечение. Труд человека в современном производстве представляет собой процесс взаимодействия человека и машины, сопровождающийся исключительной, в большинстве случаев непроизвольной мобилизацией психологических и физических функций человека, приводящей в последствии к снижению работоспособности. Поэтому важным является соблюдение оператором режима труда и отдыха. Одним из важных средств охраны труда, обеспечивающим необходимые санитарно-гигиенические условия, сохраняющим здоровье трудящихся на производстве, способствующим высокой производительности труда является производственная санитария. К числу решаемых ею задач относят обеспечение в рабочей зоне микроклимата, требуемого для нормального самочувствия работающего, допустимых уровней шума и доз электромагнитного излучения.
Разработка программных продуктов (прикладных программ, алгоритмов) предполагает использование в качестве аппаратного обеспечения ПЭВМ, дополнительные средства графического вывода (принтер, сканер), а также бытовую технику в виде кондиционера для облегчения работы и поддержания необходимой температуры в помещении.
В таблице 7.1 приведен перечень опасных и вредных производственных факторов, а также источники их возникновения, имеющихся в условиях эксплуатации вышеперечисленного аппаратного обеспечения в соответствии с ГОСТ 12.0.003-74* [12].
Таблица 7.1 – Перечень вредных и опасных производственных факторов
№ |
Наименование фактора |
Источник Возникновения |
Характер Воздействия |
Нормируемый Параметр и нормативное значение |
Нормативный документ |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
Пожароопасность помещения |
Наличие сгораемых материалов (рабочий стол, стул, изоляция, бумага и др.) и источников возгорания |
Вредный |
Категория взрыво-и пожароопасности «В» |
[13], [14], [15], [30] |
2 |
Неудовлетворительные параметры микроклимата |
Неудовлетворительное состояние отопительной и вентиляционной системы, отсутствие кондиционирования |
Вредный |
Относительная влажность ψ[%], скорость движения воздуха V[м/c], температура воздуха t[0C].(таблица 7.2) |
[16] |
3 |
Недостаточная освещённость (естественная и искусственная), прямая и отраженная блесткость |
Неправильное расположение рабочего места, недостаточное количество ламп, |
Вредный |
, (таблица 7.3) |
[17] |
4 |
Повышенный уровень шума |
Работа принтера, вентиляции, систем охлаждения ЭВМ |
Вредный |
Уровень звука 50дБА |
[18] |
5 |
Повышенный потенциал электростатического поля |
Монитор, диэлектрические поверхности |
Вредный |
Напряжённость электрического поля Е = 20 кВ/м |
[19] |
6 |
Электромагнитные поля |
Компьютер |
Вредный |
Напряжённость электрического поля Е = 20 В/м, напряжённость магнитного поля Н = 5 А/м |
[20] |
7 |
Рентгеновское излучение |
Компьютер |
Вредный |
Мощность экспозиционной дозы на расстоянии 5 см от экрана не менее 100мкР/ч |
[21] |
8 |
Ионизация воздуха рабочей зоны |
Рентгеновское излучение монитора, статическое электричество |
Вредный |
Содержание ионов в , в |
[22] |
9 |
Поражение электрическим током |
Питающая электрическая цепь |
Опасный |
Напряжение прикосновения U>пр>=2В, допустимый ток I=0.3A |
[23] |
10 |
Психофизиологические нагрузки (пульсация изображения на экране монитора) |
Перенапряжение зрительного и слухового анализаторов, статичность и неудобство позы, монотонность труда |
Вредный |
Частота обновления экрана (h = 85 Гц при разрешении 800600 точек), общее время работы за ВДТ 4 часа за смену. |
[21] |
7.2 Производственная санитария
Поскольку разработанное программное обеспечение будет эксплуатироваться пользователем с использованием необходимых аппаратных средств, которые в свою очередь могут являться источниками каких-либо вредных факторов, то произведем анализ возникновения вредных факторов для пользователя и окружающей среды, используя для этого перечень вредных и опасных производственных факторов приведенных в таблице 7.1.
Поскольку научно – исследовательская работа относится к легким физическим работам, но характеризуется напряженным умственным трудом, то руководствуясь [16], выбирают оптимальные параметры микроклимата. По энергозатратам организма, проведение научно исследовательской работы относится к категории Ia (легкой), так как работа исследователя производится сидя, не требует систематического физического напряжения или поднятия и переноса тяжестей (расход энергии при выполнении работы до 139 Вт).
К основным показателям, характеризующим метеорологические условия в закрытых производственных помещениях (микроклимат) относятся: температура воздуха, [0С]; относительную влажность воздуха, [%]; скорость движения воздуха, [м/с].
Допустимые и оптимальные значения параметров метеорологических условий в соответствии с категорией работ и в зависимости от периода года приведены в таблице 7.2.
Таблица 7.2–Допустимые и оптимальные значения параметров микроклимата
Категория работ по тяжести |
Период года |
Температура, 0С |
Относительная влажность, % |
Скорость движения воздуха в помещении, м\с |
|
Постоянные рабочие места |
Непостоянные рабочие места |
||||
Допустимые значения параметров |
|||||
1а |
Холодный |
19 – 25 |
17 – 23 |
75 |
не более 0.1 |
1а |
Теплый |
21 – 27 |
19 – 29 |
55 |
0.1 – 0.2 |
Оптимальные значения параметров |
|||||
1а |
Холодный |
22 – 24 |
20 – 22 |
40 – 60 |
0.1 |
1а |
Теплый |
23 – 25 |
21 – 27 |
40 – 60 |
0.1 |
Обеспечение условий, приведенных в таблице 7.2, в теплый период года должно выполняться при помощи кондиционера. В холодный период года обмен воздуха осуществляется с помощью кондиционера и централизованного водяного отопления согласно СНиП 2.04.05.-93 [24].
Рисунок 7.1 – Схема расположения кондиционера и направления холодного воздуха
Поток холодного воздуха от кондиционера направлен непосредственно на аппаратуру, а не на оператора ЭВМ.
Задачей вентиляции и проветривания помещения является обеспечение чистоты воздуха и заданных метеорологических условий в производственных помещениях.
Состояние освещения производственных, служебных и вспомогательных помещений регламентируется СНиП ІІ–4–79 [17]. В светлое время используется боковое одностороннее естественное освещение, а в темное время суток – искусственное. Искусственное освещение по функциональному значению – рабочее, по способу расположения источников света – общее равномерное, так как светильники расположены в верхней зоне помещения равномерно.
Для создания комфортных условий зрительной работы средней точности необходимы следующие данные по нормам освещения, приведеные в таблице 7.3
Таблица 7.3 Характеристики зрительных работ
Точность зрительных работ |
Наименьший размер объекта различения |
Разряд зртельных работ |
Подразряд зрительных. работ |
Контраст объекта различения с фоном |
Характер фона |
Нормируе–мое значение |
|
Ест eIV>H>> >[%] |
Иск E>MIN>> >[Лк] |
||||||
работа средней точности |
0.3 – 0.5 |
III |
в |
средний |
светлый |
1.53 |
300 |
Согласно СНиП II-4-79 [17] для выбранного объекта различения, фона и контраста объекта различения с фоном минимальное значение освещенности будет равно 300 Лк.
Естественное освещение рабочих мест – боковое, значение коэффициента естественной освещенности (КЕО):.
При пересчете КЕО для условий города Харькова (IV пояс светового климата) воспользуемся формулой:
где m — коэффициент светового климата;
c — коэффициент солнечного климата.
Для IV светового пояса выбираем m = 0.9. Исходя из ориентации окон по сторонам света c = 0.85 . Тогда .
В соответствие с ДНАОП [21] нормативный показатель КЕО должен быть не менее 1,5%.
В качестве источников света используются люминесцентные лампы мощностью 40 Вт или энергоэкономные мощностью 36 Вт типа ЛБ, ЛХБ, ЛЕЦ как наиболее эффективные и приемлемые с точки зрения спектрального состава, цветовая температура излучения которых находится в диапазоне 3500-4200 К.
Для освещения помещения применяются светильники серии ЛП013, ЛП031, ЛП033 исполнение 001 и 006, ЛС002, ЛС004, с металлической экранирующей решеткой и непрозрачными боковинами.
Шум является одним из наиболее распространенных в производстве вредных факторов. При длительном воздействии шума человек быстро устает, раздражается, происходит перенапряжение слуховых анализаторов. В соответствии с ГОСТ 12.1.003-83* [18] и ДНАОП 0.03-3.14-85[25] в вычислительных центрах эквивалентные уровни звука не должны превышать 50 дБА. Согласно ГОСТ 12.1.012-90 [26] уровень вибрации для категории II, тип в, в условиях «комфорта» не должна превышать 75 дБ. Для уменьшения уровня звука и вибрации применяются демпфирующие материалы (отсек принтера с печатающей головкой закрывается крышкой, используется резиновая прокладка между принтером и столом).
Нормируемые параметры шума выбираются согласно [26]:
а) уровни звукового давления, дБ, в октавных полосах со среднегеометрическими частотами;
б) уровень звука равен 50 дБА.
Основным источником электромагнитного излучения, в том числе рентгеновского, в помещении являются электронно-лучевые трубки (ЭЛТ) мониторов. Согласно ДНАОП 0.00-0.31-99 [21] мощность экспозиционной дозы рентгеновского излучения трубки в любой точке перед экраном на расстоянии 5 см от его поверхности не должна превышать 100 мкР/ч. Защита пользователей ЭВМ от ЭМИ и рентгеновского излучения обеспечивается с помощью экранов из специального затемненного стекла.
Нормы ЭМИ для диапазона частот 15-25 кГц по электрической составляющей Е не должны превышать 50В/м, по магнитной составляющей Н – 5А/м [21].
Однако требования ТСО’95 более жесткие. Например, нормы Е и Н в том же диапазоне частот равны значениям 1 В/м и 20 мА/м.
Допустимые уровни напряженности электростатического поля на рабочем месте оператора, согласно ГОСТ 12.1.045-84 [19], не должны превышать 20 кВ/м. В помещениях для предотвращения образования статического электричества и защиты от него должны иметься нейтрализаторы и увлажнители воздуха, пол должен иметь антистатическое покрытие, а также необходимо делать заземление экрана дисплея.
Рентгеновское излучение и статическое электричество вызывает ионизацию воздуха с образованием положительных ионов, считающихся неблагоприятными для человека. Норма содержания легких аэроионов обоих знаков от 1500 до 5000 в 1 см3 воздуха [22]. Мероприятиями по снижению количества ионов в воздухе являются увлажнение воздуха и проветривание помещения.
Для уменьшения воздействия рентгеновского излучения и ЭМИ экран снабжен специальным покрытием, снижающим уровень этого излучения. Также снижение интенсивности электромагнитного и рентгеновского излучений достигается сокращением времени облучения: общее время работы не должно превышать 4ч за смену, длительность перерыва для отдыха должна составлять от 5 до 15 минут. Общий перерыв через 4 часа. Дополнительный перерыв через 3 часа и за 2 часа до окончания работы.
7.3 Техника безопасности
Эксплуатируемый персональный компьютер IBM PC не является источником механических и тепловых опасностей, но является потребителем электроэнергии. Поэтому, при рассмотрении вопросов техники безопасности ограничиваемся электробезопасностью.
Согласно ДНАОП 0.00 – 1.31 –99 [21] при проектировании систем электроснабжения, при монтаже силового электрооборудования и электрического освещения и в зданиях и помещениях для ЭВМ необходимо придерживаться требований нормативно-технической документации.
ПЭВМ является однофазным потребителем электроэнергии, питающейся переменным током напряжением 220В и частотой 50Гц, от сети с заземленной нейтралью. По способу защиты человека от поражения электрическим током ЭВМ должно соответствовать первому классу защиты согласно ГОСТ 12.2.007.0-75 [27]. Защиту от случайного прикосновения к токоведущим частям обеспечивают конструктивные, схемно-конструктивные и эксплуатационные меры защиты. Комплекс необходимых мер по электробезопасности определяется, исходя из видов электроустановки, ее номинального напряжения, условий среды, типа помещения и доступности электрооборудования.
По степени опасности поражения электрическим током помещение относится к помещениям без повышенной опасности, в соответствии с ПУЭ-87[28].
В ПУЭ-87[28] предусмотрены следующие меры электробезопасности:
1.Конструктивные меры
IBM PC относится к электроустановкам до 1000В закрытого исполнения, все токоведущие части находятся в кожухах. В соответствии с ГОСТ 14255-69 [19] и ПУЭ-87[18] выбираем степень защиты персонала от соприкосновения с токоведущими частями внутри защитного корпуса и от попадания воды внутрь корпуса – IP-44.
2.Схемно-конструктивные меры
Схемно-конструктивные меры электробезопасности обеспечивают безопасность прикосновения человека к металлическим нетоковедущим частям электрических аппаратов при случайном пробое из изоляции и возникновения электрического потенциала на них. В качестве схемно-конструктивной меры безопасности предусматривается зануление [19].Кроме того, используется двойная изоляция монитора и малые напряжения (менее 42 В).
Нулевой защитный проводник соединяет зануляемые части с глухозаземленной нейтральной точкой обмотки источника тока или ее эквивалентом. Линия электросети для питания ЭВМ и периферийной техники выполняется как отдельная групповая трехпроводная сеть, путем прокладки фазового, нулевого рабочего, нулевого защитного проводников [19]. Нулевой защитный проводник прокладывается от группового распределительного щита к розеткам питания. Не допускается подключение на щите к одному контактному зажиму нулевого защитного проводников. Конструкция штепсельных соединений электророзеток должна обеспечить более раннее подсоединение нулевого защитного проводника по сравнению с фазовым нулевым рабочим. Площадь сечения нулевого рабочего, нулевого защитного проводников должна быть не меньше плошади сечения фазового проводника. Все проводники должны соответствовать номинальным параметрам сети и нагрузки, условиям окружающей среды, типам аппарата защиты и другим требованиям [18]. Подключение ЭВМ к обычной двухпроводной сети, в том числе с использованием переходных приспособлений недопустимо. При расположении в помещении до пяти ЭВМ по его периметру разрешается положить трехпроводниковый кабель в оболочке из несгораемого и трудносгораемого материала без металлических труб. Если имеется свыше 5 компьютеров то кабель прокладывают в металлических трубах и гибких металлических рукавах с отводами. Если ЭВМ размещены в центре помещения электросеть прокладывается в каналах или под съемным полом в металлических трубах и гибких металлических рукавах.
Произведем расчет зануления в соответствии с требованиями [28].
Схема электроснабжения зануляемой электроустановки представлена на рисунке 7.2.
Рисунок 7.2 – Схема электроснабжения зануляемой электроустановки
где
ТрU>1>/U>2> – трансформатор масляный понижающий , U>2>=0.4кВт;
схема соединения обмоток – звезда-звезда;
СШ – сборная шина;
РЩ – распределительный щит;
А.З. – аппарат защиты;
L>1> – длина участка сети от распределительного щита до электроустановки, не более 100 м;
L>2> – длина участка сети от понижающего трансформатора до распределительного щита, не более 500 м;
R>0> – сопротивление заземлителя нейтральной точки;
Р>1> – мощность потребителя (однофазной установки);
Р>2> – мощность потребителей без учета подключенной мощности Р>1>.
Р>3> – мощность всех потребителей, подключенных к однофазному проводу;
Электросеть выполнена как трехпроводная сеть, состоящая из фазного провода, нулевого рабочего и нулевого защитного проводников.
L>1>=90 м; L>2>=500 м; Р>1>=250 Вт; P>2>=4000 Вт, P>3> = P>1> + P>2> = 4000 Вт + 250Вт = 4250 Вт.
Материал жилы – медь, способ прокладывания:
1-й участок – в металлической трубе;
2-й участок – в земле.
Произведем расчет автомата отключения для мощностей P>2> и P>3>.
Постановка задачи зануления электроустановки: определение такого сечения нулевого защитного проводника при котором ток короткого замыкания I>кз> в заданное число раз К превысит номинальный ток срабатывания аппарата защиты I>ном>, что обеспечит отключение поврежденного потребителя.
Выбор типа автоматического выключателя.
1а) Определение тока, питающего электроустановки мощностью Р>2 >= 5000 Вт:
I>1>=Р>2>/U>Ф>=4000/220=18.1818 А.
где Р>2> – мощность потребителей без учета мощности Р>1>;
U>ф> – фазное напряжение (220 В);
1б) Определение расчетной величины тока срабатывания защитного аппарата:
I>расч>=(К>п>/К>т>)*I>1>=(3/2.5)*18.1818=21.816 А.
где К>п>=3 – коэффициент кратности пускового тока;
К>т>=2.5 – коэффициент тяжести пуска электроустановки (зависит от времени пуска: t = 5 с, пуск легкий).
1в) Выбор типа автоматического выключателя и определение величины тока срабатывания аппарата защиты:
I>ном>=40 А; тип автоматического выключателя А3713Б.
Определение тока короткого замыкания фазы на корпус электроустановки:
I>кз>=U>ф>/((Z>тр>/3)+Z>пфн>).
Z>тр> – сопротивление обмотки трансформатора;
Z>пфн> – сопротивление петли фаза-ноль.
2а) Определение полного сопротивления трансформатора.
Выбираем мощность силового трансформатора N>тр>. Для масляного трансформатора при схеме соединения обмоток звезда-звезда и напряжении на первичной обмотке до U = 6-10 кВ:
N>тр> = f(Р>3>) = 4*Р>3>.
N>тр>=4*Р>3>=4*4250=17 кВт.
Выбираем сопротивление обмотки трансформатора
Z>тр>=f (N>тр>) = 3.11 Ом.
2б) Определение сопротивления фазного проводника:
На участке 1:
R>ф1>=*L>1>/S>ф1>, где =0.018 Ом*мм2/м.
Сечение фазного провода определяется в зависимости от допустимого длительного тока, способа прокладки проводов и материала проводов:
S>ф1 >=4 мм2; R>ф1>=0.018*90/4=0.405 Ом.
На участке 2:S>ф2>=25 мм2, учитывая, что I>2>=Р>3>/U>ф>=4250/220=19.318 А;
R>ф2>=0.018*500/25=0.36 Ом.
2в) общего фазного
R>ф>=R>Ф1>+R>Ф2>=0.405+0.36=0.705 Ом.
2г) Определение сопротивления нулевого провода.
Согласно требованиям ДНАОП 0.00 – 1.31 – 99 [21], площадь сечения нулевого рабочего и нулевого защитного проводников в однофазной 3-х проводной сети должны быть равны:
S>н1>=S>ф1>=4 мм2; S>н2>=S>ф2>=2 мм2; R>нз>=R>ф>=0.705 Ом.
где R>нз> – нулевое защитное сопротивление.
2д) Определяем полное сопротивление петли фаза-нуль Z>пфн> и ток короткого замыкания на замкнутый корпус I>кз>:
,
где x – сопротивление взаимоиндукции и индуктивного сопротивления.
Для медных проводников и в случае совместного прокладывания фазного, нулевого рабочего и нулевого защитного .
Z>пфн>=R>ф>+R>нз>=0.705+0.705=1.41 Ом;
I>кз>=U>ф>/((Z>тр>/3)+Z>пфн>)=220/(3.11/3+1.41)=89.9182 A.
3) Проверка выполнения условий надежности работы зануления.
3а) Должно выполняться условие I>кз> к*I>ном>, где к=3 – коэффициент запаса защиты при защите автоматическими выключателями.
89.9182 1.3*40=56 А – условие выполняется.
3б) Потери напряжений U>п1> на 1-м и U>п2> на 2-м участках не должны превышать 22 В.
U>п1>+U>п2>>>22 В;
U>п1>=I>1>*R>ф1>=18.818*0.405=7.3629;
U>п2>=I>2>*R>ф2>=19.318*0.36=6.9545 В;
U>п1>+U>п2>=7.3629+6.9545=14.317422 В – условие выполняется.
Вывод: Для обеспечения отключения электроустановки в короткое время необходимо использовать автоматический выключатель А3713Б; на первом участке сети (от распределительного щита до электроустановки) – нулевой защитный провод сечением S>н1>=4 мм2; на втором участке сети (от понижающего трансформатора до распределительного щита) нулевой защитный провод сечением S>н2>=25 мм2.
7.4 Эксплутационные меры
Необходимо соблюдать правила техники безопасности при работе с высоким напряжением и следующие меры предосторожности:
– монтаж, обслуживание, ремонт и наладка ЭВМ, замена деталей, приспособлений и блоков должна осуществляться только при полном выключении питания;
– в помещениях, где эксплуатируется больше 5 компьютеров на видном и доступном месте устанавливается аварийный и резервный выключатель для полного отключения электропитания;
– заземленные конструкции помещения должны быть надежно защищены диэлектрическими щитками или сетками от случайного проникновения.
Работник, поступающий на работу, обязательно проходит вводный и первичный инструктаж по технике безопасности в целях профилактики несчастных случаев, а также знакомится с инструктажем по соблюдению мер техники безопасности при работе с ПЭВМ.
7.5 Пожарная безопасность
Согласно с требованием ГОСТ 12.1.004-91 [30] пожарная безопасность обеспечивается следующими нормами:
– системой предотвращения пожаров;
– системой пожарной защиты;
– организационными мероприятиями по пожарной безопасности.
Предотвращение пожара достигается следующими мерами: предотвращение образования горючей среды, предотвращение образования в горючей среде источников зажигания.
Для уменьшения опасности образования в горючей среде источников зажигания предусмотрено:
1) использование электрооборудования, соответствующего классу пожароопасной зоны П-IIa, для которой степень защиты оболочки электрооборудования должна быть не менее IP-44, степень защиты светильников IP-23 [29];
2) молниезащита зданий, сооружений и оборудования (для условий города Харькова со средней грозовой деятельностью 20 часов в год и более установлена III категория молниезащиты). Молниеотвод выполнен в соответствии с требованием [31];
3) обеспечение защиты от короткого замыкания;
4) применение заземления экрана для стока статического электричества и др.
Помещение, в котором выполнялась дипломная работа, расположено на четвертом этаже шестиэтажного здания. В ней находится 4 компьютера. Размеры комнаты: длина-8м, ширина-5м, высота-4,2м. Общая площадь составляет 40 м2, что соответствует требуемым нормам ДНАОП 0.00-1.31-99 [21], согласно которым на одно рабочее место должно приходится не менее 6,0 м2.
По категории взрыво- и пожароопасности согласно ОНТП-86[13] данное помещение относится к категории В – пожароопасное из-за твердых сгораемых материалов (рабочие столы, бумага, изоляция и др.). Исходя из категории пожароопасности и этажности здания, степень огнестойкости здания II согласно ДБНВ 1.1 – Захист від пожежі. Пожежна безпека об’єктів будівництва[14] и СНиП 2.09.02-85[15].
При выборе средств тушения пожара для обеспечения безопасности человека от возможного поражения электрическим током в помещении предусмотрено использовать углекислотные огнетушители ОУ-2 емкостью 2 литра. Огнетушители находятся на видном и легко доступном месте (см. табл.7.4). При возникновении пожара предусмотрена возможность сообщения в пожарную охрану по телефону.
В системе пожарной защиты предусмотрены следующие меры:
1. Система автоматической пожарной сигнализации оснащена дымовыми сигнализаторами.
2. Помещение оснащено углекислотными огнетушителями – ОУ-2.
3. Для успешной эвакуации персонала двери помещения имеют следующие размеры:
– ширина не менее 1.5 м;
– высота не менее 2.0 м.
Ширина коридора 1.8 м. Рабочее помещение должно иметь два выхода. Расстояние от наиболее удаленного рабочего места не должно превышать 100 м.
Таблица 7.4 – Перечень первичных средств пожаротушения, обязательных в вычислительном центре
Площадь, кв.м. |
Первичные средства пожаротушения (тип, наименование) |
Количество, шт. |
Огнегасящий эффект |
40 |
углекислотные огнетушители и ручные ОУ-2, войлок, кошма, асбест, песок |
2 |
Разбавление воздуха углекислым газом и снижение в нем содержания кислорода до концентрации, при которой прекращается горение. Огнетушащий эффект указанным газом обуславливается потерями теплоты и снижением теплового эффекта реакции прекращение доступа кислорода к горящим элементам. |
Организационными мероприятиями пожарной профилактики является обучение производственного персонала противопожарным правилам, издание необходимых инструкций и плакатов, средств наглядной агитации. Обязательным является наличие плана эвакуации.
7.6 Охрана окружающей среды
25 июня 1991 года принят Закон Украины «Об охране окружающей природной среды» (редакции Закона 1993,1996 гг) [32]. Закон определяет правовые, экономические, социальные основы охраны окружающей среды.
Задачей законодательства об охране окружающей среды является регулирование отношений в области охраны природы, использовании и воспроизводстве природных ресурсов, обеспечении экологической безопасности, предупреждения и ликвидации отрицательного воздействия хозяйственной и иной деятельности на окружающую среду, сохранение природных ресурсов, генетического фонда нации, ландшафтов и других природных объектов [33].
При массовом производстве мониторов нельзя не учитывать их влияние на окружающую среду на всех стадиях их «жизни» - при изготовлении, эксплуатации, окончания срока службы. Сегодня действуют экологические стандарты, которые определяют требования к производству и материала. Они не должны содержать фреонов, хлоридов и бромидов (BS 7750, TCO-95, TCO-99).
В стандарте ТСО-99 допускается ограничение использования кадмия в светочувствительном слое экрана дисплея и ртути в батарейках. Аппараты, тара и документация должны допускать нетоксичную переработку после использования. Международные стандарты, начиная с ТCO-92, включают требования пониженного электропотребления и ограничивают допустимые уровни мощности потребляемой энергии в неактивном режиме.
Работа на ПК типа IBM PC\AT не оказывает вредного воздействия на окружающую среду. После истечения срока службы он полностью подлежит вторичной переработке. Необходимо внедрить на производстве стандарт ISO – 14001 [33] , который определяет требования к организации производственного процесса с минимальным ущербом, для окружающей природной среды.
Ужесточение требований к производству и материалам, а также разработка новых производственных и утилизационных технологий позволяет уменьшить антропогенную нагрузку на окружающую среду.
8. ГРАЖДАНСКАЯ ОБОРОНА
Гражданская оборона – составная часть системы общегосударственных оборонных мероприятий, проводимых в мирное и военное время в целях защиты населения и народного хозяйства от оружия массового поражения и других современных средств нападения противника, а также для спасательных и неотложных аварийно-восстановительных работ в очагах поражения и зонах катастрофического затопления.
В данной дипломной работе рассматривается вопрос ведения спасательных и неотложных работ при ликвидации последствий крупных аварий.
Систему гражданской обороны составляют:
органы исполнительной власти всех уровней, к компетенции которых отнесены функции, связанные с безопасностью и защитой населения, предупреждением, реагированием и действиями в чрезвычайных ситуациях;
органы повседневного управления процессами защиты населения в составе министерств, других центральных органов исполнительной власти, местных государственных администраций, руководства предприятий, учреждений и организаций независимо от формы собственности и подчинения;
силы и средства, предназначенные для исполнения задач ГО;
фонды финансовых, медицинских и материально-технических ресурсов, предусмотренных на случай чрезвычайных ситуаций;
системы связи, оповещения и информационного обеспечения;
Центральный орган исполнительной власти по вопросам чрезвычайных ситуаций и по делам защиты населения от последствий Чернобыльской катастрофы;
курсы и учебные заведения подготовки и переподготовки специалистов и населения по вопросам ГО;
службы ГО.
Основными задачами гражданской обороны Украины являются:
предупреждение возникновения чрезвычайных ситуаций техногенного происхождения и внедрение мер по уменьшению убытков и потерь в случае аварий, катастроф, взрывов, больших пожаров и стихийных бедствий;
оповещение населения об угрозе и возникновении чрезвычайных ситуаций в мирное и военное время и постоянное информирование его об имеющейся опасности;
защита населения от последствий аварий, катастроф, больших пожаров, стихийных бедствий и применения средств поражения;
организация жизнеобеспечения населения во время аварий, катастроф, стихийных бедствий и в военное время;
организация и проведение спасательных и других неотложных работ в районах бедствия и центрах поражения;
создание систем анализа и прогнозирования управления, оповещения и связи, наблюдения и контроля за радиоактивным, химическим и бактериологическим зараженьями, поддержание их готовности для постоянного функционирования и чрезвычайных ситуациях мирного и военного времени;
подготовка и переподготовка управляющего состава ГО, её органов управления и сил, обучение населения умению применять средства индивидуальной защиты и действовать в чрезвычайных ситуациях.
Крупные аварии и катастрофы на объектах могут возникать в результате стихийного бедствия, а также нарушения технологии производства, правил эксплуатации различных машин, оборудования и установленных мер безопасности. Их воздействия подобны стихийным бедствиям.
Под аварией понимают внезапную остановку или нарушение процесса производства на промышленном предприятии, транспорте, других объектах, приводящие к повреждению или уничтожению материальных ценностей.
Наиболее опасным следствием крупных аварий и катастроф являются пожары и взрывы. В ряде случаев, особенно на предприятиях нефтяной, химической и газовой промышленности, аварии вызывают загазованность атмосферы, разлив нефтепродуктов, агрессивных жидкостей и сильнодействующих довитых веществ. Аварии и катастрофы могут быть на железнодорожном, воздушном и водном транспорте, а также в результате обрушения при строительстве и монтаже сооружений и конструкций различных объектов.
Для ликвидации последствий, вызванных стихийными бедствиями, могут привлекаться как формирования общего назначения так и формирования служб ГО. В отдельных случаях помимо указанных формирований могут привлекаться части Вооружённых сил Украины.
Основная задача формирований при ликвидации последствий стихийных бедствий, крупных аварий и катастроф – спасение людей и материальных ценностей. Характер и порядок действий формирований при выполнении этой задачи зависит от вида стихийного бедствия, аварии или катастрофы, сложившейся обстановки, количества и подготовленности привлекаемых сил гражданской обороны, времени года и суток, погодных условий и других факторов.
Успех действий формирований во многом зависит от своевременной организации и проведения разведки и учёта конкретных условий обстановки.
В районах стихийных бедствий разведка определяет: границы очага бедствия и направления его распространения, объекты и населённые пункты, которым угрожает опасность, места скопления людей, пути подхода техники к местам работ, состояния повреждённых зданий и сооружений, а также наличие в них поражённых людей, места аварий на коммунально-энергетических сетях, объём спасательных и неотложно-восстановительных работ.
При крупных авариях и катастрофах разведка уточняет степень и объём разрушений и возможность проведения работ без средств индивидуальной защиты, возможность обрушения зданий и сооружений, которые могут повлечь за собой увеличение размера аварии или катастрофы, места скопления людей и степень угрозы для их жизни, а также состояние коммунально-энергетических сетей и транспортных коммуникаций.
Разведку ведут разведывательные группы и звенья. В состав разведывательных формирований рекомендуется включать специалистов, знающих расположение объекта и специфику производства. Если в районе предстоящих действий могут быть сильнодействующие ядовитые вещества, то в состав разведывательных формирований необходимо включить специалистов-химиков и медицинских работников.
В связи с внезапностью возникновения стихийных бедствий, крупных аварий и катастроф оповещение личного состава формирований, их укомплектование, создание группировки проводятся в короткие сроки.
В первый эшелон группировки сил обычно включают формирования объектов, где произошли бедствия, а во второй формирования соседних объектов (районов). Выдвижение формирований из района сбора в район действий осуществляется на максимально возможных скоростях.
В районах стихийных бедствий и местах крупных аварий спасательные работы в первую очередь проводятся с целью предупреждения возникновения катастрофических последствий, бедствий (аварий), предотвращения возникновения вторичных причин, которые могут вызвать гибель людей и материальных ценностей.
Командиры формирований должны постоянно знать обстановку в районе работ и в соответствии с её изменением уточнять или ставить новые задачи подразделениям.
После выполнения поставленных задач подразделения выводятся в район постоянного расквартирования.
При крупных авариях и катастрофах организация работ по ликвидации последствий проводится с учётом обстановки, сложившейся после аварии или катастрофы, степени разрушения и повреждения зданий и сооружений, технологического оборудования, агрегатов, характера аварий на коммунально-энергетических сетях и пожаров, особенности застройки территории объекта и других условий.
Работы по организации ликвидации последствий аварии и катастроф проводится в сжатые сроки: необходимо быстро спасти людей, находящихся под обломками зданий, в заваленных подвалах, и оказать им экстренную медицинскую помощь, а также предотвратить другие катастрофические последствия, связанные с гибелью людей и потерей большого количества материальных ценностей.
С возникновением аварии или катастрофы начальник гражданской обороны на основании данных разведки и личного наблюдения принимает решение на ликвидацию последствий и ставит задачи формированиям.
Начальники участков руководят спасательными и неотложными аварийно-восстановительными работами. Они указывают командирам формирований наиболее целесообразные приёмы и способы выполнения работ, определяют материально-техническое обеспечение, сроки окончания работ и представляют донесения об объёме выполненных работ, организуют питание, смену и отдых личного состава формирований.
Содержание спасательных работ: ведение разведки маршрутов выдвижения формирований и участков (объектов) работ; локализация и тушение пожаров на участках (объектах) проведения работ и на путях выхода к ним; розыск поражённых и извлечение их из-под завалов, повреждённых и горящих зданий, загазованных и задымлённых помещений; вскрытие разрушенных, повреждённых, заваленных защитных сооружений и спасение находящихся в них людей, а также подача воздуха в заваленные защитные сооружения; оказание первой медицинской и первой врачебной помощи поражённым людям и эвакуация их в лечебные учреждения; вывод населения из опасных мест ( сильно заражённых и затапливаемых районов) в безопасные (менее зараженные) или незараженные районы; санитарная обработка людей и обеззараживание их одежды, территории сооружений техники.
Содержание неотложных аварийно-восстановительных работ: прокладка колонных путей и устройство проездов в завалах и на зараженных участках; локализация аварий при газовых, энергетических и других сетях; укрепление или разрушение конструкций зданий и сооружений, угрожающих обвалом, препятствующих безопасному движению и проведению спасательных работ.
Неотложные аварийно-восстановительные работы организуют в минимально короткие сроки и производят непрерывно днём и ночью, в любую погоду до полного их завершения.
ВЫВОД
Главным результатом проведенной работы является создание функционирующего приложения клиент-сервер, которое выполняет требуемый от него круг задач. Оно предоставляет возможность получить быстрые доступ к любому источнику литературы, находящемуся на сервере предприятия. В приложении реализован поиск и фильтрация источников литературы по заданным атрибутам. В клиентской части приложения предусмотрена возможность настраивать интерфейс программы самому пользователю.
База данных была разработана и функционирует под управлением СУБД InterBase, одного из наиболее популярных, функциональных и надёжных серверов баз данных в мире. Клиентское приложение разработано при помощи среды программирования Borland Delphi 7.0, представляющей из себя мощное и современное средство для разработки приложений в архитектуре клиент-сервер.
Вся необходимая работа по осуществлению методов доступа к информации хранимой в базе данных, её модификации, поддержании базы данных в целостном виде скрыта внутри и пользователю нет необходимости знать о ней, чтобы успешно решать весь круг возникающих задач связанных с использованием информации хранимой базе данных. Более того, программный интерфейс максимально облегчает работу по обращению с базой данных.
Все функции выполняемые приложением были тщательным образом проверены в процессе разработки и протестированы на готовом продукте.
Разработанная БД имеет и экономическое значение. она значительно увеличивает скорость доступа работников предприятия к необходимым источникам технической литературы, уменьшает время поиска требуемой информации. Поэтому отпадает необходимость большой траты времени на подобные действия. Вследствие чего экономится время работников предприятия и повышается эффективность их труда.
СПИСОК ССЫЛОК
1. Дейт К. Дж. Введение в системы баз данных – М.: Издательский дом “Вильямс”, 2001. – 1072 с.
2. Атре Ш. Структурный подход к организации баз данных – М.: Финансы и статистика, 1983. – 317с.
3. Кузнецов С.Д. Основы современных баз данных - http://www.citforum.ru/database/osbd/contents.shtml
4. Кириллов В. В. Основы проектирования реляционных баз данных - http://www.citforum.ru/database/dbguide/index.shtml
5. Пушников А. Ю. Введение в системы управления базами данных - http://www.citforum.ru/database/dblearn/index.shtml
6. Грабер М. Введение в SQL – М.: Лори, 1996. – 380 с.
7. Ковязин А., Востриков С. Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/Firebird/Yaffil – М.: КУДИЦ-ОБРАЗ, 2002. – 432 с.
8. Гофман В. Э., Хомоненко А. Д. Delphi 6 – СПб.: БХВ-Петербург, 2001. – 1152 с.
9. Канту М. Delphi 6 для профессионалов – СПб.: Питер, 2002. – 1088 с.
10. Культин Н. Б. Программирование в Turbo Pascal 7.0 и Delphi – СПб.: БХВ-Петербург, 1997. – 240 с
11. Закон Украины об охране труда от 25.11. 1992г.
12. ГОСТ 12.0.003 – 74* ССБТ. Опасные и вредные производственные факторы. Классификация. – Введ. 01.01.76.
13. ОНТП 24 – 86. Общесоюзные нормы технологического проектирования. Определение категорий зданий и сооружений по взрывопожарной и пожарной опасности. – М.: Стройиздат, 1987. – 128 с.
14.ДБНВ 1.1 – Захист від пожежі. Пожежна безпека об’єктів булівництва, 2002 – 41с.
15. СНиП 2.09.02 – 85. Строительные нормы и правила. Производственные здания промышленных предприятий. Нормы проектирования. – М: Стройиздат, 1986.
16. ГОСТ 12.1 005 – 88*. ССБТ. Общие санитарно-гигиенические требования к воздуху рабочей зоны. – Введ. 01.01.89.
17. СНиП. II – 4 – 79. Строительные нормы и правила. Естественное и искусственное освещение. Нормы проектирования. – М.: Стройиздат, 1980. – 110 с.
18. ГОСТ 12.1.003 – 83*. ССБТ. Шум. Общие требования безопасности. – Введ.01.07.84.
19. ГОСТ 12.1.045 – 84. ССБТ. Электростатические поля. Допустимые уровни на рабочих местах и требования к проведению контроля. – Введ.01.01.85.
20. ГОСТ 12.1.006 – 84.ССБТ. Электромагнитные поля радиочастот. Допустимые уровни на рабочих местах и требования к проведению контроля. – Введ.01.01.85.
21. ДНАОП 0.00 – 1.31. – 99 Правила охраны труда при эксплуатации ЭВМ. – К.:1999.
22. Санитарно – гигиенические нормы допустимых уровней ионизации воздуха производственных и общественных помещений № 2152 – 80. – Минздрав СССР,1980.
23. ГОСТ 12.1.038 – 82.ССБТ. Электробезопасность. Предельно – допустимые уровни напряжений прикосновения и токов.
24. СНиП 2.04.05-93 Нормы проектирования. Отопление, вентиляция и кондиционирование. - М.: Стройиздат, 1994-64 с.
25. ДНАОП 0.03-3.14-85 Санітарні норми допустимих рівнів шуму на робочих місцях №3223-85.
26. ГОСТ 12.1.012-90 ССБТ. Вибрационная безопасность. Общие требования. – Введ.01.07.91.
27. ГОСТ 12.2.007.0-75 ССБТ. Изделия электрические. Общие требования безопасности. - Введ.01.01.76.
28. ПУЭ – 87. Правила устройства электроустановок. – М.: Энерогоатомиздат, 1987. –648 с.
29. ГОСТ 14255-69. Аппараты электрические напряжением до 1000В. Оболочки. Степени защиты.
30. ГОСТ 12.1.004-91 ССБТ. Пожарная безопасность. Общие требования. – Введ.01.07.91.
31. РД 34.21.122-87 Инструкция по устройству молниезащиты зданий и сооружений / Минэнерго СССР. - М.: Энергоатомиздат. – 1989. – 58 с.
32. Закон Украины «Об охране окружающей природной среды» от 25.06.91г.
33. Государственный стандарт Украины «Система управления окружающей средой» ISO 14001-97 – К.: ГОСТАНТДАРТ УКРАИНЫ. 1997 – 31 с.
34. Депутат О.П. Коваленко І.В. Мужик І.С. Цивільна оборона – Львів: Афіша, 2000 – 336 с.
35. Атаманюк В.Г. и др. Гражданская оборона – М: Высш. шк., 1987. – 288 с.
ПРИЛОЖЕНИЯ
Приложение А
Формы приложения этапе проектирования
Рисунок А.1 – Форма MainForm на этапе проектирования
Рисунок А.2 – Модуль данных DataModule1 на этапе проектирования
Рисунок А.3 – Форма EditForm на этапе проектирования
Рисунок А.4 – Форма FindForm на этапе проектирования
Рисунок А.5 – Форма DeleteForm на этапе проектирования
Рисунок А.6 – Форма FilterForm на этапе проектирования
Рисунок А.7 – Форма DirSourceForm на этапе проектирования
Рисунок А.8 – Форма PathForm на этапе проектирования
Рисунок А.9 – Форма UserForm на этапе проектирования
Рисунок А.10 – Форма AboutForm на этапе проектирования
Приложение Б
Листинг проекта приложения Lib.dpr
program Lib;
uses
Forms,
Main in 'Main.pas' {MainForm},
DBUnit in 'DBUnit.pas' {DataModule1: TDataModule},
DirSource in 'DirSource.pas' {DirSourceForm},
Edit in 'Edit.pas' {EditForm},
Files in 'Files.pas',
About in 'About.pas' {AboutBox},
Delete in 'Delete.pas' {DeleteForm},
Data in 'Data.pas',
Find in 'Find.pas' {FindForm},
Filter in 'Filter.pas' {FilterForm},
User in 'User.pas' {UserForm},
Path in 'Path.pas' {PathForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(TDirSourceForm, DirSourceForm);
Application.CreateForm(TEditForm, EditForm);
Application.CreateForm(TAboutBox, AboutBox);
Application.CreateForm(TDeleteForm, DeleteForm);
Application.CreateForm(TFindForm, FindForm);
Application.CreateForm(TFilterForm, FilterForm);
Application.CreateForm(TUserForm, UserForm);
Application.CreateForm(TPathForm, PathForm);
Application.Run;
end.
Приложение В
Листинг модуля Main.pas
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, Buttons, DBCtrls, imgList,
ComCtrls, ToolWin, DBActns, ActnList, AppEvnts, Menus, StdActns;
type
TMainForm = class(TForm)
ToolBar1: TToolBar;
TBInsert: TToolButton;
TBDelete: TToolButton;
ImageList1: TImageList;
TBUpdate: TToolButton;
TBFirst: TToolButton;
TBPrev: TToolButton;
TBNext: TToolButton;
TBLast: TToolButton;
ActionList1: TActionList;
DataSetFirst: TDataSetFirst;
DataSetPrior: TDataSetPrior;
DataSetNext: TDataSetNext;
TBRefrash: TToolButton;
DataSetLast: TDataSetLast;
DataSetInsert: TAction;
DataSetDelete: TAction;
DataSetUpdate: TAction;
DataSetRefrash: TAction;
ApplicationEvents1: TApplicationEvents;
FileExit: TFileExit;
MainMenu1: TMainMenu;
HelpAbout: TAction;
mmTable: TMenuItem;
mmFile: TMenuItem;
mmSort: TMenuItem;
mmExit: TMenuItem;
mmFirst: TMenuItem;
mmPrior: TMenuItem;
mmNext: TMenuItem;
mmLast: TMenuItem;
N5: TMenuItem;
mmInsert: TMenuItem;
mmDelete: TMenuItem;
mmUpdate: TMenuItem;
mmRefrash: TMenuItem;
mmHelp: TMenuItem;
SortByNum: TAction;
SortByAut: TAction;
SortByTit: TAction;
SortByLan: TAction;
SortByNo: TAction;
SortDirInc: TAction;
SortDirDec: TAction;
TBOpen: TToolButton;
DataSetOpen: TAction;
mmOpen: TMenuItem;
mmSortByNum: TMenuItem;
mmSortByAut: TMenuItem;
mmSortByTit: TMenuItem;
mmSortByLan: TMenuItem;
mmSortByNo: TMenuItem;
N12: TMenuItem;
mmSortDirInc: TMenuItem;
mmSortDirDec: TMenuItem;
mmAbout: TMenuItem;
DataSetFind: TAction;
DataSetFilter: TAction;
N14: TMenuItem;
mmFind: TMenuItem;
TBFind: TToolButton;
TBSapce2: TToolButton;
DataSetFindNext: TAction;
TBSpace1: TToolButton;
TBFindNext: TToolButton;
mmFindNext: TMenuItem;
TBFilter: TToolButton;
mmFilter: TMenuItem;
DataSetAll: TAction;
TBAll: TToolButton;
mmAll: TMenuItem;
FileUser: TAction;
N18: TMenuItem;
mmUser: TMenuItem;
mmOptions: TMenuItem;
OptColor: TAction;
OptFont: TAction;
FileDataBasePath: TAction;
mmDataBasePath: TMenuItem;
ColorDialog1: TColorDialog;
FontDialog1: TFontDialog;
mmColor: TMenuItem;
mmFont: TMenuItem;
PanelMain: TPanel;
PanelMemo: TPanel;
DBMemo1: TDBMemo;
Panel1: TPanel;
PanelGrid: TPanel;
Panel2: TPanel;
DBGrid1: TDBGrid;
Splitter1: TSplitter;
StatusBar1: TStatusBar;
Edit1: TEdit;
OptConfDel: TAction;
mmOptConfDel: TMenuItem;
N19: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure SaveIniFiles;
procedure RestoreIniFiles;
procedure ApplicationEvents1Hint(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
procedure RadioGroup2Click(Sender: TObject);
procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
procedure DBGrid1ColExit(Sender: TObject);
procedure DBGrid1KeyPress(Sender: TObject; var Key: Char);
procedure Edit1Exit(Sender: TObject);
procedure DataSetInsertExecute(Sender: TObject);
procedure DataSetDeleteExecute(Sender: TObject);
procedure DataSetUpdateExecute(Sender: TObject);
procedure DataSetRefrashExecute(Sender: TObject);
procedure DataSetOpenExecute(Sender: TObject);
procedure DataSetFindExecute(Sender: TObject);
procedure DataSetFindNextExecute(Sender: TObject);
procedure DataSetFilterExecute(Sender: TObject);
procedure DataSetAllExecute(Sender: TObject);
procedure FileDataBasePathExecute(Sender: TObject);
procedure FileUserExecute(Sender: TObject);
procedure OptColorExecute(Sender: TObject);
procedure OptFontExecute(Sender: TObject);
procedure OptConfDelExecute(Sender: TObject);
procedure HelpAboutExecute(Sender: TObject);
private
EditField : Integer;
OpenCounter: Integer;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
uses DB, ShellAPI, IniFiles, DBUnit,
Edit, About, Files, Delete, Data, Find,
Filter, User, Path;
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
begin
Root:=ExtractFilePath(Application.ExeName);
if not DirectoryExists(TmpDir) then
MkDir(TmpDir)
else
DeleteFiles(MainForm.Handle,Concat(Root,TmpDir,'*.*'));
MkDir(BrowseDir);
OpenCounter:=0;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
RestoreIniFiles;
if not DataModule1.InitDBParams then Close;
DataModule1.SetAccess;
DataSetInsert.Enabled:=DataModule1.fWriter;
DataSetDelete.Enabled:=DataModule1.fWriter;
DataSetUpdate.Enabled:=DataModule1.fWriter;
DataSetRefrashExecute(Sender);
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
DeleteFiles(MainForm.Handle,Concat(Root,TmpDir,'*.*'));
ChDir(Root);
RmDir(TmpDir);
SaveIniFiles;
end;
procedure TMainForm.SaveIniFiles;
var
F : TIniFile;
FN: ANSIString;
begin
FN:=Concat(Root,IniFile);
F:=TIniFile.Create(FN);
with F do
begin
WriteString('DataBase','Server',DataModule1.fServer);
WriteString('DataBase','File',DataModule1.fFile);
WriteString('DataBase','DefaultUser',DBDefaultUser);
WriteString('DataBase','DefaultPassword',DBDefaultPass);
WriteInteger('Window','State',Ord(WindowState));
WriteInteger('Window','Top',BoundsRect.Top);
WriteInteger('Window','Left',BoundsRect.Left);
WriteInteger('Window','Bottom',BoundsRect.Bottom);
WriteInteger('Window','Right',BoundsRect.Right);
WriteInteger('Window','Spliter',PanelMemo.Height);
WriteInteger('Memo','Top',PanelMemo.BoundsRect.Top);
WriteInteger('Memo','Bottom',PanelMemo.BoundsRect.Bottom);
WriteInteger('Grid','Author',DBGrid1.Columns.Items[0].Width);
WriteInteger('Grid','Title',DBGrid1.Columns.Items[1].Width);
WriteInteger('Grid','Language',DBGrid1.Columns.Items[2].Width);
WriteInteger('Grid','Archive',DBGrid1.Columns.Items[3].Width);
WriteInteger('Grid','File',DBGrid1.Columns.Items[4].Width);
WriteInteger('Options','Color',DBMemo1.Color);
WriteBool('Options','ConfDel',ConfirmDelete);
WriteInteger('Font','Charset',DBMemo1.Font.Charset);
WriteInteger('Font','Color',DBMemo1.Font.Color);
WriteInteger('Font','Height',DBMemo1.Font.Height);
WriteString('Font','Name',DBMemo1.Font.Name);
WriteInteger('Font','Pitch',Ord(DBMemo1.Font.Pitch));
WriteInteger('Font','Size',DBMemo1.Font.Size);
WriteBool('Font','Bold',fsBold in DBMemo1.Font.Style);
WriteBool('Font','Italic',fsItalic in DBMemo1.Font.Style);
WriteBool('Font','Underline',fsUnderline in DBMemo1.Font.Style);
WriteBool('Font','StrikeOut',fsStrikeOut in DBMemo1.Font.Style);
Free;
end;
end;
procedure TMainForm.RestoreIniFiles;
var
F : TIniFile;
FN : ANSIString;
WinSt: Byte;
WinTop: Integer;
WinLeft: Integer;
WinBottom: Integer;
WinRight: Integer;
X : LongInt;
S : ShortString;
begin
FN:=Concat(Root,IniFile);
if FileExists(FN) then
begin
F:=TIniFile.Create(FN);
with DataModule1 do
begin
fServer:=F.ReadString('DataBase','Server',DBDefaultServer);
fFile:=F.ReadString('DataBase','File',DBDefaultFile);
end;
DBDefaultUser:=F.ReadString('DataBase','DefaultUser',DBDefaultUser);
DBDefaultPass:=F.ReadString('DataBase',' Default Password',DBD efault Pass);
WinSt:=F.ReadInteger('Window','State',DefaultWinState);
case WinSt of
0: WindowState:=wsNormal;
1: WindowState:=wsMinimized;
2: WindowState:=wsMaximized;
end;
WinTop:=F.ReadInteger('Window','Top',DefaultWinTop);
WinLeft:=F.ReadInteger('Window','Left',DefaultWinLeft);
WinBottom:=F.ReadInteger('Window','Bottom',DefaultWinBottom);
WinRight:=F.ReadInteger('Window','Right',DefaultWinRight);
SetBounds(WinLeft,WinTop,WinRight-WinLeft,WinBottom-WinTop);
PanelMemo.Height:=F.ReadInteger('Window','Spliter',30);
with DBGrid1.Columns do
begin
Items[0].Width:=F.ReadInteger('Grid','Author',DefaultGrid1);
Items[1].Width:=F.ReadInteger('Grid','Title',DefaultGrid2);
Items[2].Width:=F.ReadInteger('Grid','Language',DefaultGrid3);
Items[3].Width:=F.ReadInteger('Grid','Archive',DefaultGrid4);
Items[4].Width:=F.ReadInteger('Grid','File',DefaultGrid5);
end;
X:=F.ReadInteger('Options','Color',DefaultColor);
DBGrid1.Color:=X;
DBMemo1.Color:=X;
Edit1.Color:=X;
ConfirmDelete:=F.ReadBool('Options','ConfDel',ConfirmDelete);
X:=F.ReadInteger('Font','Charset',DefaultFontCharset);
DBGrid1.Font.Charset:=X;
DBMemo1.Font.Charset:=X;
Edit1.Font.Charset:=X;
X:=F.ReadInteger('Font','Color',DefaultFontColor);
DBGrid1.Font.Color:=X;
DBMemo1.Font.Color:=X;
Edit1.Font.Color:=X;
X:=F.ReadInteger('Font','Height',DefaultFontHeight);
DBGrid1.Font.Height:=X;
DBMemo1.Font.Height:=X;
Edit1.Font.Height:=X;
S:=F.ReadString('Font','Name',DefaultFontName);
DBGrid1.Font.Name:=S;
DBMemo1.Font.Name:=S;
Edit1.Font.Name:=S;
X:=F.ReadInteger('Font','Pitch',DefaultFontPitch);
case X of
0:
begin
DBGrid1.Font.Pitch:=fpDefault;
DBMemo1.Font.Pitch:=fpDefault;
Edit1.Font.Pitch:=fpDefault;
end;
1:
begin
DBGrid1.Font.Pitch:=fpFixed;
DBMemo1.Font.Pitch:=fpFixed;
Edit1.Font.Pitch:=fpFixed;
end;
2:
begin
DBGrid1.Font.Pitch:=fpVariable;
DBMemo1.Font.Pitch:=fpVariable;
Edit1.Font.Pitch:=fpVariable;
end;
end;
X:=F.ReadInteger('Font','Size',DefaultFontSize);
DBGrid1.Font.Size:=X;
DBMemo1.Font.Size:=X;
Edit1.Font.Size:=X;
if F.ReadBool('Font','Bold',DefaultFontBold) then
begin
DBGrid1.Font.Style:=DBGrid1.Font.Style+[fsBold];
DBMemo1.Font.Style:=DBMemo1.Font.Style+[fsBold];
Edit1.Font.Style:=Edit1.Font.Style+[fsBold];
end;
if F.ReadBool('Font','Italic',DefaultFontItalic) then
begin
DBGrid1.Font.Style:=DBGrid1.Font.Style+[fsItalic];
DBMemo1.Font.Style:=DBMemo1.Font.Style+[fsItalic];
Edit1.Font.Style:=Edit1.Font.Style+[fsItalic];
end;
if F.ReadBool('Font','Underline',DefaultFontUnderline) then
begin
DBGrid1.Font.Style:=DBGrid1.Font.Style+[fsUnderline];
DBMemo1.Font.Style:=DBMemo1.Font.Style+[fsUnderline];
Edit1.Font.Style:=Edit1.Font.Style+[fsUnderline];
end;
if F.ReadBool('Font','StrikeOut',DefaultFontStrikeOut) then
begin
DBGrid1.Font.Style:=DBGrid1.Font.Style+[fsStrikeOut];
DBMemo1.Font.Style:=DBMemo1.Font.Style+[fsStrikeOut];
Edit1.Font.Style:=Edit1.Font.Style+[fsStrikeOut];
end;
F.Free;
end;
end;
procedure TMainForm.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.SimpleText:=Application.Hint;
end;
procedure TMainForm.RadioGroup1Click(Sender: TObject);
begin
DataSetRefrashExecute(Sender);
end;
procedure TMainForm.RadioGroup2Click(Sender: TObject);
begin
DataSetRefrashExecute(Sender);
end;
procedure TMainForm.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (DataModule1.fWriter) and (gdFocused in State) then
if (Column.Field.FieldName = 'Author') or
(Column.Field.FieldName = 'Title') or
(Column.Field.FieldName = 'Language') then
begin
EditField:=Column.Field.FieldNo-1;
Edit1.Text:=Column.Field.AsString;
with Edit1 do
begin
Left := Rect.Left + DBGrid1.Left;
Top := Rect.Top + DBGrid1.Top+PanelGrid.Top+PanelMain.Top;
Width := Rect.Right - Rect.Left + 2;
Visible := True;
end;
end;
end;
procedure TMainForm.DBGrid1ColExit(Sender: TObject);
var
FldName : ShortString;
begin
if DataModule1.fWriter then
begin
FldName:=DBGrid1.SelectedField.FieldName;
if (FldName = 'Author') or
(FldName = 'Title') or
(FldName = 'Language') then
begin
Edit1.Visible := False;
end;
end;
end;
procedure TMainForm.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
FldName : ShortString;
begin
if DataModule1.fWriter then
begin
FldName:=DBGrid1.SelectedField.FieldName;
if (FldName = 'Author') or
(FldName = 'Title') or
(FldName = 'Language') then
if (Key <> Chr(9)) then
begin
Edit1.SetFocus;
SendMessage(Edit1.Handle, WM_CHAR, Word(Key), 0);
end;
end;
end;
procedure TMainForm.Edit1Exit(Sender: TObject);
const
NamePre='Update';
ParPre ='ip';
Par: array [1..5] of ShortString=('Aut', 'Tit', 'Lan', 'Typ' ,'Ext');
begin
with DataModule1, DataModule1.IBStoredProc1 do
if IBDataSet1.Fields.Fields[EditField].AsString<>Edit1.Text then
begin
StoredProcName:=NamePre+IBDataSet1.FieldList.Strings[EditField];
ParamByName(ParPre+Par[EditField]).Value:=Edit1.Text;
ParamByName('ipNum').Value:=IBDataSet1.Fields.Fields[0].AsInteger;
Prepare;
ExecProc;
DataSetRefrashExecute(Sender);
end;
end;
procedure TMainForm.DataSetInsertExecute(Sender: TObject);
var
N : Integer;
ArcName: ANSIString;
Stream : TMemoryStream;
Res : Boolean;
begin
if not Assigned (EditForm) then
EditForm:= TEditForm.Create (Application);
with EditForm do
begin
Caption:=InsertWinName;
ShowModal;
if ModalResult=mrOK then
begin
case RadioGroupSource.ItemIndex of
0:
begin
if Trim(EditNewArc.Text)<>'' then
ArcName:=GetNewArcName(EditNewArc.Text+ArcExt)
else
begin
ArcName:=ExtractFileLastDir(EditDir.Text);
ArcName:=GetNewArcName(LibDir+ArcName+ArcExt);
end;
Res:=PackFiles(ArcName,EditDir.Text+'\*.*');
end;
1:
begin
if (Trim(EditNewArc.Text)<>'') then
begin
ArcName:=GetNewArcName(EditNewArc.Text+ArcExt);
Res:=(CopyFiles(Application.Handle,EditArc.Text,ArcName)=0);
end
else
begin
ArcName:=EditArc.Text;
Res:=True;
end;
end;
2:
begin
if Trim(EditNewArc.Text)<>'' then
ArcName:=GetNewArcName(EditNewArc.Text+ArcExt)
else
begin
ArcName:=ExtractFileName(EditFile.Text);
DeleteFileExt(ArcName);
ArcName:=GetNewArcName(LibDir+ArcName+ArcExt);
end;
Res:=PackFiles(ArcName,EditFile.Text);
end;
end;
if Res then
begin
Stream:=TMemoryStream.Create;
Memo1.Lines.SaveToStream(Stream);
DataModule1.CallInsertBook(ComboBoxAut.Text,
ComboBoxTit.Text,
ComboBoxLan.Text,
Stream,
ArcName,
ExtractFileName(EditFile.Text),N);
Stream.Free;
MainForm.DataSetRefrashExecute(Sender);
DataModule1.IBDataSet1.Locate('Number',N,[loPartialKey]);
end;
end;
end;
end;
procedure TMainForm.DataSetDeleteExecute(Sender: TObject);
begin
if ConfirmDelete then
begin
if not Assigned (DeleteForm) then
DeleteForm:= TDeleteForm.Create (Application);
with DeleteForm do
begin
Caption:=DeleteWinName;
ShowModal;
end;
if (DeleteForm.ModalResult = mrYes) then
DataModule1.CallDeleteBook;
end
else
DataModule1.CallDeleteBook;
DataSetRefrashExecute(Sender);
end;
procedure TMainForm.DataSetUpdateExecute(Sender: TObject);
var
N : Integer;
ArcName: ANSIString;
Str : ANSIString;
Stream : TStream;
MStream: TMemoryStream;
Res : Boolean;
begin
if not Assigned (EditForm) then
EditForm:= TEditForm.Create (Application);
with EditForm do
begin
Caption:=EditWinName;
with DataModule1.IBDataSet1 do
begin
N:=Fields.Fields[0].AsInteger;
ComboBoxAut.Text:=Fields.Fields[1].AsString;
ComboBoxTit.Text:=Fields.Fields[2].AsString;
ComboBoxLan.Text:=Fields.Fields[3].AsString;
RadioGroupSource.ItemIndex:=1;
EditDir.Text:='';
EditArc.Text:='';
EditFile.Text:=FieldByName('File').AsString;
Stream:=CreateBLOBStream(FieldByName('Sections'),bmRead);
Memo1.Lines.LoadFromStream(Stream);
EditArc.Text:=FieldByName('Archive').AsString;
Stream.Free;
end;
ShowModal;
if ModalResult=mrOK then
begin
ArcName:=Root+TmpDir+TmpFile+'.rar';
case RadioGroupSource.ItemIndex of
0:
begin
if EditDir.Text<>'' then
begin
ArcName:=Concat(Root+TmpDir+TmpFile);
Res:=PackFiles(ArcName,EditDir.Text+'\*.*');
ArcName:=ArcName+'.rar';
end;
end;
1:
begin
if EditArc.Text<>'' then
begin
ArcName:=EditArc.Text;
Res:=True;
end;
end;
2:
begin
Str:=DataModule1.IBDataSet1.FieldByName('File').AsString;
if EditFile.Text<>Str then
begin
ArcName:=Root+TmpDir+TmpFile+'.rar';
Res:=PackFiles(ArcName,EditFile.Text);
end;
end;
end;
if Res then
begin
MStream:=TMemoryStream.Create;
Memo1.Lines.SaveToStream(MStream);
DataModule1.CallUpDateBook(N, ComboBoxAut.Text,
ComboBoxTit.Text,
ComboBoxLan.Text,
MStream,
ArcName,
ExtractFileName(EditFile.Text));
MStream.Free;
end;
if (RadioGroupSource.ItemIndex<>1) then
DeleteFiles(EditForm.Handle,ArcName);
DataSetRefrashExecute(Sender);
DataModule1.IBDataSet1.Locate('Number',N,[loPartialKey]);
end;
end;
end;
procedure TMainForm.DataSetRefrashExecute(Sender: TObject);
var
S: ShortString;
B: TBookmark;
begin
with DataModule1.IBDataSet1 do
begin
B:=GetBookMark;
Close;
SelectSQL.Clear;
SelectSQL.Add('SELECT * FROM "Library" ');
end;
if SortByNum.Checked then S:=SQLSortBy[0]
else if SortByAut.Checked then S:=SQLSortBy[1]
else if SortByTit.Checked then S:=SQLSortBy[2]
else if SortByLan.Checked then S:=SQLSortBy[3]
else if SortByNo.Checked then S:=SQLSortBy[4];
DataModule1.IBDataSet1.SelectSQL.Add(S);
if (not SortByNo.Checked) then
begin
if SortDirInc.Checked then S:=SqlSortDir[0]
else S:=SqlSortDir[1];
DataModule1.IBDataSet1.SelectSQL.Add(S);
end;
with DataModule1.IBDataSet1 do
begin
Open;
GotoBookmark(B);
FreeBookmark(B);
end;
end;
procedure TMainForm.DataSetOpenExecute(Sender: TObject);
var
ArcPath: ANSIString;
FName : ANSIString;
OpenDir: ShortString;
begin
Inc(OpenCounter);
OpenDir:=Root+TmpDir+IntToStr(OpenCounter)+'\';
MkDir(OpenDir);
ArcPath:=DataModule1.IBDataSet1.FieldByName('Archive').AsString;
UnPackFiles(ArcPath,OpenDir);
FName:=DataModule1.IBDataSet1.FieldByName('File').AsString;
FName:=Concat(OpenDir+FName);
OpenFile(FName,OpenDir);
end;
procedure TMainForm.DataSetFindExecute(Sender: TObject);
begin
if not Assigned (FindForm) then
FindForm:= TFindForm.Create (Application);
FindForm.ShowModal;
if (DataModule1.fSearchRec>=0) then
DatasetFindNext.Enabled:=True
else
DatasetFindNext.Enabled:=False;
end;
procedure TMainForm.DataSetFindNextExecute(Sender: TObject);
const
Txt=’Источник не найден';
WinName='Поиск источника';
var
KeyFlds : ShortString;
KeyVals : Variant;
Loc : TLocateOptions;
Res : Boolean;
BM : TBookmark;
begin
BM:=DataModule1.IBDataSet1.GetBookmark;
FindForm.GetLocateParams(KeyFlds,KeyVals,Loc);
Res:=DataModule1.IBDataSet1.LocateNext(KeyFlds,KeyVals,Loc);
with DataModule1 do
fSearchRec:=IBDataSet1.RecNo;
if not Res then
begin
DataModule1.IBDataSet1.GotoBookmark(BM);
DataModule1.fSearchRec:=-1;
DataSetFindNext.Enabled:=False;
Application.MessageBox(Txt,WinName,mb_OK);
end;
DataModule1.IBDataSet1.FreeBookmark(BM);
end;
procedure TMainForm.DataSetFilterExecute(Sender: TObject);
begin
if not Assigned (FilterForm) then
FilterForm:= TFilterForm.Create(Application);
FilterForm.ShowModal;
end;
procedure TMainForm.DataSetAllExecute(Sender: TObject);
begin
DataModule1.IBDataSet1.Filtered:=False;
end;
procedure TMainForm.FileDataBasePathExecute(Sender: TObject);
begin
if not Assigned (PathForm) then
PathForm:= TPathForm.Create(Application);
PathForm.ShowModal;
DataSetRefrashExecute(Sender);
end;
procedure TMainForm.FileUserExecute(Sender: TObject);
var
Path : AnsiString;
User : ShortString;
Pass : ShortString;
begin
if not Assigned (UserForm) then
UserForm:= TUserForm.Create(Application);
with UserForm do
begin
ShowModal;
if ModalResult=mrOK then
begin
Path:=DataModule1.IBDatabase1.DatabaseName;
User:=UserForm.leUser.Text;
Pass:=UserForm.lePass.Text;
if not DataModule1.Connect(Path,User,Pass) then Close;
DataSetRefrashExecute(Sender);
DataModule1.SetAccess;
DataSetInsert.Enabled:=DataModule1.fWriter;
DataSetDelete.Enabled:=DataModule1.fWriter;
DataSetUpdate.Enabled:=DataModule1.fWriter;
end;
end;
end;
procedure TMainForm.OptColorExecute(Sender: TObject);
begin
if ColorDialog1.Execute then
begin
DBGrid1.Color:=ColorDialog1.Color;
DBMemo1.Color:=ColorDialog1.Color;
Edit1.Color:=ColorDialog1.Color;
end;
end;
procedure TMainForm.OptFontExecute(Sender: TObject);
begin
if FontDialog1.Execute then
begin
DBGrid1.Font.Assign(FontDialog1.Font);
DBMemo1.Font.Assign(FontDialog1.Font);
Edit1.Font.Assign(FontDialog1.Font);
end;
end;
procedure TMainForm.OptConfDelExecute(Sender: TObject);
begin
ConfirmDelete:=not ConfirmDelete;
end;
procedure TMainForm.HelpAboutExecute(Sender: TObject);
begin
if not Assigned (AboutBox) then
AboutBox:= TAboutBox.Create (Application);
AboutBox.ShowModal;
end;
end.
Приложение Г
Листинг модуля DBUnit.pas
unit DBUnit;
interface
uses
SysUtils, Classes, DB, IBDatabase, IBCustomDataSet, IBQuery, IBStoredProc;
type
TDataModule1 = class(TDataModule)
DataSource1: TDataSource;
IBDatabase1: TIBDatabase;
IBTransaction1: TIBTransaction;
IBDataSet1: TIBDataSet;
IBStoredProc1: TIBStoredProc;
function Connect(Path:ANSIString;
User, Password: ShortString): Boolean;
function InitDBParams: Boolean;
procedure SetAccess;
procedure CallInsertBook(Aut, Tit, Lan: ShortString;
Sec: TStream;
Arc: ANSIString;
Fil: ShortString;
var Num: Integer);
procedure CallUpdateBook(Num: Integer;
Aut, Tit, Lan: ShortString;
Sec: TStream;
Arc: ANSIString;
Fil: ShortString);
procedure CallDeleteBook;
procedure SetFilter(CaseFlag: Boolean; Aut, Tit, Lan, Sec: ShortString);
function IsFieldContainStr(Field, S: ShortString): Boolean;
procedure IBDataSet1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
procedure IBDataSet1AfterScroll(DataSet: TDataSet);
private
fCase : Boolean;
fFltrAut: ShortString;
fFltrTit: ShortString;
fFltrLan: ShortString;
fFltrSec: ShortString;
public
fSearchRec : Integer;
fSearchKey : ShortString;
fSearchCase: Boolean;
fWriter : Boolean;
fUser : ShortString;
fPass : ShortString;
fServer : ShortString;
fFile : ShortString;
end;
var
DataModule1: TDataModule1;
implementation
uses StrUtils, DBTables, Dialogs, Main, Data;
{$R *.dfm}
{ TDataModule1 }
function TDataModule1.Connect(Path:ANSIString;
User, Password: ShortString): Boolean;
const
ParamNames: array[0..3] of ShortString = (
'lc_ctype=',
'sql_role_name=',
'user_name=',
'password=');
CharSet='WIN1251';
SQLRole='3';
ErrPathUserPass='Неверный путь к базе или пароль пользователя';
ErrFatal='Соединение с базой данных не возможно';
var
OldUser: ShortString;
OldPass: ShortString;
OldPath: AnsiString;
begin
OldPath:='';
OldUser:='';
OldPass:='';
with IBDataBase1 do
begin
IBDataBase1.Connected:=False;
if Params.Count<>0 then
begin
OldUser:=fUser;
OldPass:=fPass;
OldPath:=DataBaseName;
end;
IBDataBase1.Params.Clear;
Params.Add(Concat(ParamNames[0],CharSet));
Params.Add(Concat(ParamNames[1],SQLRole));
Params.Add(Concat(ParamNames[2],User));
Params.Add(Concat(ParamNames[3],Password));
LoginPrompt:=False;
DatabaseName:=Path;
end;
try
IBDataBase1.Connected:=True;
fUser:=User;
fPass:=Password;
except
ShowMessage(ErrPathUserPass);
if (OldPath<>'') and (OldUser<>'') and (OldPass<>'') then
with IBDataBase1 do
begin
DatabaseName:=OldPath;
Params[2]:=OldUser;
Params[3]:=OldPass;
Connected:=False;
try
Connected:=True;
fUser:=User;
fPass:=Password;
except
ShowMessage(ErrFatal);
end;
end;
end;
Result:=IBDataBase1.Connected;
end;
function TDataModule1.InitDBParams: Boolean;
var
Path: ANSIString;
begin
fUser:=ParamStr(1);
fPass:=ParamStr(2);
fServer:=Paramstr(3);
fFile:=Paramstr(4);
if (fUser='') then fUser:=DBDefaultUser;
if (fPass='') then fPass:=DBDefaultPass;
if (fServer='') then fServer:=DBDefaultServer;
if (fFile='') then fFile:=DBDefaultFile;
Path:=Concat(fServer,':',fFile);
Result:=DataModule1.Connect(Path,fUser,fPass);
end;
procedure TDataModule1.SetAccess;
begin
with IBStoredProc1 do
begin
StoredProcName:='IsWriter';
Prepare;
try
ExecProc;
fWriter:=True;
except
fWriter:=False;
end;
end;
end;
procedure TDataModule1.CallInsertBook(Aut, Tit, Lan: ShortString;
Sec: TStream;
Arc: ANSIString;
Fil: ShortString;
var Num: Integer);
begin
with IBStoredProc1 do
begin
StoredProcName:='InsertBook';
ParamByName('ipAut').Value:=Aut;
ParamByName('ipTit').Value:=Tit;
ParamByName('ipLan').Value:=Lan;
ParamByName('ipSec').LoadFromStream(Sec,ftMemo);
ParamByName('ipArc').Value:=Arc;
ParamByName('ipFil').Value:=Fil;
Prepare;
ExecProc;
Num:=ParamByName('opNum').Value;
end;
end;
procedure TDataModule1.CallUpdateBook(Num: Integer;
Aut, Tit, Lan: ShortString;
Sec: TStream;
Arc: ANSIString;
Fil: ShortString);
begin
with IBStoredProc1 do
begin
StoredProcName:='UpdateBook';
ParamByName('ipNum').Value:=Num;
ParamByName('ipAut').Value:=Aut;
ParamByName('ipTit').Value:=Tit;
ParamByName('ipLan').Value:=Lan;
ParamByName('ipSec').LoadFromStream(Sec,ftMemo);
ParamByName('ipArc').Value:=Arc;
ParamByName('ipFil').Value:=Fil;
Prepare;
ExecProc;
end;
end;
procedure TDataModule1.CallDeleteBook;
begin
if (IBDataSet1.RecNo<>0) then
with IBStoredProc1 do
begin
StoredProcName:='DeleteBook';
ParamByName('Num').Value:=IBDataSet1.Fields.Fields[0].Value;
Prepare;
ExecProc;
end;
end;
procedure TDataModule1.SetFilter(CaseFlag: Boolean;
Aut, Tit, Lan,Sec: ShortString);
begin
fCase:=CaseFlag;
fFltrAut:=Aut;
fFltrTit:=Tit;
fFltrLan:=Lan;
fFltrSec:=Sec;
IBDataSet1.Filtered:=False;
IBDataSet1.Filtered:=True;
end;
function TDataModule1.IsFieldContainStr(Field, S: ShortString): Boolean;
begin
if Trim(S)<>'' then
if fCase then
Result:=ANSIContainsStr(Field,S)
else
Result:=ANSIContainsText(Field,S)
else
Result:=True;
end;
procedure TDataModule1.IBDataSet1FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var
Aut: Boolean;
Tit: Boolean;
Lan: Boolean;
Sec: Boolean;
begin
Aut:=IsFieldContainStr(DataSet['Author'],fFltrAut);
Tit:=IsFieldContainStr(DataSet['Title'],fFltrTit);
Lan:=IsFieldContainStr(DataSet['Language'],fFltrLan);
Sec:=IsFieldContainStr(DataSet['Sections'],fFltrSec);
Accept:=Aut and Tit and Lan and Sec;
end;
procedure TDataModule1.IBDataSet1AfterScroll(DataSet: TDataSet);
var
Stream: TStream;
begin
if not IBDataSet1.FieldByName('Sections').IsNull then
begin
Stream:=IBDataSet1.CreateBlobStream(IBDataSet1.FieldByName('Sections'),bmRead);
Stream.Free;
end;
end;
end.
Приложение Д
Листинг модуля Edit.pas
unit Edit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons, CheckLst, Mask, Menus, ActnList;
type
TEditForm = class(TForm)
Panel1: TPanel;
BCancel: TBitBtn;
BOK: TBitBtn;
Panel2: TPanel;
RadioGroupSource: TRadioGroup;
OpenDialogArc: TOpenDialog;
GroupBoxData: TGroupBox;
LabelTit: TLabel;
LabelLan: TLabel;
LabelTyp: TLabel;
LabelAut: TLabel;
ComboBoxAut: TComboBox;
ComboBoxTit: TComboBox;
ComboBoxLan: TComboBox;
GroupBoxSections: TGroupBox;
GroupBoxPath: TGroupBox;
LabelDir: TLabel;
EditDir: TEdit;
BBrowseDir: TBitBtn;
LabelArc: TLabel;
EditArc: TEdit;
BBrowseArc: TBitBtn;
LabelFile: TLabel;
EditFile: TEdit;
BBrowseFile: TBitBtn;
EditNewArc: TEdit;
LabelNewArc: TLabel;
Memo1: TMemo;
procedure FormActivate(Sender: TObject);
procedure SetComboBox(FieldNum: Integer; CBox: TComboBox);
procedure BBrowseArcClick(Sender: TObject);
procedure BBrowseFileClick(Sender: TObject);
procedure RadioGroupSourceClick(Sender: TObject);
procedure BBrowseDirClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
EditForm: TEditForm;
implementation
uses DB, DirSource, DBUnit, Files, Data;
{$R *.dfm}
procedure TEditForm.FormActivate(Sender: TObject);
begin
SetComboBox(1,ComboBoxAut);
SetComboBox(2,ComboBoxTit);
SetComboBox(3,ComboBoxLan);
RadioGroupSourceClick(Sender);
end;
procedure TEditForm.SetComboBox(FieldNum: Integer; CBox: TComboBox);
var
B : TBookmark;
S : ShortString;
Present: Boolean;
I : Integer;
begin
CBox.Items.Clear;
with DataModule1.IBDataSet1 do
begin
B:=GetBookmark;
First;
DisableControls;
while not EOF do
begin
S:=Fields.Fields[FieldNum].AsString;
if S<>'' then
begin
Present:=False;
for I:=0 to CBox.Items.Count-1 do
if S=CBox.Items.Strings[I] then
begin
Present:=True;
Break;
end;
if (not Present) then
CBox.Items.Add(S);
end;
Next;
end;
GotoBookmark(B);
FreeBookmark(B);
EnableControls;
end;
end;
procedure TEditForm.BBrowseArcClick(Sender: TObject);
begin
with OpenDialogArc do
begin
Title:='Поиск архива';
Filter :=
'Любые архивы|*.RAR;*ZIP;*ARJ'+
'Любые файлы|*.*'+
'RAR-архивы (*.rar)|*.RAR|'+
'ZIP-архивы (*.zip)|*.ZIP|'+
'ARJ-архивы (*.arj)|*.ARJ'; InitialDir:=InitDir;
if Execute then
begin
EditArc.Text:=FileName;
BBrowseFile.Enabled:=True;
EditFile.Text:='';
end;
end;
end;
procedure TEditForm.BBrowseFileClick(Sender: TObject);
var
ArcPath: ANSIString;
OpenDir: ANSIString;
Res : Boolean;
OpenDialogFile: TOpenDialog;
begin
Res:=True;
if RadioGroupSource.ItemIndex = 1 then
begin
Res:=CopyFiles(EditForm.Handle,EditArc.Text,
Root+TmpDir+ExtractFileName(EditArc.Text))=0;
if Res then
begin
ArcPath:=Concat(Root,TmpDir,ExtractFileName(EditArc.Text));
OpenDir:=Concat(Root,BrowseDir);
Res:=UnPackFiles(ArcPath,OpenDir);
end;
end;
if Res then
begin
OpenDialogFile:=TOpenDialog.Create(Application);
with OpenDialogFile do
begin
InitialDir:='E:\Andrew\';
Title:='Главный файл';
Filter :=
'Любые документы |'+
'*.TXT;*.DOC;*.RTF;*.WRI;*.PDF;*.HTM;*.HTML;*.SHTML;*.XML|'+
'Любые файлы (*.*)|*.*|'+
'Текстовые файлы (*.txt)|*.TXT|'+
'Докуметы Word(*.doc)|*.DOC|'+
'Rich Text Format(*.rtf)|*.RTF|'+
'Текст в формате WRI(*.wri)|*.WRI|'+
'Документы Acrobat (*.pdf)|*.PDF|'+
'Web-страницы(*.htm, *.html, *.shtml, *.xml)|*.HTM;*.HTML;*.SHTML;*. case RadioGroupSource.ItemIndex of
0: InitialDir:=DirSourceForm.ShellComboBox1.Path;
1: InitialDir:=Root+BrowseDir;
2: InitialDir:=InitDir;
end;
if Execute then
case RadioGroupSource.ItemIndex of
0: EditFile.Text:=ExtractFileName(FileName);
1: EditFile.Text:=ExtractFileName(FileName);
2: EditFile.Text:=FileName;
end;
end;
OpenDialogFile.Free;
end;
if RadioGroupSource.ItemIndex = 1 then
begin
DeleteFiles(EditForm.Handle,Root+BrowseDir+'*.*');
DeleteFiles(EditForm.Handle,Root+TmpDir+ExtractFileName(EditArc.Text));
end;
end;
procedure TEditForm.RadioGroupSourceClick(Sender: TObject);
begin
LabelDir.Enabled:=RadioGroupSource.ItemIndex = 0;
EditDir.Enabled:=RadioGroupSource.ItemIndex = 0;
BBrowseDir.Enabled:=RadioGroupSource.ItemIndex = 0;
LabelArc.Enabled:=RadioGroupSource.ItemIndex = 1;
EditArc.Enabled:=RadioGroupSource.ItemIndex = 1;
BBrowseArc.Enabled:=RadioGroupSource.ItemIndex = 1;
end;
procedure TEditForm.BBrowseDirClick(Sender: TObject);
begin
if not Assigned (DirSourceForm) then
DirSourceForm:= TDirSourceForm.Create (Application);
DirSourceForm.ShowModal;
if DirSourceForm.ModalResult = mrOK then
EditDir.Text:=DirSourceForm.ShellComboBox1.Path;
end;
end.
Приложение Е
Листинг модуля Delete.pas
unit Delete;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls;
type
TDeleteForm = class(TForm)
Bevel1: TBevel;
Label1: TLabel;
BYes: TBitBtn;
BNo: TBitBtn;
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DeleteForm: TDeleteForm;
implementation
{$R *.dfm}
end.
Приложение Ж
Листинг модуля Filter.pas
unit Filter;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TFilterForm = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
GBFilterValue: TGroupBox;
EditAut: TEdit;
EditTit: TEdit;
EditLan: TEdit;
LabelAut: TLabel;
LabelTit: TLabel;
LabelLan: TLabel;
BBOK: TBitBtn;
BBCancel: TBitBtn;
LabelSec: TLabel;
EditSec: TEdit;
CBCase: TCheckBox;
procedure FormDeactivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FilterForm: TFilterForm;
implementation
uses DB, DBUnit;
{$R *.dfm}
procedure TFilterForm.FormDeactivate(Sender: TObject);
begin
if ModalResult=mrOK then
DataModule1.SetFilter(CBCase.Checked,
EditAut.Text,
EditTit.Text,
EditLan.Text,
EditSec.Text);
end;
end.
Приложение З
Листинг модуля Find.pas
unit Find;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Buttons, DB;
type
TFindForm = class(TForm)
Panel1: TPanel;
BOK: TBitBtn;
Panel2: TPanel;
gbValue: TGroupBox;
LabelAut: TLabel;
LabelTit: TLabel;
LabelLan: TLabel;
LabelSec: TLabel;
EditAut: TEdit;
EditTit: TEdit;
EditLan: TEdit;
EditSec: TEdit;
BCancel: TBitBtn;
EditNum: TEdit;
LabelNum: TLabel;
gbParam: TGroupBox;
CheckBoxCase: TCheckBox;
CheckBoxsub>Str: TCheckBox;
procedure FormDeactivate(Sender: TObject);
procedure SetFieldParams(FldNum: Byte;
var Fields: ShortString; var Values: Variant);
procedure GetLocateParams(var KeyFields: ShortString;
var KeyValues: Variant; var Options: TLocateOptions);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FindForm: TFindForm;
implementation
uses DBUnit, Data;
{$R *.dfm}
procedure TFindForm.FormDeactivate(Sender: TObject);
const
Txt='Источник не найден';
WinName='Поиск источника';
var
KeyFlds : ShortString;
KeyVals : Variant;
Loc : TLocateOptions;
Res : Boolean;
BM : TBookmark;
begin
if ModalResult=mrOK then
begin
BM:=DataModule1.IBDataSet1.GetBookmark;
GetLocateParams(KeyFlds,KeyVals,Loc);
Res:=DataModule1.IBDataSet1.Locate(KeyFlds,KeyVals,Loc);
with DataModule1 do
fSearchRec:=IBDataSet1.RecNo;
if not Res then
begin
DataModule1.IBDataSet1.GotoBookmark(BM);
DataModule1.fSearchRec:=-1;
Application.MessageBox(Txt,WinName,mb_OK);
end;
DataModule1.IBDataSet1.FreeBookmark(BM);
end;
end;
procedure TFindForm.GetLocateParams(var KeyFields: ShortString;
var KeyValues: Variant; var Options: TLocateOptions);
begin
KeyFields:='';
KeyValues:=VarArrayOf([]);
SetFieldParams(0,KeyFields,KeyValues);
SetFieldParams(1,KeyFields,KeyValues);
SetFieldParams(2,KeyFields,KeyValues);
SetFieldParams(3,KeyFields,KeyValues);
SetFieldParams(4,KeyFields,KeyValues);
Options:=[];
if CheckBoxCase.Checked then
Options:=Options+[loCaseInsensitive];
if CheckBoxsub>Str.Checked then
Options:=Options+[loPartialKey];
end;
procedure TFindForm.SetFieldParams(FldNum: Byte;
var Fields: ShortString; var Values: Variant);
var
S: ShortString;
N: Integer;
begin
case FldNum of
0: S:=EditNum.Text;
1: S:=EditAut.Text;
2: S:=EditTit.Text;
3: S:=EditLan.Text;
4: S:=EditSec.Text;
end;
S:=Trim(S);
if S<>'' then
begin
Fields:=Concat(Fields,FieldNames[FldNum],';');
N:=VarArrayHighBound(Values,1)+1;
VarArrayRedim(Values,N);
if (FldNum = 0) then
Values[N]:=StrToInt(S)
else
Values[N]:=S;
end;
end;
end.
Приложение И
Листинг модуля DirSource.pas
unit DirSource;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, ComCtrls, ShellCtrls;
type
TDirSourceForm = class(TForm)
Bevel1: TBevel;
BCancel: TBitBtn;
BOK: TBitBtn;
ShellComboBox1: TShellComboBox;
ShellTreeView1: TShellTreeView;
private
{ Private declarations }
public
{ Public declarations }
end;
var
DirSourceForm: TDirSourceForm;
implementation
{$R *.dfm}
end.
Приложение К
Листинг модуля Path.pas
unit Path;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TPathForm = class(TForm)
Panel1: TPanel;
BBOK: TBitBtn;
BBCancel: TBitBtn;
Panel2: TPanel;
leServer: TLabeledEdit;
leFile: TLabeledEdit;
procedure FormActivate(Sender: TObject);
procedure FormDeactivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
PathForm: TPathForm;
implementation
uses Data, DBUnit;
{$R *.dfm}
procedure TPathForm.FormActivate(Sender: TObject);
begin
leServer.Text:=DataModule1.fServer;
leFile.Text:=DataModule1.fFile;
end;
procedure TPathForm.FormDeactivate(Sender: TObject);
var
Path : AnsiString;
User : ShortString;
Pass : ShortString;
begin
if ModalResult=mrOK then
begin
Path:=Concat(leServer.Text,':',lefile.Text);
User:=DataModule1.fUser;
Pass:=DataModule1.fPass;
if not DataModule1.Connect(Path,User,Pass) then Close;
end;
end;
end.
Приложение Л
Листинг модуля User.pas
unit User;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;
type
TUserForm = class(TForm)
Panel1: TPanel;
BBOK: TBitBtn;
BBCancel: TBitBtn;
Panel2: TPanel;
leUser: TLabeledEdit;
lePass: TLabeledEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
UserForm: TUserForm;
implementation
{$R *.dfm}
end.
Приложение М
Листинг модуля About.pas
unit About;
interface
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
Buttons, ExtCtrls, jpeg;
type
TAboutBox = class(TForm)
Panel1: TPanel;
ProgramIcon: TImage;
ProductName: TLabel;
Version: TLabel;
Copyright: TLabel;
Comments: TLabel;
BitBtnOK: TBitBtn;
Date: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;
var
AboutBox: TAboutBox;
implementation
{$R *.dfm}
end.
Приложение Н
Листинг модуля Data.pas
unit Data;
{$WRITEABLECONST ON}
interface
uses Graphics;
const
DBDefaultServer: ShortString ='Server-1';
DBDefaultFile: ANSIString ='G:\LibDB\Lib.gdb';
LibDir='\\Server-1\_Literature\__\';
InitDir='\\Server-1\_Literature\';
DBDefaultUser: ShortString ='GUEST';
DBDefaultPass: ShortString ='please';
IniFile='Lib.ini';
TmpDir='Tmp\';
BrowseDir=TmpDir+'Browse\';
TmpFile='Tmp';
ArcExt='.rar';
PathLen =1000;
InsertWinName=Добавление нового источника';
EditWinName='Редактирование источника ';
DeleteWinName='Удаление источника ';
FieldNames: array [0..4] of ShortString=(
'Number', 'Author', 'Title', 'Language', 'Sections');
SQLSortBy : array [0..4] of ShortString=(
'ORDER BY "Number" ',
'ORDER BY "Author" ',
'ORDER BY "Title" ',
'ORDER BY "Language" ',
'');
SQLSortDir: array [0..1] of ShortString=(
'',
'DESC');
DefaultWinState = 2;
DefaultWinTop = 0;
DefaultWinBottom = 0;
DefaultWinLeft = 400;
DefaultWinRight = 600;
DefaultMemoTop = 0;
DefaultMemoBottom = 0;
DefaultMemoLeft = 400;
DefaultMemoRight = 600;
DefaultGrid0= 36;
DefaultGrid1= 117;
DefaultGrid2= 279;
DefaultGrid3= 52;
DefaultGrid4= 150;
DefaultGrid5= 122;
DefaultColor= clWindow;
DefaultFontCharset= 1 ;
DefaultFontColor=clWindowText;
DefaultFontHeight=-11;
DefaultFontName='MS Sans Serif';
DefaultFontPitch=Ord(fpDefault);
DefaultFontSize=8;
DefaultFontBold=False;
DefaultFontItalic=False;
DefaultFontUnderLine=False;
DefaultFontStrikeOut=False;
ConfirmDelete: Boolean = True;
var
Root : ANSIString;
implementation
end.
Приложение О
Листинг модуля Files.pas
unit Files;
interface
uses Windows, SysUtils, Dialogs, IniFiles;
function CopyFiles(Handle:HWND; Source, Dest: ANSIString): Longint;
procedure DeleteFileExt(var Name:ANSIString);
function DeleteFiles(Handle:HWND; Source: ANSIString): Longint;
function ExtractFileLastDir(Name: ANSIString): ANSIString;
function GetNewArcName(Path: ShortString): ShortString;
procedure OpenFile(FileName: TFileName; Dir:ANSIString);
function PackFiles(ArcName, Path: ANSIString): Boolean;
function RunApp(Title, Name, CmdLn: ANSIString): DWORD;
function UnPackFiles(ArcName, Dir: ANSIString): Boolean;
implementation
uses ShellAPI, Forms, Classes, Data;
const
NError=3;
ErrorMsg: array[1..NError] of ShortString=(
'Упаковка файлов прервана',
'Распаковка временных файлов прервана',
'Файл неоткрывается');
RARName ='Rar.exe';
WinRARName='WinRar';
PackKey='a -ep1';
UnPackKey='x';
RARTitle='Óïàêîâêà ôàéëîâ';
Bl =' ';
function CopyFiles(Handle:HWND; Source, Dest: ANSIString): Longint;
var
F : TSHFileOpStruct;
Buffer1: array[0..4096] of Char;
Buffer2: array[0..4096] of Char;
S : PChar;
D : PChar;
begin
FillChar(Buffer1, SizeOf(Buffer1), #0);
FillChar(Buffer2, SizeOf(Buffer2), #0);
S := @Buffer1;
D := @Buffer2;
StrPCopy(S, Source);
StrPCopy(D, Dest);
FillChar(F, SizeOf(F), #0);
F.Wnd := Handle;
F.wFunc := FO_COPY;
F.pFrom := @Buffer1;
F.pTo := @Buffer2;
F.fFlags := 0;
Result:=SHFileOperation(F);
end;
procedure DeleteFileExt(var Name:ANSIString);
var
Ext : ShortString;
LenExt : Integer;
LenName: Integer;
begin
Ext:=ExtractFileExt(Name);
LenExt:=Length(Ext);
LenName:=Length(Name);
Delete(Name,LenName-LenExt+1,LenName);
end;
function DeleteFiles(Handle:HWND; Source: ANSIString): Longint;
var
F : TSHFileOpStruct;
Buffer: array[0..4096] of Char;
S : PChar;
begin
FillChar(Buffer, SizeOf(Buffer), #0);
S := @Buffer;
StrPCopy(S, Source);
FillChar(F, SizeOf(F), #0);
F.Wnd := Handle;
F.wFunc := FO_DELETE;
F.pFrom := @Buffer;
F.fFlags := FOF_NOCONFIRMATION;
Result:=SHFileOperation(F);
end;
function ExtractFileLastDir(Name: ANSIString): ANSIString;
var
I: Integer;
L: Integer;
begin
L:=Length(Name);
I:=L+1;
repeat
Dec(I);
until Name[I]='\';
Result:=Copy(Name,I,L-I);
end;
function GetNewArcName(Path: ShortString): ShortString;
var
ExtLen : Integer;
NameLen: Integer;
I : Integer;
Ext : ShortString;
Dir : ShortString;
Name : ShortString;
begin
Dir:=ExtractFilePath(Path);
Name:=ExtractFileName(Path);
if Trim(Name)='' then
Name:='Arc';
if FileExists(Dir+Name) then
begin
Ext:=ExtractFileExt(Name);
ExtLen:=Length(Ext);
NameLen:=Length(Name);
Insert('1',Name,NameLen-ExtLen+1);
I:=2;
while FileExists(Dir+Name) do
begin
Delete(Name,NameLen-ExtLen+1,Length(Name));
Name:=Concat(Name,IntToStr(I),Ext);
Inc(I);
end;
end;
Ext:=ExtractFileExt(Name);
if Ext='' then
Name:=Concat(Name,ArcExt);
Result:=Concat(Dir,Name);
end;
procedure OpenFile(FileName: TFileName; Dir:ANSIString);
var
PPath : PChar;
POpenDir: PChar;
Res : DWORD;
begin
FileName:=Concat(FileName);
GetMem(PPath,PathLen);
GetMem(POpenDir,Length(Dir)+1);
StrPCopy(POpenDir,Dir);
FindExecutable(PChar(FileName),PChar(Dir),PPath);
Res:=ShellExecute(Application.Handle,'open',PPath,PChar(FileName),
POpenDir,SW_SHOWNORMAL);
if Res<32 then
ShowMessage(ErrorMsg[3]);
FreeMem(POpenDir);
FreeMem(PPath);
end;
function PackFiles(ArcName, Path: ANSIString): Boolean;
var
Param : ShortString;
Res : DWORD;
PPath : PChar;
F : TFileStream;
FName : TFileName;
begin
FName:=Concat(Root,TmpDir,TmpFile,'1',ArcExt);
F:=TFileStream.Create(FName,fmCreate);
GetMem(PPath, PathLen);
if FindExecutable(PChar(FName),PChar(0),PPath)>32 then
begin
Param:=Concat(WinRARName,Bl,PackKey,Bl,ArcName,Bl,Path);
Res:=RunApp('',PPath,Param);
end
else
begin
Res:=0;
end;
if (Res<>0) then
begin
DeleteFiles(Application.Handle,ArcName);
ShowMessage(ErrorMsg[1]);
Result:=False;
end
else
Result:=True;
FreeMem(PPath);
F.Free;
DeleteFiles(Application.Handle,FName);
end;
function RunApp(Title, Name, CmdLn: ANSIString):DWORD;
var
Startup: TStartupInfo;
Process: TProcessInformation;
Status : DWORD;
Env : Pointer;
begin
ChDir(Root);
New(Env);
Startup.lpReserved := PChar(0);
Startup.lpDesktop := PChar(0);
Startup.lpTitle := PChar(Title);
Startup.dwFlags := STARTF_USESHOWWINDOW;
Startup.wShowWindow := SW_SHOWNORMAL;
Startup.cbReserved2 := 0;
Startup.lpReserved2 := PByte(0);
if CreateProcess(
PChar(Name), // lpApplicationName
PChar(CmdLn), // lpCommandLine
PSecurityAttributes(0), // lpProcessAttributes
PSecurityAttributes(0), // lpThreadAttributes
False, // bInheritHandles
NORMAL_PRIORITY_CLASS, // dwCreationFlags
Env, // lpEnvironment
PChar(0), // lpCurrentDirectory
Startup, // lpStartupInfo
Process // lpProcessInformation
)then
begin
GetExitCodeProcess(Process.hProcess, Status);
while Status = STILL_ACTIVE do
begin
Sleep(10);
GetExitCodeProcess(Process.hProcess, Status);
end;
end;
Dispose(Env);
Result:=Status;
end;
function UnPackFiles(ArcName, Dir: ANSIString): Boolean;
var
PPath : PChar;
Param : ShortString;
Res : DWORD;
begin
ArcName:=Concat('"',ArcName,'"');
GetMem(PPath, PathLen);
if FindExecutable(PChar(ArcName),PChar(0),PPath)>32 then
begin
Param:=Concat(WinRARName,Bl,UnPackKey,Bl,ArcName,Bl,Dir);
Res:=RunApp('',PPath,Param);
end
else
begin
Res:=0;
end;
FreeMem(PPath);
if Res<>0 then
begin
DeleteFiles(Application.Handle,Dir+'*.*');
ShowMessage(ErrorMsg[2]);
Result:=False;
end
else
Result:=True;
end;
end.