Рефераты

Разработка программного обеспечения для Отделения Реанимации и Интенсивной Терапии новорожденных МГБ N1 г. Сургута

термины

На этой лекции мы введем на сравнительно неформальном уровне основные

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

модели данных. Основной целью лекции является демонстрация простоты и

возможности интуитивной интерпретации этих понятий. В дальнейших лекциях

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

математическая теория реляционных баз данных

4.1. Базовые понятия реляционных баз данных

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

атрибут, кортеж, первичный ключ и отношение.

Для начала покажем смысл этих понятий на примере отношения СОТРУДНИКИ,

содержащего информацию о сотрудниках некоторой организации:

4.1.1. Тип данных

Понятие тип данных в реляционной модели данных полностью адекватно понятию

типа данных в языках программирования. Обычно в современных реляционных БД

допускается хранение символьных, числовых данных, битовых строк,

специализированных числовых данных (таких как "деньги"), а также

специальных "темпоральных" данных (дата, время, временной интервал).

Достаточно активно развивается подход к расширению возможностей реляционных

систем абстрактными типами данных (соответствующими возможностями обладают,

например, системы семейства Ingres/Postgres). В нашем примере мы имеем дело

с данными трех типов: строки символов, целые числа и "деньги".

4.1.2. Домен

Понятие домена более специфично для баз данных, хотя и имеет некоторые

аналогии с подтипами в некоторых языках программирования. В самом общем

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

которому относятся элементы домена, и произвольного логического выражения,

применяемого к элементу типа данных. Если вычисление этого логического

выражения дает результат "истина", то элемент данных является элементом

домена.

Наиболее правильной интуитивной трактовкой понятия домена является

понимание домена как допустимого потенциального множества значений данного

типа. Например, домен "Имена" в нашем примере определен на базовом типе

строк символов, но в число его значений могут входить только те строки,

которые могут изображать имя (в частности, такие строки не могут начинаться

с мягкого знака).

Следует отметить также семантическую нагрузку понятия домена: данные

считаются сравнимыми только в том случае, когда они относятся к одному

домену. В нашем примере значения доменов "Номера пропусков" и "Номера

групп" относятся к типу целых чисел, но не являются сравнимыми. Заметим,

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

Oracle V.7 оно уже поддерживается.

4.1.3. Схема отношения, схема базы данных

Схема отношения - это именованное множество пар {имя атрибута, имя домена

(или типа, если понятие домена не поддерживается)}. Степень или "арность"

схемы отношения - мощность этого множества. Степень отношения СОТРУДНИКИ

равна четырем, то есть оно является 4-арным. Если все атрибуты одного

отношения определены на разных доменах, осмысленно использовать для

именования атрибутов имена соответствующих доменов (не забывая, конечно, о

том, что это является всего лишь удобным способом именования и не устраняет

различия между понятиями домена и атрибута).

Схема БД (в структурном смысле) - это набор именованных схем отношений.

4.1.4. Кортеж, отношение

Кортеж, соответствующий данной схеме отношения, - это множество пар {имя

атрибута, значение}, которое содержит одно вхождение каждого имени

атрибута, принадлежащего схеме отношения. "Значение" является допустимым

значением домена данного атрибута (или типа данных, если понятие домена не

поддерживается). Тем самым, степень или "арность" кортежа, т.е. число

элементов в нем, совпадает с "арностью" соответствующей схемы отношения.

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

Отношение - это множество кортежей, соответствующих одной схеме отношения.

Иногда, чтобы не путаться, говорят "отношение-схема" и "отношение-

экземпляр", иногда схему отношения называют заголовком отношения, а

отношение как набор кортежей - телом отношения. На самом деле, понятие

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

программирования. Было бы вполне логично разрешать отдельно определять

схему отношения, а затем одно или несколько отношений с данной схемой.

Однако в реляционных базах данных это не принято. Имя схемы отношения в

таких базах данных всегда совпадает с именем соответствующего отношения-

экземпляра. В классических реляционных базах данных после определения схемы

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

новые и удаляться или модифицироваться существующие кортежи. Однако во

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

новых и изменение существующих схем отношения. Это принято называть

эволюцией схемы базы данных.

Обычным житейским представлением отношения является таблица, заголовком

которой является схема отношения, а строками - кортежи отношения-

экземпляра; в этом случае имена атрибутов именуют столбцы этой таблицы.

Поэтому иногда говорят "столбец таблицы", имея в виду "атрибут отношения".

Когда мы перейдем к рассмотрению практических вопросов организации

реляционных баз данных и средств управления, мы будем использовать эту

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

коммерческих реляционных СУБД.

Реляционная база данных - это набор отношений, имена которых совпадают с

именами схем отношений в схеме БД.

Как видно, основные структурные понятия реляционной модели данных (если не

считать понятия домена) имеют очень простую интуитивную интерпретацию, хотя

в теории реляционных БД все они определяются абсолютно формально и точно.

Методы, использованные для решения задачи.

Базовым инструментом для написания данного проекта был взят Delphi.

Открытая архитектура Delphi

Компания Borland в развитии своих объектно-ориентированных средств

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

объектная ориентация не являются единственными средствами повышения

производительности программистов. С появлением Delphi разработчик может не

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

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

работает, с помощью так называемых "открытых интерфейсов". Такой подход

позволяет использовать Delphi уже в роли общего ядра набора

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

начиная с CASE-систем и заканчивая генерацией документации по создаваемым

проектам, с полной их интеграцией в "святая святых" любой среды

программирования - IDE. Рассмотрим основные возможности расширения

функциональности среды Delphi для того, чтобы оценить степень "открытости"

архитектуры этого инструмента.

"Строительные блоки" приложений - компоненты

Как известно, фундаментальной основой визуальных средств Delphi является

компонентный подход. В чем же он заключается?

Delphi строится на базе компилятора объектно-ориентированного языка Object

Pascal, продолжающего линию диалектов Pascal - Turbo Pascal и Borland

Pascal. По мере своего развития, каждая очередная реализация Pascal

компании Borland включала все новые расширения синтаксиса, отражающие

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

оценке качественных "ступеней" развития Pascal, особо следует отметить три

из них, направленные на поддержку концепции повторного использования кода:

модульная архитектура, с возможностью разделения интерфейсной и

описательной частей (Turbo Pascal 4.0);

средства объектной ориентации, со всеми, присущими ей характеристиками -

наследованием, инкапсуляцией и полиморфизмом (Turbo Pascal 5.5);

поддержка механизмов RTTI (Run-Time Type Information), позволяющих получать

информацию о базовых характеристиках объектных типов (классов) и их

экземпляров (объектов) с помощью языковых средств, непосредственно

встроенных в системную библиотеку и структуру организации описаний классов

(Delphi 1.0 - Object Pascal);

Следствием введения поддержки RTTI стала возможность создания визуального

инструмента разработки приложений, каковым и является Delphi. На

определенном уровне иерархии наследования базовой библиотеки классов Delphi

появляется класс TPersistent, обеспечивающий необходимый уровень абстракции

потокового ввода/вывода объектов (экземпляров классов). Его наследником

выступает класс TComponent, определяющий основы поведения компонент Delphi

VCL (Visual Component Library) в режиме design-time (этап "конструирования"

приложения). На оконечных точках ветвей иерархии VCL находятся как таковые

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

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

Компонент (Components Palette) IDE Delphi.

Так как компоненты, используемые в разрабатываемой программе, написаны на

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

может достаточно легко создавать и регистрировать в Палитре свои

компоненты, наследуя их от тех или иных представителей иерархии VCL или уже

созданных программистом своих классов.

С другой стороны, механизмы регистрации и дальнейшего наследования уже

существующих стандартов динамического связывания (Windows DLL) и

компонентной архитектуры (VBX в Delphi 1.0 и OCX - в 32- разрядной версии

Delphi) позволяют использовать в Delphi доступные внешние инструменты

(например, компиляторы C++) и, созданные с их помощью, программные блоки.

Самодостаточность Delphi для расширения набора доступных компонент является

первым признаком открытости архитектуры этого инструмента.

Редакторы свойств и редакторы компонент - поведение IDE

Логично, что при визуальном подходе к определению характеристик компонент

(работа в design- time), необходимы средства определения редакторов

специфических свойств в Инспекторе Объектов (Object Inspector).

Рис. 1

Особенно остро встает для разработчиков компонент вопрос создания и

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

Например, свойство может предоставлять ссылку на достаточно сложную

структуру - запись или на строго определенных наследников одного из

стандартных или пользовательских классов (возможные ситуации: 1) класс

"множество данных" TDataSet - является предком и таблиц, и запросов, и

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

значения свойства в design-time должны выступать только запросы и таблицы,

но, ни в коем случае - хранимые процедуры; 2) шрифт описывается рядом

характеристик, представляемых вложенными записями).

Delphi предоставляет разработчику ряд базовых классов, входящих в иерархию

VCL, которые предназначены для создания редакторов свойств.

Рис. 2

Стандартные редакторы свойств (более 20) являются наследниками базовых

редакторов и, вместе с последними, доступны программисту для

расширения/изменения функциональности, опять-таки, с использованием

механизмов наследования и полиморфизма. Регистрация редакторов свойств и

регистрации компонент аналогична регистрации самих компонент.

Так как редакторы свойств и редакторы компонент определяют design-time,

существование таких редакторов и возможность расширения их функциональности

являются вторым признаком открытости Delphi.

Рис. 3

Генерация кода - эксперты

В процессе развития и, в том числе, визуализации средств разработки

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

областях применения конечных систем, неотъемлемой частью таких инструментов

стали генераторы кода и форм представления и ввода информации - эксперты.

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

(например, DataBase Form Expert, генерирующий формы и соответствующий код

для простых приложений обработки баз данных с использованием запросов), эта

среда программирования предоставляет разработчикам интерфейс для создания

собственных экспертов, встраиваемых в IDE.

Необходимо отметить, что функциональность таких экспертов может не

ограничиваться на генерации кода, в силу того, что интерфейс экспертов дает

возможность получения информации о внутренних объектах IDE, таких как

палитра компонент. Вследствие этого, под общим названием "эксперты" могут

фигурировать программные модули, позволяющие управлять повелением IDE, окна

дизайнера и ее редактора исходных текстов, а также генерировать отчетную

информацию о создаваемом проекте. (На приведенном выше рисунке вы можете

увидеть эксперт, разработанный в Delphi и встроенный в IDE;

функциональность этого эксперта заключается в предоставлении разработчику

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

компиляции; в данном случае доступ осуществляется через меню "Help", хотя

возможна регистрация и в "галерее" шаблонов Delphi).

Рис. 4

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

внутренней IDE- информации, называемых экспертами, являются третьим

признаком открытости архитектуры Delphi.

Интеграция с внешними приложениями - открытые интерфейсы

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

интеграция среды разработки Delphi с внешними инструментальными средствами

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

Рис. 5

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

перечисленным категориям, заявил о поддержке ими Delphi на достаточно

высоком уровне интеграции (подразумевая, например, для CASE-систем, не

только генерацию кода в соответствии с синтаксисом Object Pascal, но и

доступ к таким продуктам непосредственно из IDE). В качестве примера можно

привести компанию Popkin Software (производителя CASE-средства System

Architect), объявившую о поддержки Delphi в своих продуктах еще в августе

1995 года. Известен ряд систем контроля версий - Intersolv PVCS и MKS

Source Integrity, способных работать с Delphi (32-разрядная версия PVCS

входит в поставку Delphi Client/Server Suite 2.0, и, например, мониторов

транзакций (существует опыт взаимодействия с Novell Tuxedo и др.).

Описанные возможности интеграции с внешними приложениями на базе

совокупности открытых интерфейсов, определяют четвертый признак открытости

архитектуры Delphi.

Delphi – оптимальный инструмент разработчика БД.

Наконец, мы можем концептуально представить архитектуру открытых

интерфейсов Delphi. Она приведена на следующей диаграмме:

Рис. 6

Вследствие такой открытости архитектуры Delphi, большое количество третьих

компаний уже выбросило на рынок (или объявило о соответствующих планах) как

различные расширения библиотеки компонент VCL (более 200 только

коммерческих наборов компонент на октябрь 1995г.) так и средства интеграции

своих продуктов (external-site interface).

Получение результатов.

Дипломный проект был условно разбит на четыре этапа.

1) Анализ существующей структуры отделения. Анализ работы отделения.

2) Разработка модели АСУ ОРИТН.

3) Описание АРМа “ОРИТН в порядке”.

4) Внедрение программного продукта.

На первом этапе был проведен детальный анализ существующей структуры

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

ознакомлением с документацией и существующими отчетными формами.

Была предложена следующая схема автоматизации отделения. При поступлении

больного дежурный врач заносит начальные сведения в базу данных ОРИТН. При

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

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

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

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

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

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

выполнении. “ОРИТН в порядке” контролирует выполнение всего пакета плановых

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

сигнализирует вплоть до полного завершения всех плановых мероприятий.

Дежурный врач в случае необходимости составляет пакет экстренных

мероприятий. Контролирование выполнения данного пакета выполняется

аналогично предыдущему. Прекращение работы данных пакетов происходить после

заполнения врачом формы о смерти или выписке. Полная история архивируется и

остается в базе данных “ОРИТН в порядке”.

АРМ “ОРИТН в порядке” реализован на языке Delphi. В программе реализованы 8

уровней доступа характеризованные разделением функций персонала по штатному

расписанию.

1. Заведующий отделением.

1. Врач ординатор реаниматолог-неонатолог.

1. Старшая медицинская сестра.

1. Процедурная медицинская сестра.

1. Палатная медицинская сестра.

1. Сестра-хозяйка.

1. Санитарка палатная.

2. Санитарка автоклава.

У каждого работника персонала есть собственный уникальный пароль на доступ

к программе. В начале каждых суток ”ОРИТН в порядке” закрывает существующие

сессии и предлагает новой смене зарегистрироваться. Затем происходит

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

Активизируются пакеты плановых мероприятий на рабочих местах врачей-

ординаторов (с возможностью корректировки) и медицинских сестер. Врач-

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

изменения в один из пакетов.

Модуль «Администратор программы «ОРИТН в порядке»»

Поскольку разграничение доступа не позволяет корректировать записи в базе

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

вносить коррективы в любой раздел БД.

При загрузке модуль проверяет наличие прав доступа и в случае наличия

полномочий загружает основное окно (рис. 1п).

Рис. 1п

В наглядном виде представляются все данные, режим редактирования

общепринятый и интуитивно понятный.

В виде закладок отображены поля БД, для осуществления операций ввода и

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

уникальность.

Рис. 2п

На рис. 2п представлена одна из закладок «персонал».

Рис. 3п

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

базе ОРИТН, поскольку основной модуль исключает возможность удаления

данных.

Заключение.

Модель автоматизации деятельности отделения РИТН МГБ №1 соответствует

требованиям разработанным в ходе построения модели. Стандартизированы нами

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

базы данных по учету больных в данной области медицины. Результатом

проектирования стало написание статистической базы данных “ОРИТН в порядке”

версии 1.0 и “модуля администратора” “ОРИТН в порядке” на языке Delphi

3.0. Проделанная работа одобрена руководством отделения РИТН, в лице зав.

Отделением Челнокова С.Б.

Литература

1. С.Д. Кузнецов “Основы современных баз данных”,

http://www.citforum.ru/database/osbd/contents.shtml

2. К. Дейта, "Введение в системы баз данных", Наука, 1980.

3. "Руководство по реляционной СУБД DB2", Финансы и статистика, 1988.

4. Дж. Ульман "Основы систем баз данных", Финансы и статистика, 1983.

5. Материалы 6-й Ежегодной Конференции Разработчиков Borland.

6. Периодические издания (1998 год): Delphi Informant, Delphi Developer,

Microsoft System Journal, Dr. Dobb Journal, Компьютерр-Пресс и др.

7. WWW-серверы: Borland, Miller Friman, Turbo Power, ProtoView, Popkin

Software, InterSolv, AOL и др.

8. "Delphi Developers Guide", S.Tiexeira & X. Pacheco, SAMS Publishing /

Borland PRESS.

9. Каталоги программных продуктов "Delphi Only Tools" ZAC Catalog,

"Delphi Power Tools" Informant Communications Group.

Приложение 1

Задание

на дипломное проектирование

Студента специальности: 05.13.16 Гудониса Юрия Владимировича

Тема: Разработка программного обеспечения для автоматизации работы ОРИТН.

Целевая установка: Разработка базы данных и интерфейса программы для данных

на поступающего в отделение больного.

Исходные данные: Паспортные данные т.е. Ф.И.О., дата рождения, дата

поступления, рост, вес, диагноз при поступлении и т.д.

Начало проектирования: 01.01.98 Конец проектирования: 04.06.98

Содержание работы.

1. Исследование объекта проектирования.

2. Приведение в систему всей вводимой информации.

3. Реализация проекта:

Разработка интерфейса.

Разработка модуля администратора баз данных “ОРИТН в порядке”

4. Предварительное тестирование программы на месте.

5. Устранение ошибок и дополнение.

6. Окончательная установка программы.

Отчетный материал.

1. Пояснительная записка на листах.

2. Графики и схемы на листах.

Литература.

1. "Delphi Developers Guide", S.Tiexeira & X. Pacheco, SAMS Publishing /

Borland PRESS.

2. Дж. Ульмана "Основы систем баз данных" (Финансы и статистика, 1983).

Подписи:

Задание получил студент: Ю. В. Гудонис

Руководитель проекта: С. Б. Челноков

Зав. Кафедрой: В. А. Острейковский

Приложение 2

Исходные тексты программы

Модуль «Администратор программы «ОРИТН в порядке»»

Main.pas

unit Main;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls, ComCtrls, StdCtrls, Buttons, ToolWin, Grids, DBGrids, DBCtrls;

type

TFrmMain = class(TForm)

Panel1: TPanel;

ToolBar1: TToolBar;

BitBtn1: TBitBtn;

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

TabSheet3: TTabSheet;

TabSheet4: TTabSheet;

TabSheet5: TTabSheet;

TabSheet6: TTabSheet;

TabSheet7: TTabSheet;

TabSheet8: TTabSheet;

TabSheet9: TTabSheet;

Panel2: TPanel;

DBGrid1: TDBGrid;

PageControl2: TPageControl;

TabSheet10: TTabSheet;

TabSheet11: TTabSheet;

TabSheet12: TTabSheet;

TabSheet13: TTabSheet;

DBMemo1: TDBMemo;

DBMemo2: TDBMemo;

DBMemo3: TDBMemo;

DBMemo4: TDBMemo;

DBGrid2: TDBGrid;

Panel3: TPanel;

DBNavigator1: TDBNavigator;

Panel4: TPanel;

DBNavigator2: TDBNavigator;

Panel5: TPanel;

Panel6: TPanel;

Panel7: TPanel;

Panel8: TPanel;

Panel9: TPanel;

Panel10: TPanel;

Panel11: TPanel;

Panel12: TPanel;

EditDS: TEdit;

BitBtn2: TBitBtn;

BtnSAVE: TBitBtn;

Panel13: TPanel;

DBNavigator3: TDBNavigator;

DBGrid3: TDBGrid;

BitBtn3: TBitBtn;

Panel14: TPanel;

Panel15: TPanel;

DBNavigator4: TDBNavigator;

DBGrid4: TDBGrid;

BitBtn4: TBitBtn;

BitBtn5: TBitBtn;

BtnSAVEENTER: TBitBtn;

EditENTER: TEdit;

Panel16: TPanel;

BitBtn6: TBitBtn;

BitBtn7: TBitBtn;

BtnSAVEENTER2: TBitBtn;

EditENTER2: TEdit;

Panel17: TPanel;

DBNavigator5: TDBNavigator;

DBGrid5: TDBGrid;

Panel18: TPanel;

BitBtn8: TBitBtn;

BitBtn9: TBitBtn;

BtnSAVEPERSONAL: TBitBtn;

Panel19: TPanel;

DBNavigator6: TDBNavigator;

EditPERSONAL: TEdit;

DBGrid6: TDBGrid;

Panel20: TPanel;

BitBtn10: TBitBtn;

BitBtn11: TBitBtn;

BtnSAVEPTYPE: TBitBtn;

EditPTYPE: TEdit;

Panel21: TPanel;

DBNavigator7: TDBNavigator;

DBGrid7: TDBGrid;

Panel22: TPanel;

BitBtn12: TBitBtn;

BitBtn13: TBitBtn;

BtnSAVESTREET: TBitBtn;

EditSTREET: TEdit;

Panel23: TPanel;

DBNavigator8: TDBNavigator;

DBGrid8: TDBGrid;

Panel24: TPanel;

BitBtn14: TBitBtn;

BitBtn15: TBitBtn;

BtnSAVEVILLAGE: TBitBtn;

EditVILLAGE: TEdit;

Panel25: TPanel;

DBNavigator9: TDBNavigator;

DBGrid9: TDBGrid;

procedure EditDSChange(Sender: TObject);

procedure BitBtn2Click(Sender: TObject);

procedure BtnSAVEClick(Sender: TObject);

procedure EditDSClick(Sender: TObject);

procedure BitBtn4Click(Sender: TObject);

procedure BitBtn3Click(Sender: TObject);

procedure BitBtn5Click(Sender: TObject);

procedure BtnSAVEENTERClick(Sender: TObject);

procedure EditENTERChange(Sender: TObject);

procedure EditENTERClick(Sender: TObject);

procedure BitBtn6Click(Sender: TObject);

procedure BitBtn7Click(Sender: TObject);

procedure BtnSAVEENTER2Click(Sender: TObject);

procedure EditENTER2Change(Sender: TObject);

procedure EditENTER2Click(Sender: TObject);

procedure BitBtn8Click(Sender: TObject);

procedure BitBtn9Click(Sender: TObject);

procedure BtnSAVEPERSONALClick(Sender: TObject);

procedure EditPERSONALChange(Sender: TObject);

procedure EditPERSONALKeyPress(Sender: TObject; var Key: Char);

procedure BitBtn10Click(Sender: TObject);

procedure BitBtn11Click(Sender: TObject);

procedure BtnSAVEPTYPEClick(Sender: TObject);

procedure EditPTYPEChange(Sender: TObject);

procedure EditPTYPEKeyPress(Sender: TObject; var Key: Char);

procedure BitBtn12Click(Sender: TObject);

procedure BitBtn13Click(Sender: TObject);

procedure BtnSAVESTREETClick(Sender: TObject);

procedure EditSTREETChange(Sender: TObject);

procedure EditSTREETKeyPress(Sender: TObject; var Key: Char);

procedure BitBtn14Click(Sender: TObject);

procedure BitBtn15Click(Sender: TObject);

procedure BtnSAVEVILLAGEClick(Sender: TObject);

procedure EditVILLAGEChange(Sender: TObject);

procedure EditVILLAGEKeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

FrmMain: TFrmMain;

implementation

uses AdminDM, DB;

{$R *.DFM}

procedure TFrmMain.EditDSChange(Sender: TObject);

begin

With DMAdmin do

begin

TblDS.Locate('TITLE', EditDS.Text, [loPartialKey]);

if (TblDSTITLE.Value <> EditDS.Text) and

(EditDS.Text <> '')

then

BtnSAVE.Enabled := True

else

BtnSAVE.Enabled := False;

TblDS.Locate('TITLE', EditDS.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn2Click(Sender: TObject);

begin

EditDS.Enabled := True;

EditDS.SetFocus;

end;

procedure TFrmMain.BtnSAVEClick(Sender: TObject);

begin

DMAdmin.TblDS.Insert;

DMAdmin.TblDSCODE.Value := DMAdmin.TblDS.RecordCount;

DMAdmin.TblDSTITLE.Value := EditDS.Text;

DMAdmin.TblDS.Post;

DMAdmin.TblDS.Refresh;

EditDS.Text := '';

EditDS.Enabled := False;

BtnSAVE.Enabled := False;

end;

procedure TFrmMain.EditDSClick(Sender: TObject);

begin

With DMAdmin do

begin

TblDS.Locate('TITLE', EditDS.Text, [loPartialKey]);

if (TblDSTITLE.Value <> EditDS.Text) and

(EditDS.Text <> '')

then

BtnSAVE.Enabled := True

else

BtnSAVE.Enabled := False;

TblDS.Locate('TITLE', EditDS.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn4Click(Sender: TObject);

begin

EditENTER.Enabled := True;

EditENTER.SetFocus;

end;

procedure TFrmMain.BitBtn3Click(Sender: TObject);

begin

EditDS.Text := '';

EditDS.Enabled := False;

BtnSAVE.Enabled := False;

end;

procedure TFrmMain.BitBtn5Click(Sender: TObject);

begin

EditENTER.Text := '';

EditENTER.Enabled := False;

BtnSAVEENTER.Enabled := False;

end;

procedure TFrmMain.BtnSAVEENTERClick(Sender: TObject);

begin

DMAdmin.TblENTERA.Insert;

DMAdmin.TblENTERACODE.Value := DMAdmin.TblENTERA.RecordCount;

DMAdmin.TblENTERATITLE.Value := EditENTER.Text;

DMAdmin.TblENTERA.Post;

DMAdmin.TblENTERA.Refresh;

EditENTER.Text := '';

EditENTER.Enabled := False;

BtnSAVEENTER.Enabled := False;

end;

procedure TFrmMain.EditENTERChange(Sender: TObject);

begin

With DMAdmin do

begin

TblENTERA.Locate('TITLE', EditENTER.Text, [loPartialKey]);

if (TblENTERATITLE.Value <> EditENTER.Text) and

(EditENTER.Text <> '')

then

BtnSAVEENTER.Enabled := True

else

BtnSAVEENTER.Enabled := False;

TblENTERA.Locate('TITLE', EditENTER.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditENTERClick(Sender: TObject);

begin

With DMAdmin do

begin

TblENTERA.Locate('TITLE', EditENTER.Text, [loPartialKey]);

if (TblENTERTITLE.Value <> EditENTER.Text) and

(EditENTER.Text <> '')

then

BtnSAVEENTER.Enabled := True

else

BtnSAVEENTER.Enabled := False;

TblENTERA.Locate('TITLE', EditENTER.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn6Click(Sender: TObject);

begin

EditENTER2.Enabled := True;

EditENTER2.SetFocus;

end;

procedure TFrmMain.BitBtn7Click(Sender: TObject);

begin

EditENTER2.Text := '';

EditENTER2.Enabled := False;

BtnSAVEENTER2.Enabled := False;

end;

procedure TFrmMain.BtnSAVEENTER2Click(Sender: TObject);

begin

DMAdmin.TblENTER2A.Insert;

DMAdmin.TblENTER2ACODE.Value := DMAdmin.TblENTER2A.RecordCount;

DMAdmin.TblENTER2ATITLE.Value := EditENTER2.Text;

DMAdmin.TblENTER2A.Post;

DMAdmin.TblENTER2A.Refresh;

EditENTER2.Text := '';

EditENTER2.Enabled := False;

BtnSAVEENTER2.Enabled := False;

end;

procedure TFrmMain.EditENTER2Change(Sender: TObject);

begin

With DMAdmin do

begin

TblENTER2A.Locate('TITLE', EditENTER2.Text, [loPartialKey]);

if (TblENTER2ATITLE.Value <> EditENTER2.Text) and

(EditENTER2.Text <> '')

then

BtnSAVEENTER2.Enabled := True

else

BtnSAVEENTER2.Enabled := False;

TblENTER2A.Locate('TITLE', EditENTER2.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditENTER2Click(Sender: TObject);

begin

With DMAdmin do

begin

TblENTER2A.Locate('TITLE', EditENTER2.Text, [loPartialKey]);

if (TblENTER2TITLE.Value <> EditENTER2.Text) and

(EditENTER2.Text <> '')

then

BtnSAVEENTER2.Enabled := True

else

BtnSAVEENTER2.Enabled := False;

TblENTER2A.Locate('TITLE', EditENTER2.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn8Click(Sender: TObject);

begin

EditPERSONAL.Enabled := True;

EditPERSONAL.SetFocus;

end;

procedure TFrmMain.BitBtn9Click(Sender: TObject);

begin

EditPERSONAL.Text := '';

EditPERSONAL.Enabled := False;

BtnSAVEPERSONAL.Enabled := False;

end;

procedure TFrmMain.BtnSAVEPERSONALClick(Sender: TObject);

begin

DMAdmin.TblPERSONAL.Insert;

DMAdmin.TblPERSONALID.Value := DMAdmin.TblPERSONAL.RecordCount + 1;

DMAdmin.TblPERSONALFIO.Value := EditPERSONAL.Text;

DMAdmin.TblPERSONAL.Post;

DMAdmin.TblPERSONAL.Refresh;

EditPERSONAL.Text := '';

EditPERSONAL.Enabled := False;

BtnSAVEPERSONAL.Enabled := False;

end;

procedure TFrmMain.EditPERSONALChange(Sender: TObject);

begin

With DMAdmin do

begin

TblPERSONAL.Locate('FIO', EditPERSONAL.Text, [loPartialKey]);

if (TblPERSONALFIO.Value <> EditPERSONAL.Text) and

(EditPERSONAL.Text <> '')

then

BtnSAVEPERSONAL.Enabled := True

else

BtnSAVEPERSONAL.Enabled := False;

TblPERSONAL.Locate('FIO', EditPERSONAL.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditPERSONALKeyPress(Sender: TObject; var Key: Char);

begin

With DMAdmin do

begin

TblPERSONAL.Locate('FIO', EditPERSONAL.Text, [loPartialKey]);

if (TblPERSONALFIO.Value <> EditPERSONAL.Text) and

(EditPERSONAL.Text <> '')

then

BtnSAVEPERSONAL.Enabled := True

else

BtnSAVEPERSONAL.Enabled := False;

TblPERSONAL.Locate('FIO', EditPERSONAL.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn10Click(Sender: TObject);

begin

EditPTYPE.Enabled := True;

EditPTYPE.SetFocus;

end;

procedure TFrmMain.BitBtn11Click(Sender: TObject);

begin

EditPTYPE.Text := '';

EditPTYPE.Enabled := False;

BtnSAVEPTYPE.Enabled := False;

end;

procedure TFrmMain.BtnSAVEPTYPEClick(Sender: TObject);

begin

DMAdmin.TblPTYPE.Insert;

DMAdmin.TblPTYPECODE.Value := DMAdmin.TblPTYPE.RecordCount + 1;

DMAdmin.TblPTYPETITLE.Value := EditPTYPE.Text;

DMAdmin.TblPTYPE.Post;

DMAdmin.TblPTYPE.Refresh;

EditPTYPE.Text := '';

EditPTYPE.Enabled := False;

BtnSAVEPTYPE.Enabled := False;

end;

procedure TFrmMain.EditPTYPEChange(Sender: TObject);

begin

With DMAdmin do

begin

TblPTYPE.Locate('TITLE', EditPTYPE.Text, [loPartialKey]);

if (TblPTYPETITLE.Value <> EditPTYPE.Text) and

(EditPTYPE.Text <> '')

then

BtnSAVEPTYPE.Enabled := True

else

BtnSAVEPTYPE.Enabled := False;

TblPTYPE.Locate('TITLE', EditPTYPE.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditPTYPEKeyPress(Sender: TObject; var Key: Char);

begin

With DMAdmin do

begin

TblPTYPE.Locate('TITLE', EditPTYPE.Text, [loPartialKey]);

if (TblPTYPETITLE.Value <> EditPTYPE.Text) and

(EditPTYPE.Text <> '')

then

BtnSAVEPTYPE.Enabled := True

else

BtnSAVEPTYPE.Enabled := False;

TblPTYPE.Locate('TITLE', EditPTYPE.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn12Click(Sender: TObject);

begin

EditSTREET.Enabled := True;

EditSTREET.SetFocus;

end;

procedure TFrmMain.BitBtn13Click(Sender: TObject);

begin

EditSTREET.Text := '';

EditSTREET.Enabled := False;

BtnSAVESTREET.Enabled := False;

end;

procedure TFrmMain.BtnSAVESTREETClick(Sender: TObject);

begin

DMAdmin.TblSTREET.Insert;

DMAdmin.TblSTREETCODE.Value := DMAdmin.TblSTREET.RecordCount + 1;

DMAdmin.TblSTREETTITLE.Value := EditSTREET.Text;

DMAdmin.TblSTREET.Post;

DMAdmin.TblSTREET.Refresh;

EditSTREET.Text := '';

EditSTREET.Enabled := False;

BtnSAVESTREET.Enabled := False;

end;

procedure TFrmMain.EditSTREETChange(Sender: TObject);

begin

With DMAdmin do

begin

TblSTREET.Locate('TITLE', EditSTREET.Text, [loPartialKey]);

if (TblSTREETTITLE.Value <> EditSTREET.Text) and

(EditSTREET.Text <> '')

then

BtnSAVESTREET.Enabled := True

else

BtnSAVESTREET.Enabled := False;

TblSTREET.Locate('TITLE', EditSTREET.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditSTREETKeyPress(Sender: TObject; var Key: Char);

begin

With DMAdmin do

begin

TblSTREET.Locate('TITLE', EditSTREET.Text, [loPartialKey]);

if (TblSTREETTITLE.Value <> EditSTREET.Text) and

(EditSTREET.Text <> '')

then

BtnSAVESTREET.Enabled := True

else

BtnSAVESTREET.Enabled := False;

TblSTREET.Locate('TITLE', EditSTREET.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.BitBtn14Click(Sender: TObject);

begin

EditVILLAGE.Enabled := True;

EditVILLAGE.SetFocus;

end;

procedure TFrmMain.BitBtn15Click(Sender: TObject);

begin

EditVILLAGE.Text := '';

EditVILLAGE.Enabled := False;

BtnSAVEVILLAGE.Enabled := False;

end;

procedure TFrmMain.BtnSAVEVILLAGEClick(Sender: TObject);

begin

DMAdmin.TblVILLAGE.Insert;

DMAdmin.TblVILLAGECODE.Value := DMAdmin.TblVILLAGE.RecordCount + 1;

DMAdmin.TblVILLAGETITLE.Value := EditVILLAGE.Text;

DMAdmin.TblVILLAGE.Post;

DMAdmin.TblVILLAGE.Refresh;

EditVILLAGE.Text := '';

EditVILLAGE.Enabled := False;

BtnSAVEVILLAGE.Enabled := False;

end;

procedure TFrmMain.EditVILLAGEChange(Sender: TObject);

begin

With DMAdmin do

begin

TblVILLAGE.Locate('TITLE', EditVILLAGE.Text, [loPartialKey]);

if (TblVILLAGETITLE.Value <> EditVILLAGE.Text) and

(EditVILLAGE.Text <> '')

then

BtnSAVEVILLAGE.Enabled := True

else

BtnSAVEVILLAGE.Enabled := False;

TblVILLAGE.Locate('TITLE', EditVILLAGE.Text, [loPartialKey]);

end;

end;

procedure TFrmMain.EditVILLAGEKeyPress(Sender: TObject; var Key: Char);

begin

With DMAdmin do

begin

TblVILLAGE.Locate('TITLE', EditVILLAGE.Text, [loPartialKey]);

if (TblVILLAGETITLE.Value <> EditVILLAGE.Text) and

(EditVILLAGE.Text <> '')

then

BtnSAVEVILLAGE.Enabled := True

else

BtnSAVEVILLAGE.Enabled := False;

TblVILLAGE.Locate('TITLE', EditVILLAGE.Text, [loPartialKey]);

end;

end;

end.

AdminDM.pas

unit AdminDM;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Db, DBTables;

type

TDMAdmin = class(TDataModule)

TblDATA: TTable;

DatSrcDATA: TDataSource;

TblYEARS: TTable;

DatSrcYEARS: TDataSource;

TblDATAYEARNUM: TFloatField;

TblDATANN: TFloatField;

TblDATAHISTORYNUM: TFloatField;

TblDATAFIO: TStringField;

TblDATABORNDATE: TDateField;

TblDATABORNTIMEH: TSmallintField;

TblDATABORNTIMEM: TSmallintField;

TblDATAENTERDATE: TDateField;

TblDATAENTERTIMEH: TSmallintField;

TblDATAENTERTIMEM: TSmallintField;

TblDATASEX: TSmallintField;

TblDATABODYMASS: TFloatField;

TblDATABODYLENGHT: TFloatField;

TblDATAAPGAR: TStringField;

TblDATADN: TSmallintField;

TblDATAENTER: TFloatField;

TblDATAENTER2: TSmallintField;

TblDATAENTERDS: TMemoField;

TblDATADS: TFloatField;

TblDATADSNOTE: TMemoField;

TblDATASTATUS: TFloatField;

TblDATASTATUSDATE: TDateField;

TblDATASTATUSTIME: TStringField;

TblDATASTATUSNOTE: TMemoField;

TblDATAADDRESS: TFloatField;

TblDATAVILLAGE: TFloatField;

TblDATASTREET: TFloatField;

TblDATAHOME: TStringField;

TblDATAFLAT: TStringField;

TblDATAPHONE: TStringField;

TblDATANOTE: TMemoField;

TblDATAOPERATION: TFloatField;

TblDATAYEARs: TIntegerField;

TblDATABORNTIMEs: TStringField;

TblDATAENTERTIMEs: TStringField;

TblDATASEXs: TStringField;

TblDATADNs: TStringField;

TblENTER: TTable;

DatSrcENTER: TDataSource;

TblENTER2: TTable;

DatSrcENTER2: TDataSource;

TblDATAENTERs: TStringField;

TblDATAENTER2s: TStringField;

TblDS: TTable;

DatSrcDS: TDataSource;

TblDATADSs: TStringField;

TblDATASTATUSs: TStringField;

TblDATAADDRESSs: TStringField;

TblSTREET: TTable;

DatSrcSTREET: TDataSource;

TblVILLAGE: TTable;

DatSrcVILLAGE: TDataSource;

TblDATASTREETs: TStringField;

TblDATAVILLAGEs: TStringField;

TblDATA2: TTable;

DatSrcDATA2: TDataSource;

TblDATA2NN: TFloatField;

TblDATA2NEUROL1: TSmallintField;

TblDATA2NEUROL2: TSmallintField;

TblDATA2NEUROL3: TSmallintField;

TblDATA2NEUROL4: TSmallintField;

TblDATA2NEUROL5: TSmallintField;

TblDATA2NEUROL6: TSmallintField;

TblDATA2NEUROL7: TSmallintField;

TblDATA2NEUROL8: TSmallintField;

TblDATA2NEUROL9: TSmallintField;

TblDATA2NEUROL10: TSmallintField;

TblDATA2EXT1: TSmallintField;

TblDATA2EXT2: TSmallintField;

TblDATA2EXT3: TSmallintField;

TblDATA2EXT4: TSmallintField;

TblDATA2EXT5: TSmallintField;

TblDATA2EXT6: TSmallintField;

TblDATA2EXT7: TSmallintField;

TblDATA2EXT8: TSmallintField;

TblDATA2EXT9: TSmallintField;

TblDATA2EXT10: TSmallintField;

TblDATA2EXT11: TSmallintField;

TblDATA2NAMEs: TStringField;

TblENTERTITLE: TStringField;

TblENTERCODE: TSmallintField;

TblENTER2ENTERID: TSmallintField;

TblENTER2TITLE: TStringField;

TblENTER2CODE: TSmallintField;

TblDSTITLE: TStringField;

TblDSCODE: TFloatField;

TblSTREETTITLE: TStringField;

TblSTREETCODE: TFloatField;

TblVILLAGETITLE: TStringField;

TblVILLAGECODE: TFloatField;

TblENTER2ENTERs: TStringField;

TblENTERA: TTable;

DatSrcENTERA: TDataSource;

TblENTER2A: TTable;

DatSrcENTER2A: TDataSource;

TblENTER2AENTERID: TSmallintField;

TblENTER2ATITLE: TStringField;

TblENTER2ACODE: TSmallintField;

TblENTERATITLE: TStringField;

TblENTERACODE: TSmallintField;

TblENTER2AENTERs: TStringField;

TblPERSONAL: TTable;

DatSrcPERSONAL: TDataSource;

TblPTYPE: TTable;

DatSrcPTYPE: TDataSource;

TblPERSONALID: TSmallintField;

TblPERSONALFIO: TStringField;

TblPERSONALNAME1: TStringField;

TblPERSONALNAME2: TStringField;

TblPERSONALTYPE: TSmallintField;

TblPERSONALISACTIVE: TSmallintField;

TblPERSONALPSW: TStringField;

TblPTYPECODE: TSmallintField;

TblPTYPETITLE: TStringField;

TblPERSONALPTYPEs: TStringField;

procedure DMAdminCreate(Sender: TObject);

procedure TblDATACalcFields(DataSet: TDataSet);

private

{ Private declarations }

public

{ Public declarations }

end;

var

DMAdmin: TDMAdmin;

implementation

{$R *.DFM}

procedure TDMAdmin.DMAdminCreate(Sender: TObject);

begin

TblDATA.Open;

TblDATA2.Open;

TblYEARS.Open;

TblENTER.Open;

TblENTER2.Open;

TblDS.Open;

TblSTREET.Open;

TblVILLAGE.Open;

TblENTERA.Open;

TblENTER2A.Open;

TblPERSONAL.Open;

TblPTYPE.Open;

end;

procedure TDMAdmin.TblDATACalcFields(DataSet: TDataSet);

begin

TblDATABORNTIMEs.Value := IntToStr(TblDATABORNTIMEH.Value) +

':' +

IntToStr(TblDATABORNTIMEM.Value);

TblDATAENTERTIMEs.Value := IntToStr(TblDATAENTERTIMEH.Value) +

':' +

IntToStr(TblDATAENTERTIMEM.Value);

Case TblDATASEX.AsInteger of

0:

TblDATASexs.Value := 'МУЖ';

1:

TblDATASexs.Value := 'ЖЕН';

else

TblDATASexs.Value := '???';

end; { Case }

Case TblDATADN.AsInteger of

0:

TblDATADNs.Value := 'ДОН';

1:

TblDATADNs.Value := 'НЕД';

else

TblDATADNs.Value := '???';

end; { Case }

Case TblDATASTATUS.AsInteger of

0:

TblDATASTATUSs.Value := 'БЕЗ ИЗМЕНЕНИЙ';

1:

TblDATASTATUSs.Value := 'ПЕРЕВЕДЕН';

2:

TblDATASTATUSs.Value := 'УМЕР';

else

TblDATASTATUSs.Value := '???';

end; { Case }

Case TblDATAADDRESS.AsInteger of

0:

TblDATAADDRESSs.Value := 'СУРГУТ';

1:

TblDATAADDRESSs.Value := 'РАЙОН';

else

TblDATAADDRESSs.Value := '???';

end; { Case }

end;

end.

-----------------------

[pic]

[pic]

Страницы: 1, 2, 3


© 2010 Современные рефераты