Проектирование и разработка базы данных и приложения "Техническое обслуживание станков" средствами СУБД Firebird

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.09.2017
Размер файла 735,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Федеральное агентство по высшему образованию

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

Ивановский государственный химико-технологический университет

Кафедра Информатики и вычислительной техники

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА К КУРСОВОМУ ПРОЕКТУ

по дисциплине Управление данными

Тема: проектирование и разработка базы данных и приложения "Техническое обслуживание станков" средствами СУБД Firebird

Выполнил: ст-т группы 3/42

Рогачев А.А.

Иваново 2008

Задание

Техническое обслуживание станков

Описание предметной области

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

Виды станков (Код вида станка, Страна, Год выпуска, Марка).

Виды ремонта (Код ремонта, Название, Продолжительность, Стоимость, Примечания).

Ремонт (Код вида станка, Код ремонта, Дата начала, Примечания).

Развитие постановки задачи

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

Введение

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

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

Одной из популярных реляционных СУБД является Firebird. Эта СУБД работает на разных операционных системах, включая Windows, Linux и другие разновидности Unix-систем. Firebird поддерживает большинство требований стандартов ANSI SQL и имеет средства для работы с триггерами, вычисляемыми полями и хранимыми процедурами.

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

Для создания базы данных в данном курсовом проекте была использована СУБД Firebird.

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

В данном курсовом проекте приложение для работы с базой данных было создано в среде Microsoft Visual Studio 2005. В качестве языка разработки был выбран относительно молодой и перспективный язык C#. Основные его преимущества перед другими используемыми в настоящее время языками программирования следующие:

1. Богатая и функциональная объектно-ориентированная модель. C# сильно облегчает работу с объектами, предоставляя разработчику такие механизмы, как передача объектов по ссылке и автоматический «сбор мусора».

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

3. Мультиплатформенность. Приложения, созданные на C#, могут быть с минимально необходимыми изменениями перенесены на другие операционные системы, отличные от Windows.

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

Для того, чтобы приложение смогло работать с созданной в Firebird базой данных, в системе должен присутствовать специальный драйвер, реализующий функции подключения и обработки запросов из приложений, написанных в среде Visual Studio. В этом курсовом проекте использовался драйвер IBProvider 3.0.0.3464. Он поставляется в двух версиях, коммерческой и свободной, которые различаются своими возможностями. Для этого проекта вполне достаточно было и свободной версии.

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

1. Анализ предметной области

Первоначальный анализ предметной области выявил в системе четыре основных сущности:

· Вид станка

· Вид ремонта

· Станок

· Ремонт

Вид станка определяется параметрами: страна, год выпуска, марка. Станок характеризуется кодом станка, видом станка, и количеством ремонтов, сделанных с данным станком. Между видом станка и станком очевидно имеется не идентифицирующая связь «родитель-потомок».

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

Построим по данному описанию инфологическую модель данных с помощью пакета ERWin:

Рис. 1

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

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

Модифицируем инфологическую модель с учетом данных замечаний:

Рис. 2

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

Страна:

· Код Страны (суррогатный ключ): Integer

· Название: Varchar(50)

Марка:

· Код Марки (суррогатный ключ): Integer

· Название марки: Varchar(10)

Вид Станка:

· Код Вида Станка (суррогатный ключ): Integer

· Год Выпуска: Numeric(4)

· Код Страны (внешний ключ): Integer

· Код Марки (внешний ключ): Integer

Станок:

· Код Станка (ключ): Varchar(10)

· Количество Ремонтов: Integer

· Код Вида Станка (внешний ключ): Integer

Вид Ремонта:

· Код Вида Ремонта (суррогатный ключ): Integer

· Длительность: Integer

· Название ремонта: Varchar(20)

· Стоимость: Decimal(10,2)

· Примечания: Varchar(100)

Ремонт:

· Код Станка (внешний ключ, ключевое поле): Varchar(10)

· Код Вида Ремонта (внешний ключ, ключевое поле): Integer

· Дата Начала (ключевое поле): Date

· Завершен?: Char(1) - должен принимать только значения 'Y' или 'N'

· Примечания: Varchar(100)

Полная атрибутивная модель будет иметь вид:

Рис. 3

Воспользуемся инструментом ERWin и создадим по данной инфологической модели физическую модель данных для базы данных типа InterBase:

Рис. 4

В структуру добавлена одна вспомогательная таблица MONTHS, которая в будущем облегчит создание запросов.

2. Структура базы данных

База данных была создана в менеджере баз данных InterBase/Firebird. Данный менеджер был выбран, поскольку я уже знаком с его функциональностью и особенностями используемого SQL-диалекта, что в большой степени облегчает работу. Хотя возможности Firebird и не велики по сравнению, скажем, с Microsoft SQL Server, их вполне достаточно для реализации всех задач, которые могут возникнуть в процессе разработки проекта.

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

1. Таблица COUNTRY

Код страны

Название

CREATE TABLE COUNTRY (

COUNTRY_NAME Varchar(50),

COUNTRY_CODE Integer NOT NULL,

PRIMARY KEY (COUNTRY_CODE)

);

CREATE UNIQUE INDEX XPKCOUNTRY ON COUNTRY(COUNTRY_CODE);

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

CREATE GENERATOR GEN_COUNTRY_ID;

SET GENERATOR GEN_COUNTRY_ID TO 0

CREATE OR ALTER TRIGGER TR_GEN_COUNTRY_ID FOR COUNTRY

ACTIVE BEFORE INSERT POSITION 0

AS

begin

IF (NEW.COUNTRY_CODE IS NULL) THEN

NEW.COUNTRY_CODE=GEN_ID(GEN_COUNTRY_ID,1);

end

2. Таблица MARK

Код марки

Название

CREATE TABLE MARK (

MARK_NAME Varchar(10) NOT NULL,

MARK_CODE Integer NOT NULL,

PRIMARY KEY (MARK_CODE)

);

CREATE UNIQUE INDEX XPKMARK ON MARK(MARK_CODE);

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

CREATE GENERATOR GEN_MARK_ID;

SET GENERATOR GEN_MARK_ID TO 0

CREATE OR ALTER TRIGGER TR_GEN_MARK_ID FOR MARK

ACTIVE BEFORE INSERT POSITION 0

AS

begin

IF (NEW.MARK_CODE IS NULL) THEN

NEW.MARK_CODE=GEN_ID(GEN_MARK_ID,1);

end

3. Таблица MACHINE_TYPE

Код вида станка

Код страны

Год выпуска

Код марки

CREATE TABLE MACHINE_TYPE (

MACHINETYPE_CODE Integer NOT NULL,

COUNTRY_CODE Integer NOT NULL,

MACHINETYPE_YEAR Numeric(4,0),

MARK_CODE Integer NOT NULL,

PRIMARY KEY (MACHINETYPE_CODE)

);

ALTER TABLE MACHINE_TYPE ADD FOREIGN KEY (COUNTRY_CODE) REFERENCES COUNTRY(COUNTRY_CODE);

ALTER TABLE MACHINE_TYPE ADD FOREIGN KEY (MARK_CODE) REFERENCES MARK(MARK_CODE);

CREATE INDEX XIF1MACHINE_TYPE ON MACHINE_TYPE(COUNTRY_CODE);

CREATE INDEX XIF2MACHINE_TYPE ON MACHINE_TYPE(MARK_CODE);

CREATE UNIQUE INDEX XPKMACHINE_TYPE ON MACHINE_TYPE(MACHINETYPE_CODE);

Автоинкремент поля MACHINETYPE_CODE обеспечивают генератор целых чисел и триггер на вставку записи в таблицу:

CREATE GENERATOR GEN_MACHINE_TYPE_ID;

SET GENERATOR GEN_MACHINE_TYPE_ID TO 0

CREATE OR ALTER TRIGGER TR_GEN_MACHINE_TYPE_ID FOR MACHINE_TYPE

ACTIVE BEFORE INSERT POSITION 0

AS

begin

IF (NEW.MACHINETYPE_CODE IS NULL) THEN

NEW.MACHINETYPE_CODE=GEN_ID(GEN_MACHINE_TYPE_ID,1);

end

4. Таблица MACHINE

Код станка

Код типа станка

Количество ремонтов

CREATE TABLE MACHINE (

MACHINETYPE_CODE Integer NOT NULL,

MACHINE_REPNUM Integer,

MACHINE_CODE Varchar(10) NOT NULL,

PRIMARY KEY (MACHINE_CODE)

);

ALTER TABLE MACHINE ADD FOREIGN KEY (MACHINETYPE_CODE) REFERENCES MACHINE_TYPE(MACHINETYPE_CODE);

CREATE INDEX XIF1MACHINE ON MACHINE(MACHINETYPE_CODE);

CREATE UNIQUE INDEX XPKMACHINE ON MACHINE(MACHINE_CODE);

5. Таблица REPAIRTYPE

Код вида ремонта

Название

Длительность

Стоимость

Примечания

CREATE TABLE REPAIRTYPE (

REPAIRTYPE_NAME Varchar(20),

REPAIRTYPE_CODE Integer NOT NULL,

REPAIRTYPE_DURATION Integer,

REPAIRTYPE_COST Decimal(10,2),

REPAIRTYPE_NOTE Varchar(100),

PRIMARY KEY (REPAIRTYPE_CODE)

);

CREATE UNIQUE INDEX XPKREPAIRTYPE ON REPAIRTYPE(REPAIRTYPE_CODE);

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

CREATE GENERATOR GEN_REPAIRTYPE_ID;

SET GENERATOR GEN_REPAIRTYPE_ID TO 7

CREATE OR ALTER TRIGGER TR_GEN_REPAIRTYPE_ID FOR REPAIRTYPE

ACTIVE BEFORE INSERT POSITION 0

AS

begin

IF (NEW.REPAIRTYPE_CODE IS NULL) THEN

NEW.REPAIRTYPE_CODE=GEN_ID(GEN_REPAIRTYPE_ID,1);

end

6. Таблица REPAIR

Код ремонта

Код станка

Дата начала

Выполнен?

Примечания

CREATE TABLE REPAIR (

REPAIRTYPE_CODE Integer NOT NULL,

MACHINE_CODE Varchar(10) NOT NULL,

REPAIR_STARTDATE Date DEFAULT CURRENT_DATE NOT NULL,

REPAIR_DONE Char(1) DEFAULT 'N' NOT NULL,

REPAIR_NOTE Varchar(100),

CONSTRAINT PK_REPAIR PRIMARY KEY (MACHINE_CODE,REPAIRTYPE_CODE,REPAIR_STARTDATE)

);

ALTER TABLE REPAIR ADD FOREIGN KEY (MACHINE_CODE) REFERENCES MACHINE(MACHINE_CODE);

ALTER TABLE REPAIR ADD FOREIGN KEY (REPAIRTYPE_CODE) REFERENCES REPAIRTYPE(REPAIRTYPE_CODE);

CREATE INDEX XIF2REPAIR ON REPAIR(REPAIRTYPE_CODE);

CREATE INDEX XIF3REPAIR ON REPAIR(MACHINE_CODE);

CREATE UNIQUE INDEX XPKREPAIR ON REPAIR(REPAIRTYPE_CODE,MACHINE_CODE,REPAIR_STARTDATE);

По условиям задачи данные, содержащиеся в этой таблице, используются в таблице MACHINE, описывающей характеристики станков. От количества ремонтов некоторого станка, зарегистрированных в таблице REPAIRS (иными словами, от количества записей с конкретным значением MACHINE_CODE и полем REPAIR_DONE со значением 'Y'), зависит значение поля MACHINE_REPNUM (то есть, собственно, количество ремонтов) соответствующей записи в MACHINE. Поэтому нам необходимо создать механизм, который обеспечивал бы соответствие информации из MACHINE данным в REPAIR. Для этих целей были написаны следующие триггеры:

На вставку записи в таблицу REPAIR:

CREATE OR ALTER TRIGGER TR_REPAIR_AI FOR REPAIR

ACTIVE BEFORE INSERT POSITION 0

AS

begin

if (new.REPAIR_DONE = 'Y')

then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM+1

where MACHINE_CODE = new.MACHINE_CODE;

end

end

При вставке в таблицу новой записи триггер проверяет, если поле REPAIR_DONE равно 'Y' (то есть, если ремонт станка считается завершенным). Когда данное условие выполняется, триггер ищет в таблице MACHINE запись с таким же MACHINE_CODE, как во вносимой записи, и прибавляет 1 к счетчику ремонтов этой записи.

Аналогично работает триггер на удаление записи из REPAIRS, с той лишь разницей, что при удалении строки с параметром REPAIR_DONE='Y' счетчик ремонтов уменьшается на 1:

CREATE OR ALTER TRIGGER TR_REPAIR_AD FOR REPAIR

ACTIVE AFTER DELETE POSITION 0

AS

begin

if (old.REPAIR_DONE = 'Y')

then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM-1

where MACHINE_CODE = old.MACHINE_CODE;

end

end

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

CREATE OR ALTER TRIGGER TR_REPAIR_AU FOR REPAIR

ACTIVE BEFORE UPDATE POSITION 0

AS

begin

if (new.MACHINE_CODE = old.MACHINE_CODE) then begin

if ((new.REPAIR_DONE = 'Y') and (old.REPAIR_DONE = 'N')) then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM+1

where MACHINE_CODE = new.MACHINE_CODE;

end else if ((new.REPAIR_DONE = 'N') and (old.REPAIR_DONE = 'Y')) then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM-1

where MACHINE_CODE = new.MACHINE_CODE;

end

end else if (new.MACHINE_CODE <> old.MACHINE_CODE) then begin

if (old.REPAIR_DONE = 'Y') then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM-1

where MACHINE_CODE = old.MACHINE_CODE;

end

if (new.REPAIR_DONE = 'Y') then begin

update MACHINE

set MACHINE_REPNUM = MACHINE_REPNUM+1

where MACHINE_CODE = new.MACHINE_CODE;

end

end

end

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

7. Таблица MONTHS

Код месяца

Название месяца

CREATE TABLE MONTHS (

MONTH_NAME Varchar(10),

MONTH_CODE Integer NOT NULL,

PRIMARY KEY (MONTH_CODE)

);

3. Клиент для работы с БД

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

Поскольку в C# по умолчанию нет драйверов для работы с базами данных, созданными в InterBase/Firebird, мне понадобилось скачать сторонний драйвер, который открывает возможности взаимодействия с БД Firebird в приложениях, созданных на C#/C++.

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

Меню соединения с базой данных

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

Рис. 5

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

public partial class Login : Form {

// путь к БД, имя пользователя, пароль

public String Path;

public String User;

public String Password;

// результат вызова окна

public DialogResult Result;

/*

...

*/

// отображение окна

// значения, введенные пользователем, записываются в переменные

// path, user, pass

public static DialogResult Show(out string path,

out string user,

out string pass) {

Login login = new Login();

login.ShowDialog();

DialogResult val = login.Result;

path = login.Path;

user = login.User;

pass = login.Password;

login.Dispose();

return val;

}

}

Сам этот класс не производит соединения с БД, он только передает главному окну параметры, указанные пользователем для установки соединения, и возвращает значение DialogResult, которое определяет, какая кнопка на форме была нажата, «OK» или «Отмена».

4. Главное меню приложения

По завершению работы окна соединения с БД на экране появляется основное окно, содержащее главное меню проекта:

Рис. 6

Главное окно разбито на две части. Слева находится меню в виде иерархического списка, через которое осуществляется доступ ко всем возможностям приложения. В правой части расположена рабочая область, в которой отображаются компоненты, соответствующие выбранному пункту меню. Фактически рабочая область сформирована из TabControl'а со множеством вкладок, в котором каждой строчке меню поставлена в соответствие своя вкладка. При выборе какого-то пункта из меню вызывается обработчик соответствующего события, открывающий нужную вкладку:

/* выбор страницы */

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) {

if (e.Node.Parent != null) {

//выбран просмотр таблиц

if ((e.Node.Parent.Text == "Просмотр баз данных") &&

(e.Node.Index >= 0) && (e.Node.Index < 6)) {

tpages.SelectedIndex = 0;

//загрузка соответствующей таблицы

if (e.Node.Text == "Страны") {

tpages.SelectedIndex = 0;

adCurrent = adCountry;

bsCurrent = bsCountries;

} else if (e.Node.Text == "Марки") {

tpages.SelectedIndex = 1;

adCurrent = adMark;

bsCurrent = bsMarks;

} else if (e.Node.Text == "Станки") {

//... и т.д.

}

Содержание меню проекта:

1. Просмотр базы данных

a. Страны

b. Марки

c. Типы станков

d. Станки

e. Типы ремонтов

f. Ремонты

2. Регистрация ремонтов

3. План на текущий месяц

4. Просроченные ремонты

5. Анализ видов ремонтов

a. По срокам

b. По дате окончания

c. По стоимости

6. Поиск ремонтов

a. По виду

b. По марке

c. За период

d. За год

e. За все время

7. Отчеты

a. За месяц

b. За год

Рассмотрим каждый пункт меню по отдельности.

5. Просмотр базы данных

В данном меню предоставляется возможность просматривать и редактировать все основные таблицы базы данных (кроме MONTHS, поскольку это внутренняя «служебная» таблица).

Рис. 7

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

/* инициализация приложения - загрузка основных компонентов */

private void Viewer_Load(object sender, EventArgs e) {

if (Login.Show(out path, out user, out password) == DialogResult.OK) {

try {

// созание соединения

con = new OleDbConnection("Provider=LCPI.IBProvider;" +

"data source=localhost:" + path + ";" +

"ctype=win1251;" + "user id=" + user +

";password=" + password);

con.Open();

isOpen = true;

// начало транзакции

trans = con.BeginTransaction();

// загрузка таблиц

// marks

LoadTable("mark", out adMark, out cbMark, out dtMark);

bsMarks.DataSource = dtMark;

// countries

LoadTable("country", out adCountry,

out cbCountry,

out dtCountry);

bsCountries.DataSource = dtCountry;

/*

... и т.д. для всех таблиц

*/

} catch (OleDbException myOLEDBException) {

/*

... обработка исключений

*/

} catch (Exception myException) {

// прочие исключения

Console.WriteLine("----------------------------------------");

Console.WriteLine(myException.Message);

MessageBox.Show(myException.Message, "Ошибка",

MessageBoxButtons.OK, MessageBoxIcon.Error);

}

//загрузка формы регистрации ремонтов

registration_load();

/*

... загрузка прочих форм

*/

} else {

MessageBox.Show("Отмена соединения с БД.\nВыход из приложения",

"Выход");

this.Close();

}

}

Каждая таблица представлена в приложении совокупностью компонентов. Это:

1. DataTable, которая хранит непосредственно данные, загруженные из базы данных

2. OleDbDataAdapter - объект, который производит загрузку данных в DataTable с помощью заданной нами команды OleDbCommand, содержащей SQL-запрос select.

3. OleDbCommandBuilder - автоматический конструктор SQL-запросов. Он необходим для создания запросов на вставку, обновление и удаление строк из таблиц.

4. BindingSource и BindingNavigator - компоненты, необходимые для «перемещения» по таблице DataTable курсора и записи изменений, которые пользователь делает в таблице. BindingNavigator - визуальный компонент, расположенный над таблицей в окне просмотра.

При загрузке БД происходит обращение к функции LoadTable. Данная функция загружает каждую указанную по имени таблицу в нужные нам компоненты:

/* инициализация приложения - загрузка таблицы

* table_name - имя таблицы из БД

* adapter - соответствующий таблице адаптер

* builder - соответствующий таблице конструктор команд

* table - соответствующая таблице DataTable */

private void LoadTable(string table_name,

out OleDbDataAdapter adapter,

out OleDbCommandBuilder builder,

out DataTable table) {

cmd = new OleDbCommand("select * from " + table_name, con, trans);

table = new DataTable(table_name);

adapter = new OleDbDataAdapter(cmd);

builder = new OleDbCommandBuilder(adapter);

adapter.SelectCommand = cmd;

adapter.InsertCommand = builder.GetInsertCommand();

adapter.UpdateCommand = builder.GetUpdateCommand();

adapter.DeleteCommand = builder.GetDeleteCommand();

adapter.Fill(table);

}

В таблицах, доступных из меню просмотра, можно добавлять, удалять и редактировать строки. Для записи изменений, сделанных с таблицами необходимо нажать кнопку «OK» на управляющей панели BindingNavigator. При этом происходит вызов метода:

/* сохранение результатов в текущей таблице */

private void tsView_Save_Click(object sender, EventArgs e) {

adCurrent.Update((DataTable)bsCurrent.DataSource);

((DataTable)bsCurrent.DataSource).Clear();

adCurrent.Fill((DataTable)bsCurrent.DataSource);

}

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

6. Регистрация ремонтов

Форма регистрации ремонтов создана для более удобного редактирования существующих и добавления новых записей в таблицу ремонтов. Она предоставляет более наглядный способ заполнения полей в записях. Внешний вид формы:

Рис. 8

Как видно по скриншоту, данное окно позволяет задать все поля для новой строки в таблице REPAIR. При этом выбор станка и типа ремонта производится из ниспадающих списков, которые берут свои данные из таблиц MACHINE и REPAIRTYPE соответственно. Для инициализации компонентов формы при загрузке приложения вызывается метод registration_load():

/* загрузка страницы регистрации ремонтов */

private void registration_load() {

bsRepairs.DataSource = dtRepair;

//связь ComboBox'ов с нужными полями в таблицах

comboRegMachine.DataSource = dtMachine;

comboRegMachine.DisplayMember = "MACHINE_CODE";

comboRegRepairType.DataSource = dtRepairType;

comboRegRepairType.DisplayMember = "REPAIRTYPE_NAME";

//установка текущих значений

repairs_current_changed();

}

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

/* регистрация ремонтов - обновление всех полей формы */

private void repairs_current_changed() {

//выбранная в навигаторе строка

DataRowView cur_drw = (DataRowView)bsRepairs.Current;

DataRow drow = cur_drw.Row;

string machine_code = drow.Field<string>("MACHINE_CODE");

set_machine_combo_to(machine_code);

int repairtype_code = drow.Field<int>("REPAIRTYPE_CODE");

set_repairtype_combo_to(repairtype_code);

DateTime date = drow.Field<DateTime>("REPAIR_STARTDATE");

set_date_field_to(date);

string note = drow.Field<string>("REPAIR_NOTE");

set_note_field_to(note);

string done = drow.Field<string>("REPAIR_DONE");

set_done_field_to(done);

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

reg_repair_changed = false;

reg_new = -1;

}

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

При нажатии на кнопку «OK» формы сначала производится проверка, какое действие совершил пользователь - модификацию записи или добавление новой записи. В зависимости от этого выбираются дальнейшие действия. Если была осуществлена модификация, то происходит простое обновление данных в БД. Если вставка записи, то формируется insert-запрос на добавление новой строки с параметрами, выбранными пользователем в компонентах формы:

Код SQL-запроса:

insert into repair(MACHINE_CODE,

REPAIRTYPE_CODE,

REPAIR_STARTDATE,

REPAIR_NOTE,

REPAIR_DONE)

values (:machine_code,

:reptype_code,

:startdate,

:note,

:done)

Реализация в приложении:

private void tsRepair_OK_Click(object sender, EventArgs e) {

//если была вставка новой строки

if (reg_new != -1) {

//извлечение кода станка

DataRowView machine_rowview =

(DataRowView)comboRegMachine.SelectedItem;

DataRow machine_row = machine_rowview.Row;

string machine_code = machine_row.Field<string>("MACHINE_CODE");

//извлечение кода ремонта

DataRowView reptype_rowview =

(DataRowView)comboRegRepairType.SelectedItem;

DataRow reptype_row = reptype_rowview.Row;

int reptype_code = reptype_row.Field<int>("REPAIRTYPE_CODE");

/*

... и т.д для всех полей

*/

//запись результатов в БД

OleDbCommand cmd = new OleDbCommand("<код запроса>", con, trans);

cmd.Parameters.AddWithValue("machine_code", machine_code);

cmd.Parameters.AddWithValue("reptype_code", reptype_code.ToString());

cmd.Parameters.AddWithValue("startdate", dt.ToShortDateString());

cmd.Parameters.AddWithValue("note", note);

cmd.Parameters.AddWithValue("done", done);

cmd.ExecuteNonQuery();

}

adRepair.Update((DataTable)bsRepairs.DataSource);

dtRepair.Clear();

adRepair.Fill(dtRepair);

bsRepairs.MoveLast();

dtMachine.Clear();

adMachine.Fill(dtMachine);

reg_repair_changed = false;

reg_new = -1;

}

Для удобства чтения исходного кода здесь и в дальнейшем текст запроса во вставках будет заменяться строкой <текст запроса>.

Если данные в строке были изменены, но пользователь не нажал «OK», показывается диалоговое окно, в котором он должен выбрать, сохранить сделанные изменения или нет:

Рис. 9

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

7. План на текущий месяц

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

Рис. 10

Таблица формируется с помощью следующего SQL-запроса.

select r.MACHINE_CODE as MACHINE_CODE,

rt.REPAIRTYPE_NAME as REPAIR_NAME,

r.REPAIR_STARTDATE as STARTDATE,

r.REPAIR_STARTDATE + rt.REPAIRTYPE_DURATION as ENDDATE

from REPAIR r

inner join REPAIRTYPE rt

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

inner join

(select current_date as DT from rdb$database) as curdate

on extract(MONTH from (r.REPAIR_STARTDATE + rt.REPAIRTYPE_DURATION))

= extract(MONTH from curdate.DT)

and extract(YEAR from (r.REPAIR_STARTDATE + rt.REPAIRTYPE_DURATION))

= extract(YEAR from curdate.DT)

where r.REPAIR_DONE = 'N'

Таким образом, запрос возвращает все ремонты из БД, которые еще не закончены (r.REPAIR_DONE = 'N'), и в дате окончания которых указан текущий месяц. Дата окончания определяется как сумма даты начала ремонта и длительности заданного вида ремонта. Данные заносятся в таблицу при загрузке приложения через вызов специального метода month_plan_load():

/* загрузка страницы с планом ремонтов */

private void month_plan_load() {

txtMonthPlanToday.Text = DateTime.Today.ToLongDateString();

OleDbCommand cmd = new OleDbCommand("<текст запроса>", con, trans);

OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

dtMonthPlan.Clear();

adapter.Fill(dtMonthPlan);

dgMonthPlan.DataSource = dtMonthPlan;

adapter.Dispose();

cmd.Dispose();

}

8. Просроченные ремонты

Пункт меню «Просроченные ремонты» показывает те ремонты, которые еще не выполнены, но уже должны были быть закончены. Внешний вид формы:

Форма аналогична предыдущей, за исключением того, что была добавлена кнопка «Обновить», по которой запрос вызывается повторно, учитывая новые данные, добавленные в REPAIR, или другие изменения, произошедшие с момента последнего обновления.

Рис. 11

Запрос, возвращающий необходимые данные:

select r.MACHINE_CODE as MACHINE_CODE,

rt.REPAIRTYPE_NAME as REPAIR_TYPE,

r.REPAIR_STARTDATE as STARTDATE,

r.REPAIR_STARTDATE + rt.REPAIRTYPE_DURATION as ENDDATE,

cur_date.DT-(r.REPAIR_STARTDATE+rt.REPAIRTYPE_DURATION) as OVERDUE

from (select current_date as DT from rdb$database) as cur_date,

REPAIR r

inner join REPAIRTYPE rt

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

where r.REPAIR_DONE = 'N'

and cur_date.DT > r.REPAIR_STARTDATE + rt.REPAIRTYPE_DURATION

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

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

9. Анализ видов ремонта

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

10. По срокам

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

Рис. 12

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

Код SQL-запроса:

select rt.REPAIRTYPE_CODE,

rt.REPAIRTYPE_NAME,

rt.REPAIRTYPE_DURATION,

rt.REPAIRTYPE_COST,

rt.REPAIRTYPE_NOTE

from REPAIRTYPE rt

where rt.REPAIRTYPE_DURATION < :dur

Реализация в приложении:

/* виды ремонтов по длительности */

private void btnRepairTypeDurationOK_Click(object sender, EventArgs e) {

string dur = txtRepairTypeDuration.Text;

int d = 0;

try {

d = int.Parse(dur);

} catch (Exception ex) {

MessageBox.Show(ex.Message, "Ошибка");

return;

}

if (d < 1) {

MessageBox.Show("Задана длительность меньше одного дня", "Ошибка");

return;

}

OleDbCommand cmd = new OleDbCommand("<текст запоса>", con, trans);

cmd.Parameters.AddWithValue("dur", dur);

OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

dtRepairTypeDuration.Clear();

adapter.Fill(dtRepairTypeDuration);

dgRepairTypeDuration.DataSource = dtRepairTypeDuration;

adapter.Dispose();

cmd.Dispose();

}

Результат работы запроса (с заданной длительностью, например, 50 дней):

Рис. 13

11. По дате окончания

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

SQL-запрос, решающий данную задачу:

select rt.REPAIRTYPE_CODE,

rt.REPAIRTYPE_NAME,

rt.REPAIRTYPE_DURATION,

rt.REPAIRTYPE_COST,

rt.REPAIRTYPE_NOTE

from REPAIRTYPE rt

where current_date + rt.REPAIRTYPE_DURATION >= :startdate

and current_date + rt.REPAIRTYPE_DURATION <= :enddate

Запрос возвращает все виды ремонтов, дата окончания которых укладывается в интервал между :startdate и :enddate. Эти параметры задаются через компоненты формы. Внешний вид формы с примером выполнения запроса:

Рис. 14

Реализация в приложении:

/* типы ремонта по возможной дате окончания */

private void btnRepairTypesDateOK_Click(object sender, EventArgs e) {

string start = txtRepairTypesDateStart.Text;

string end = txtRepairTypesDateEnd.Text;

// проверка введенной даты

try {

DateTime dstart = DateTime.Parse(start);

DateTime dend = DateTime.Parse(end);

} catch (Exception ex) {

MessageBox.Show(ex.Message, "Ошибка");

return;

}

// запрос

OleDbCommand cmd = new OleDbCommand("<текст запроса>", con, trans);

cmd.Parameters.AddWithValue("startdate", start);

cmd.Parameters.AddWithValue("enddate", end);

OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

dtRepairTypeDate.Clear();

adapter.Fill(dtRepairTypeDate);

dgRepairTypeDate.DataSource = dtRepairTypeDate;

adapter.Dispose();

cmd.Dispose();

}

12. По стоимости

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

Рис. 15

Как видно по рисунку, параметры запроса берутся из текстовых полей «От» и «До». Выполнение запроса происходит при нажатии на кнопку «ОК».

Код запроса:

select REPAIRTYPE_CODE,

REPAIRTYPE_NAME,

REPAIRTYPE_DURATION,

REPAIRTYPE_COST,

REPAIRTYPE_NOTE

from REPAIRTYPE

where REPAIRTYPE_COST >= :lower and REPAIRTYPE_COST <= :upper

Реализация в приложении:

/* типы ремонта - в интервале стоимости */

private void btnRepairTypeCostOK_Click(object sender, EventArgs e) {

// проверка допустимых значений

float lower = 0, upper = 0;

try {

lower = float.Parse(txtRepairTypeCostFrom.Text);

upper = float.Parse(txtRepairTypeCostTo.Text);

} catch (Exception ex) {

MessageBox.Show("Неверный числовой формат", "Ошибка преобразования");

return;

}

if ((lower < 0) || (upper < lower)) {

MessageBox.Show("Неверный интервал стоимости", "Ошибка");

return;

}

/*

... запрос, вставка результата в таблицу. см. реализацию предыдущих

пунктов

*/

}

13. Поиск ремонтов

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

14. По виду

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

Рис. 16

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

Запрос на поиск ремонтов:

select r.REPAIR_STARTDATE,

r.MACHINE_CODE,

rt.REPAIRTYPE_NAME,

rt.REPAIRTYPE_COST,

r.REPAIR_DONE,

r.REPAIR_NOTE

from REPAIR r

inner join REPAIRTYPE rt

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

where rt.REPAIRTYPE_CODE = :rt_code

order by REPAIR_STARTDATE asc

Запрос выбирает из REPAIR все ремонты, код вида ремонта которых равен заданному пользователем (параметр :rt_code определяется через выбранный элемент выпадающего списка). Второй запрос аналогичен этому, но вместо выборки всех ремонтов, удовлетворяющих условию, он вычисляет их общую стоимость:

select

case

when (sum(rt.REPAIRTYPE_COST) is null)

then 0

else

sum(rt.REPAIRTYPE_COST)

end as S

from REPAIR r

inner join REPAIRTYPE rt

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

where rt.REPAIRTYPE_CODE = :rt_code

Для того, чтобы результат мог корректно отобразиться в текстовом поле, значение null, возвращаемое запросом, заменяется на 0.

Реализация в приложении:

/* просмотр ремонтов по виду */

private void btnRepairTypeOK_Click(object sender, EventArgs e) {

// извлечение выбранного типа из comboBox'а

DataRowView drw_type = (DataRowView)comboRepairType.SelectedItem;

DataRow dr_type = drw_type.Row;

int repairtype_code = dr_type.Field<int>("REPAIRTYPE_CODE");

// запрос и заполнение таблицы

OleDbCommand cmd = new OleDbCommand("<текст запроса 1>", con, trans);

cmd.Parameters.AddWithValue("rt_code", repairtype_code.ToString());

OleDbDataAdapter ad = new OleDbDataAdapter(cmd);

dtRepairTypeQ.Clear();

ad.Fill(dtRepairTypeQ);

dgRepairType.DataSource = dtRepairTypeQ;

ad.Dispose();

cmd.Dispose();

// запрос на вычисление суммы

cmd = new OleDbCommand("<текст запроса 2>", con, trans);

cmd.Parameters.AddWithValue("rt_code", repairtype_code.ToString());

ad = new OleDbDataAdapter(cmd);

dtRepairTypeQSum.Clear();

ad.Fill(dtRepairTypeQSum);

txtRepairTypeSum.Text

= ((decimal)dtRepairTypeQSum.Rows[0]["S"]).ToString();

cmd.Dispose();

ad.Dispose();

}

Пример работы запроса:

Рис. 17

15. По марке

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

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

Рис. 18

Запрос на выбор ремонтов по марке станка:

select r.MACHINE_CODE,

rt.REPAIRTYPE_NAME,

rt.REPAIRTYPE_COST,

r.REPAIR_STARTDATE,

r.REPAIR_DONE,

r.REPAIR_NOTE

from REPAIR r

inner join REPAIRTYPE rt

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

inner join MACHINE m

on r.MACHINE_CODE = m.MACHINE_CODE

inner join MACHINE_TYPE mt

on m.MACHINETYPE_CODE = mt.MACHINETYPE_CODE

inner join MARK mk

on mt.MARK_CODE = mk.MARK_CODE

where mk.MARK_CODE = :mark_code

Запрос на вычисление общей стоимости:

select

case

when (sum(rt.REPAIRTYPE_COST) is null)

then 0

else

sum(rt.REPAIRTYPE_COST)

end as S

from REPAIR r

inner join REPAIRTYPE rt on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

inner join MACHINE m on r.MACHINE_CODE = m.MACHINE_CODE

inner join MACHINE_TYPE mt on m.MACHINETYPE_CODE = mt.MACHINETYPE_CODE

inner join MARK mk on mt.MARK_CODE = mk.MARK_CODE

where mk.MARK_CODE = 5

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

16. За период

Данная форма позволяет просмотреть ремонты, зарегистрированные в БД за какой-то период времени.

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

SQL-запрос, возвращающий нужные данные:

select r.repair_startdate,

r.machine_code,

rt.repairtype_name,

rt.repairtype_cost,

r.repair_note

from repair r

inner join repairtype rt on r.repairtype_code = rt.repairtype_code

where r.repair_startdate >= :start

and r.repair_startdate <= :end

and r.repair_done like :done

order by r.repair_startdate

Рис. 19

Реализация в приложении почти ничем не отличается от предыдущих двух пунктов, разница только в текстах запросов, передаваемых объектам OleDbCommand.

17. За год

Через данный пункт меню вызывается форма, на которой можно увидеть график регистрации ремонтов за год. Внешний вид:

Рис. 20

Пользователь может задать год, за который он хочет получить график. При нажатии на кнопку «ОК» происходит выполнение нужного запроса и создание на его основе графика регистрации ремонтов. Код запроса:

select m.month_code as MONTH_CODE,

rt.repairtype_name as REPAIRTYPE_NAME,

count(r.machine_code) as REPAIRS

from MONTHS m

left join REPAIR r

on extract(month from r.repair_startdate) = m.month_code

inner join repairtype rt

on r.repairtype_code = rt.repairtype_code

where r.repair_startdate >= :start

and r.repair_startdate <= :end

group by m.month_code, rt.repairtype_name

Функция реализации данного меню в приложении слишком большая, чтобы приводить ее целиком. По структуре ее можно разбить на две части. Первая часть типична и похожа на приведенные выше фрагменты кода, в ней осуществляется выполнение запроса и запись его результатов в объект DataTable. Во второй части происходит обращение к функциям приложения Microsoft Excel через COM-библиотеку Microsoft Excel Object Library 12.0. Наше приложение экспортирует данные из DataTable в таблицу Excel, и строит по ним график, который потом преобразуется в картинку формата BMP и вставляется в объект PictureBox на форме. Все это проделывается в фоновом режиме, так что пользователь видит только конечный результат.

Выше на картинке показан пример работы данной функции.

18. За все время

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

Форма выглядит следующим образом:

Рис. 21

SQL-запрос, вычисляющий необходимые данные:

select rt.REPAIRTYPE_NAME,

case when c.NUM is not null then c.NUM else 0 end

from REPAIRTYPE rt

left join

(select rt.REPAIRTYPE_NAME as REPAIRTYPE_NAME, count(*) as NUM

from REPAIRTYPE rt

inner join REPAIR r

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

group by rt.REPAIRTYPE_NAME) as c

on rt.REPAIRTYPE_NAME = c.REPAIRTYPE_NAME

Реализация данной функции похожа на предыдущий пункт. После выполнения запроса так же происходит обращение к функциям Excel и экспорт графика из Excel в PictureBox на форме.

19. Отчеты

В данном меню пользователю предлагается создать электронный документ с отчетом о ремонтах, выполненных за год, либо за месяц. Отчет пишется приложением в формате Word 2007, с использованием COM-компонентов Microsoft Word Object Library 12.0.

20. За месяц

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

Рис. 22

Пример отчета:

Рис. 23

Данные для составления отчета получаются с помощью следующего SQL-запроса:

select rt.REPAIRTYPE_NAME, r.MACHINE_CODE, r.REPAIR_STARTDATE,

rt.REPAIRTYPE_COST

from REPAIRTYPE rt

inner join REPAIR r

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

where r.REPAIR_DONE = 'Y' and

(case CHAR_LENGTH(extract(month from r.REPAIR_STARTDATE)) when 1

then '0' || extract(month from r.REPAIR_STARTDATE) || '.' ||

extract (year from r.REPAIR_STARTDATE)

else

extract(month from r.REPAIR_STARTDATE) || '.' ||

extract (year from r.REPAIR_STARTDATE)

end) = :mm

21. За год

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

Рис. 24

SQL-запрос, реализующий данную функцию:

select r.REPAIR_STARTDATE, r.MACHINE_CODE, rt.REPAIRTYPE_COST

from REPAIRTYPE rt

inner join REPAIR r

on r.REPAIRTYPE_CODE = rt.REPAIRTYPE_CODE

where r.REPAIR_DONE = 'Y' and

extract(year from r.REPAIR_STARTDATE) = :year

Вид отчета аналогичен предыдущему.

Заключение

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

1. Исходные таблицы:

a. Страны

b. Марки

c. Типы станков

d. Станки

e. Типы ремонтов

f. Ремонты

g. Месяцы

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

3. Приложение для работы с БД, состоящее из двух форм:

a. Форма соединения с базой данных

b. Главная форма, содержащая основное меню и компоненты, реализующие все пункты данного меню

4. Запросы:

a. Поиск запланированных на текущий месяц ремонтов

b. Поиск просроченных ремонтов

c. Выбор видов ремонта по срокам

d. Выбор видов ремонта по возможной дате окончание

e. Выбор видов ремонта по стоимости

f. Поиск ремонтов по марке ремонтируемого станка

g. Общая стоимость ремонтов, выбранных по марке

h. Поиск ремонтов по виду ремонта

i. Общая стоимость ремонтов, выбранных по виду

j. Поиск ремонтов по дате регистрации

k. Анализ ремонтов за год

l. Анализ всех ремонтов в БД

5. Отчеты

a. За месяц

b. За год

c. Прайс-лист с видами выполняемых предприятием ремонтов

Приложение разработано в среде Microsoft Visual Studio 2005 на языке C# и предназначено для ведения учета и анализа деятельности предприятия. Приложение позволяет:

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

· Вести учет количества ремонтов конкретных станков.

· Получать данные о текущих ремонтах, ожидающих выполнения и о ремонтах, не законченных в срок.

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

· Проводить поиск зарегистрированных в системе ремонтов по различным параметрам

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

· Получать итоговый отчет по ремонтам, выполненным за год или месяц.

· Получать отчет о видах ремонтов, выполняемых предприятием

В ходе реализации проекта были изучены приемы конструирования баз данных в Firebird, написания триггеров для функционирования БД и SQL-запросов на выбор/модификацию данных в таблицах. Была освоена методика разработки клиентских приложений для работы с базами данных на языке C# с использованием технологии ADO.NET. Кроме того были изучены возможности интеграции в приложение отдельных функций Microsoft Office с помощью COM-интерфейсов, в частности способы экспорта данных в документы Word и электронные таблицы Excel.

Источники

1. Карпова Т.С. «Базы данных: модели, разработка, реализация: Учебник для вузов» - СПб.: Питер, 2002 - 304 стр.

2. Лабор В.В. «Си Шарп: Создание приложений для Windows» - Мн.: Харвест, 2003 - 384 стр.

3. Jesse Liberty «Programming C#» - O'Reily, 2001 - 680 стр.

4. Документация по IBProvider, Firebird и Interbase SQL Server,

Размещено на Allbest.ru

...

Подобные документы

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

    контрольная работа [648,7 K], добавлен 13.04.2012

  • Построение инфологической концептуальной модели предметной области. Структура базы данных Microsoft Office Access. Формы, запросы и отчеты. Создание форм, запросов и отчетов в базах данных. Схема данных физической и логической сущности в Erwin 4.0.

    курсовая работа [5,1 M], добавлен 13.12.2011

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

    контрольная работа [682,4 K], добавлен 08.05.2015

  • Рассмотрение теоретических основ проектирования. Анализ предметной области и разработка таблиц базы данных. Заполнение таблиц, поиск данных с помощью фильтра. Создание форм, разработка запросов. Создание и настройка отчетов, составление приложения.

    курсовая работа [2,8 M], добавлен 01.06.2014

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

    курсовая работа [681,4 K], добавлен 16.01.2015

  • Создание базы данных по теме "Склад фруктов" в СУБД Microsoft Access. Проектирование запросов по числовым, символьным, логическим критериям и сложных запросов, состоящих из комбинаций приведенных типов данных. Создание форм и таблиц, конструктор отчетов.

    курсовая работа [869,2 K], добавлен 04.11.2014

  • Методы проектирования базы данных по заданной предметной области с использованием CASE-средств ER/Studio и СУБД MS Access. Формирование и связывание таблиц, ввод данных. Создание экранных форм, запросов, отчетов, меню приложения. Генерация приложения.

    курсовая работа [884,0 K], добавлен 08.09.2010

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

    курсовая работа [2,1 M], добавлен 17.06.2013

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

    курсовая работа [1,6 M], добавлен 29.10.2011

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

    курсовая работа [981,4 K], добавлен 05.11.2011

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

    курсовая работа [1,6 M], добавлен 17.06.2013

  • Разработка базы данных для автоматизации учета и хранения сведений о заявках от работодателей. Проектирование приложения в СУБД Access. Описание запросов, отчетов и представлений данных. Интерфейс, условия выполнения и тестирование программного продукта.

    курсовая работа [3,7 M], добавлен 05.04.2012

  • Выделение информационных объектов и их инфологическая модель. Логическая структура реляционной базы данных. Разработка таблиц в системе управления базами данных Access. Создание запросов, форм и отчетов в СУБД Access. Разработка приложения пользователя.

    курсовая работа [2,8 M], добавлен 05.02.2018

  • Построение концептуальной модели. Создание таблиц, входящих в состав базы данных. Разработка основных запросов, отчетов о количестве учеников в данном классе и работе школы; форм для просмотра и редактирования данных в программе Microsoft Access.

    курсовая работа [2,7 M], добавлен 08.05.2015

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

    курсовая работа [4,7 M], добавлен 29.11.2015

  • Построение информационно-логической модели базы данных. Корректировка данных средствами запросов. Проектирование алгоритмов обработки данных. Реализация пользовательского интерфейса средствами форм. Разработка запросов для корректировки и выборки данных.

    курсовая работа [680,9 K], добавлен 19.10.2010

  • Построение концептуальной модели базы данных. Физическое проектирование программы для автоматизации работы пользователя в Microsoft Access. Разработка системы запросов информации на основе таблиц и получения необходимых отчетов в требуемых формах.

    курсовая работа [2,9 M], добавлен 08.05.2015

  • Проектирование базы данных в среде СУБД MS Access. Автоматизация учета информации о товаре в магазине. Определение требований и функций системы. Анализ предметной области. Разработка, создание таблиц, запросов, форм и отчетов. Инструкция для пользователя.

    отчет по практике [523,6 K], добавлен 21.04.2014

  • Описание первичных и результатных документов, типа связи информационных объектов. Построение информационно-логической модели базы данных и её реализация в СУБД Access (создание таблиц, запросов, форм, отчётов). Разработка интерфейса пользователя.

    курсовая работа [2,1 M], добавлен 14.11.2013

  • Понятие реляционной модели данных, целостность ее сущности и ссылок. Основные этапы создания базы данных, связывание таблиц на схеме данных. Проектирование базы данных книжного каталога "Books" с помощью СУБД Microsoft Access и языка запросов SQL.

    курсовая работа [838,9 K], добавлен 25.11.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.