Разработка приложения "Склад строительных материалов"

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

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

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

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

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

Содержание

Введение

1. Цели автоматизации

1.1 Характеристика объекта автоматизации

1.2 Потенциал внедрения ИС

2. Техническое задание

2.1 Требования к системе

3. Архитектура приложения

3.1 Структура классов

3.2 Классы-провайдеры

3.3 Провайдер объектов

4. База данных

4.1 Средства проектирования

4.2 Перспективы расширения БД

4.3 Схема базы данных

4.4 Доступность элементов управления

Заключение

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

Введение

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

Задача курсовой работы - разработка приложения «Склад строительных материалов» в среде Visual Studio Express 2012 на языке C# с подключением к базе данных, разработанной в среде MS SQL.

«Склад строительных материалов» - это автоматизированное рабочее место (далее АРМ) работника строительной организации, ответственного за учет, выдачу и прием строительных материалов на территории склада. К приложению также могут иметь доступ другие работники предприятия из управляющего и инженерного состава.

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

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

автоматизация архитектура приложение

1. Цели автоматизации

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

· Предоставление работникам, принимающим решение, релевантных данных для принятия решения;

· Ускорение выполнения отдельных операций по сбору и обработке данных;

· Повышение оперативности управления

1.1 Характеристика объекта автоматизации

Работник склада - это лицо, ответственное за сохранность материалов на складе. Также в обязанности сотрудника входит:

· Прием материалов от поставщиков и материалов, возвращенных со строительных площадок предприятия;

· Выдача материалов в соответствии с ордером на отгрузку материала со склада;

· Списание материалов с истекшим сроком годности и утративших строительные качества;

· Учет количества материалов, находящихся на складе;

· Ведение приходно-расходной документации;

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

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

1.2 Потенциал внедрения ИС

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

· Учет материалов на складе;

· Ведение учета материалов, использованных при строительстве объектов;

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

· Учёт затрат на приобретение и доставку материалов;

· Хранение документации и предоставление отчетов сотрудникам компании.

2. Техническое задание

2.1 Требования к системе

Техническое задание составлялось на основании требований Заказчика, изложенных в устной форме: АРМ «Склад» должно обеспечивать оператору возможность быстрого получения данных о состоянии склада. Приложение должно предоставлять доступ к просмотру и редактированию данных в зависимости от роли пользователя в системе. Роль - совокупность связанных функций, выполняемых пользователем приложения. Доступ к приложению обеспечивается на основании введенных учетных данных. Права доступа назначаются администратором системы. Администратор системы - сотрудник компании, ответственный за функционирование ИС, настройку и обеспечение целостности данных.

Требования к системе в целом:

· Система должна предоставлять полноценный оконный интерфейс Windows-приложения;

· Система должна предоставлять широкие и гибкие возможности настройки и доработки под нужды предприятия;

· Система должна обеспечивать безопасность на уровне разграничения прав доступа пользователей по ролям и в соответствии с организационной структурой предприятия;

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

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

· Пользователи;

· Роли пользователей;

· Права доступа;

· Строительные материалы

А также позволять производить операции с данными таблицы «склад», обрабатывая и по возможности исключая ошибки пользовательского ввода.

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

Система должна позволять получать отчёты по шаблонам, утвержденным Управляющим компании.

Проектирование системы

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

UML-диаграмма классов

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

Рисунок 1

Необходимо построить UML-диаграмму классов, а затем отразить ее в объектно-ориентированном коде.

Отношение обобщение - это наследование. Наследование объектом членов другого класса представлено в явном виде в классе Storage Coursework. User Controls.Material. Это пользовательский элемент управления, унаследовавший свойства и методы класса System.Windows. Forms. User Control, позволяющий «визуализировать» объект класса Storage_Coursework. Objects. Material. Но наследование происходит в неявном виде. Объект Storage_Coursework. Objects. Material m передается в конструктор пользовательского элемента управления и становится одним из его членов. При построении элемента управления в методе Setup Controls() происходит присвоение значений свойствам визуальных элементов от свойств этого члена. В коде метода SetupControls() это выглядит так:

lbMaterialName.Text = material.MaterialName;

т.е. визуальный объект lbMaterialName получает новое значение свойства Text от родительского (хотя наследование не явное) класса material (свойство MaterialName).

Наследование можно представить в виде схемы (Рисунок 2):

Отношение ассоциация показывает отношения между объектами-экземплярами класса. Пример бинарной ассоциации можно рассмотреть в отношении классов User и Role пространства имен Storage_Coursework. Objects

Предоставление доступа к приложению осуществляется на основании совокупности прав, закреплённых за ролью. Каждый пользователь имеет только одну роль в приложении, а значит, имеет набор прав доступа, определённых этой ролью. Таким образом, между классами User и Role можно установить связь «один к одному» (Рисунок 3).

Рисунок 2

Рисунок 3

В свойстве User.UserRole получаем единственную роль пользователя так (Листинг 1):

public Role UserRole

{

get

{

return Storage_Coursework.Providers.

RoleProvider.GetUserRole(this.UserID);

}

Каждая роль содержит набор разрешений. Соответственно, связь между классами Role и RoleAccess будет «Один ко многим». Такое отношение называется N-арной ассоциацией (Рисунок 4).

Рисунок 4

Класс RoleAccess отвечает за права (разрешения), закреплённые за ролями. Например, ролям «администратор», «работник склада» и «прораб» дано разрешение на просмотр списка строительных материалов на складе. Кодовое название (AccessCode) этого разрешения StorageView. Проверку возможности просмотра списка материалов можно реализовать методом (Листинг 2):

public bool ExistAccess(string accessCode)

{

return Storage_Coursework.Providers.RoleProvider.

ExistAccess(this.RoleID, accessCode);

}

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

bool access = currentUser.UserRole.ExistAccess(“ShowAdminPanel”)

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

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

Рисунок 5

Отношения 1, 4 - бинарная ассоциация;

Отношение 2 - N-арная ассоциация;

Отношение 3 - обобщение.

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

3. Архитектура приложения

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

3.1 Структура классов

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

· UserID - идентификационный номер пользователя;

· UserName - имя пользователя (логин);

· UserPassword - пароль

При необходимости можно расширить данный класс полями: фамилия, имя, отчество, год рождения, дата трудоустройства, должность и пр. При этом необходимо создать поля с теми же названиями в соответствующей таблице базы данных. Это связано с использованием пространства имен System.Reflection (.NET Framework). Метод присвоения значений свойствам объектов с использованием System.Reflection рассмотрен в описании класса ObjectProvider.

Класс Role позволяет присваивать пользователю ту или иную роль при использовании приложения, определить его права на редактирование и просмотр данных. Каждому пользователю присваивается только одна роль. Список возможностей (данные таблицы RoleAccess) привязан к роли. Приложение разрешает или запрещает определенный функционал для текущего пользователя на основании того, имеет или нет роль этого пользователя разрешение с указанным AccessCode. Пример метода проверки права пользователя на совершение операции добавления материала на склад:
boolean user.

Класс Material имеет следующие свойства, позволяющие описать строительный материал, размещаемый на складе:

· MaterialID - идентификатор материала;

· MaterialName - название;

· MaterialMeasure - единица измерения

Для получения количества материала, находящегося на складе, служит свойство StorageCount.

Эти классы, находящиеся в пространстве имен Storage_Coursework.Objects наследуют свойства объектов (записей) БД соответствующих таблиц.

3.2 Классы-провайдеры

Классы, служащие для конвертирования набора полученных в результате запроса данных в понятные приложению и удобные для разработчика объекты представлены в пространстве имен Storage_Coursework.Providers. Эти классы позволяют передать «требование» разработчика, допустим, получить все имеющиеся на складе материалы GetMaterials() в виде готового запроса к БД - SELECT * FROM Material.

Таким образом, приложение поделено на несколько уровней. На нижнем уровне мы имеем класс для работы с базой данных Storage_Coursework.SqlDB, на промежуточном уровне - класс-провайдер, имеющий все необходимые разработчику методы получения готовых, понятных объектов на верхнем уровне и обеспечивающий запись изменений объектов на верхнем уровне в БД.

Каждому из ключевых классов (User, Role, Material) предназначен свой класс-провайдер.

3.3 Провайдер объектов

Класс Object Provider позволяет преобразовать строку данных из набора данных, полученных в результате запроса в экземпляр класса, описанного в приложении. Этот класс имеет всего один статический метод
GetObject.

Он принимает в качестве аргументов DataRow r - строка данных и Type objectType - тип возвращаемого объекта. После вызова этого метода, посредством System.Reflection осуществляется поиск конструктора в членах класса типа objectType. Затем создается объект этого класса и заполняются публичные свойства созданного экземпляра данными, содержащимися в исходной строке r. После чего метод возвращает полученный экземпляр.

Пример использования метода для получения объекта User на основании введенных логина и пароля представлен ниже (Листинг 3):

public static Storage_Coursework.Objects.User GetUser(string uName, string uPassword)

{

string query = String.Format("SELECT * FROM [User] WHERE UserName = '{0}' AND UserPassword = '{1}'", uName, uPassword);

var ds = OleDB.ExecuteQuery(query);

if (OleDB.DsIsNullOrEmpty(ds))

return null;

return (Storage_Coursework.Objects.User) ObjectProvider.GetObject (ds.Tables[0].Rows[0], typeof (Storage_Coursework.Objects.User));

}

Где ds - DataSet (набор данных), полученный в результате запроса. В его составе единственная таблица с единственной строкой данных (пользователь имеет уникальные логин и пароль).

SqlDB - статический класс выполняющий запрос к БД. Если потребуется использование другого поставщика данных, то необходимо будет лишь заменить этот класс другим с такими же методами Execute Query (string query) и Ds Is Null Or Empty (DataSet ds), а также изменить строку подключения в конструкторе класса.

4. База данных

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

4.1 Средства проектирования

База данных спроектирована в среде MS Sql Express 2012. Для работы приложения на компьютере пользователя должны быть запущены службы SQL Server.

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

4.2 Перспективы расширения БД

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

· Учет персонала, производящего операции в системе;

· Учет возвращенного материала с объекта на склад;

· Отслеживание сроков хранения материалов;

· Формирование средней стоимости всех материалов на складе;

· Возможность формирования списка ожидаемых материалов;

· Создание прорабом заказа на вывоз материала.

4.3 Схема базы данных

База данных состоит из шести таблиц:

· User;

· UserRole;

· Role;

· RoleAccess;

· Storage;

· Material

Схема представлена на рисунке 1.

Рисунок 6

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

4.4 Доступность элементов управления

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

Код программы

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace Storage_Coursework

{

public partial class FormLogon: Form

{

public FormLogon()

{

InitializeComponent();

}

public event EventHandler UserLogining;

private void btIn_Click(object sender, EventArgs e)

{

string uName = tbUserName.Text.Trim();

string uPassword = tbUserPassword.Text.Trim();

var user = Storage_Coursework.Providers.UserProvider.GetUser(uName, uPassword);

UserLogining(user, new EventArgs());

this.Close();

}

namespace Storage_Coursework

{

partial class FormLogon

{

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Windows Form Designer generated code

private void InitializeComponent()

{

this.gbLogon = new System.Windows.Forms.GroupBox();

this.lbUserName = new System.Windows.Forms.Label();

this.lbUserPassword = new System.Windows.Forms.Label();

this.tbUserName = new System.Windows.Forms.TextBox();

this.tbUserPassword = new System.Windows.Forms.TextBox();

this.btIn = new System.Windows.Forms.Button();

this.gbLogon.SuspendLayout();

this.SuspendLayout();

this.gbLogon.Anchor = System.Windows.Forms.AnchorStyles.None;

this.gbLogon.Controls.Add(this.btIn);

this.gbLogon.Controls.Add(this.tbUserPassword);

this.gbLogon.Controls.Add(this.tbUserName);

this.gbLogon.Controls.Add(this.lbUserPassword);

this.gbLogon.Controls.Add(this.lbUserName);

this.gbLogon.Location = new System.Drawing.Point(12, 12);

this.gbLogon.Name = "gbLogon";

this.gbLogon.Size = new System.Drawing.Size(425, 145);

this.gbLogon.TabIndex = 0;

this.gbLogon.TabStop = false;

this.gbLogon.Text = "Учётные данные";

this.lbUserName.AutoSize = true;

this.lbUserName.Location = new System.Drawing.Point(6, 35);

this.lbUserName.Name = "lbUserName";

this.lbUserName.Size = new System.Drawing.Size(111, 19);

this.lbUserName.TabIndex = 0;

this.lbUserName.Text = "Пользователь";

this.lbUserPassword.AutoSize = true;

this.lbUserPassword.Location = new System.Drawing.Point(6, 69);

this.lbUserPassword.Name = "lbUserPassword";

this.lbUserPassword.Size = new System.Drawing.Size(63, 19);

this.lbUserPassword.TabIndex = 1;

this.lbUserPassword.Text = "Пароль";

this.tbUserName.Location = new System.Drawing.Point(153, 32);

this.tbUserName.Name = "tbUserName";

this.tbUserName.Size = new System.Drawing.Size(266, 27);

this.tbUserName.TabIndex = 2;

this.tbUserName.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;

this.tbUserPassword.Location = new System.Drawing.Point(153, 66);

this.tbUserPassword.Name = "tbUserPassword";

this.tbUserPassword.Size = new System.Drawing.Size(266, 27);

this.tbUserPassword.TabIndex = 3;

this.tbUserPassword.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;

this.tbUserPassword.UseSystemPasswordChar = true;

this.btIn.Location = new System.Drawing.Point(330, 99);

this.btIn.Name = "btIn";

this.btIn.Size = new System.Drawing.Size(89, 34);

this.btIn.TabIndex = 4;

this.btIn.Text = "Вход";

this.btIn.UseVisualStyleBackColor = true;

this.btIn.Click += new System.EventHandler(this.btIn_Click);

this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(449, 169);

this.Controls.Add(this.gbLogon);

this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;

this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);

this.Name = "FormLogon";

this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

this.Text = "Вход";

this.gbLogon.ResumeLayout(false);

this.gbLogon.PerformLayout();

this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.GroupBox gbLogon;

private System.Windows.Forms.Button btIn;

private System.Windows.Forms.TextBox tbUserPassword;

private System.Windows.Forms.TextBox tbUserName;

private System.Windows.Forms.Label lbUserPassword;

private System.Windows.Forms.Label lbUserName;

}

namespace Storage_Coursework

{

public partial class FormMain: Form

{

private Storage_Coursework.Objects.User currentUser;

public FormMain()

{

InitializeComponent();

}

public void UserIn()

{

FormLogon fl = new FormLogon();

fl.UserLogining += fl_UserLogining;

fl.ShowDialog(this);

}

private void fl_UserLogining(object sender, EventArgs e)

{

if (sender == null)

{

MessageBox.Show("У Вас нет прав доступа к приложению");

}

else

currentUser = (Storage_Coursework.Objects.User)sender;

}

private void FormMain_Load(object sender, EventArgs e)

{

UserIn();

SetupControls();

}

private void SetupControls()

{

if (currentUser == null)

{

this.Close();

return;

}

slbUser.Text = "Пользователь: " + currentUser.UserName + " [" + currentUser.UserRole.RoleName + "]";

pnlStorage.Visible = currentUser.UserRole.ExistAccess("StorageView");

btAdmin.Visible = currentUser.UserRole.ExistAccess("ShowAdminPanel");

LoadStorage();

}

private void LoadStorage()

{

var mtrls = Storage_Coursework.Providers.MaterialProvider.GetMaterials();

List<Control> cntrls = new List<Control>();

foreach (Storage_Coursework.Objects.Material m in mtrls)

{

var c = new Storage_Coursework.UserControls.Material(m, currentUser);

c.Dock = DockStyle.Top;

cntrls.Add(c);

}

pnlStorage.Controls.AddRange(cntrls.ToArray());

}

private void btAdmin_Click(object sender, EventArgs e)

{

MessageBox.Show("Администратор имеет права:" + Environment.NewLine +

"- добавления/удаления пользователей;" + Environment.NewLine +

"- редактирование ролей пользователей;" + Environment.NewLine +

"- настройка приложения." + Environment.NewLine +

"В рамках данной курсовой работы этот функционал не разрабатывался.");

}

namespace Storage_Coursework

{

partial class FormMain

{

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Код, автоматически созданный конструктором форм Windows

private void InitializeComponent()

{

this.statusStrip1 = new System.Windows.Forms.StatusStrip();

this.slbUser = new System.Windows.Forms.ToolStripStatusLabel();

this.pnlStorage = new System.Windows.Forms.Panel();

this.lbMaterials = new System.Windows.Forms.Label();

this.btAdmin = new System.Windows.Forms.Button();

this.statusStrip1.SuspendLayout();

this.SuspendLayout();

this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {

this.slbUser});

this.statusStrip1.Location = new System.Drawing.Point(0, 451);

this.statusStrip1.Name = "statusStrip1";

this.statusStrip1.Size = new System.Drawing.Size(660, 22);

this.statusStrip1.TabIndex = 0;

this.statusStrip1.Text = "statusStrip1";

this.slbUser.Name = "slbUser";

this.slbUser.Size = new System.Drawing.Size(87, 17);

this.slbUser.Text = "Пользователь:";

this.pnlStorage.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)

System.Windows.Forms.AnchorStyles.Left)

System.Windows.Forms.AnchorStyles.Right)));

this.pnlStorage.AutoScroll = true;

this.pnlStorage.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;

this.pnlStorage.Location = new System.Drawing.Point(12, 31);

this.pnlStorage.Name = "pnlStorage";

this.pnlStorage.Size = new System.Drawing.Size(636, 417);

this.pnlStorage.TabIndex = 1;

this.lbMaterials.AutoSize = true;

this.lbMaterials.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));

this.lbMaterials.Location = new System.Drawing.Point(12, 9);

this.lbMaterials.Name = "lbMaterials";

this.lbMaterials.Size = new System.Drawing.Size(167, 19);

this.lbMaterials.TabIndex = 2;

this.lbMaterials.Text = "Материалы на складе";

this.btAdmin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));

this.btAdmin.Location = new System.Drawing.Point(501, 2);

this.btAdmin.Name = "btAdmin";

this.btAdmin.Size = new System.Drawing.Size(147, 26);

this.btAdmin.TabIndex = 3;

this.btAdmin.Text = "Администрирование";

this.btAdmin.UseVisualStyleBackColor = true;

this.btAdmin.Click += new System.EventHandler(this.btAdmin_Click);

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(660, 473);

this.Controls.Add(this.btAdmin);

this.Controls.Add(this.lbMaterials);

this.Controls.Add(this.pnlStorage);

this.Controls.Add(this.statusStrip1);

this.Name = "FormMain";

this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;

this.Text = "Склад";

this.Load += new System.EventHandler(this.FormMain_Load);

this.statusStrip1.ResumeLayout(false);

this.statusStrip1.PerformLayout();

this.ResumeLayout(false);

this.PerformLayout();

}

#endregion

private System.Windows.Forms.StatusStrip statusStrip1;

private System.Windows.Forms.ToolStripStatusLabel slbUser;

private System.Windows.Forms.Panel pnlStorage;

private System.Windows.Forms.Label lbMaterials;

private System.Windows.Forms.Button btAdmin;

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace Storage_Coursework

{

public partial class FormMatCount: Form

{

private Storage_Coursework.Objects.Material material;

private int matCount;

private int delta;

private int total;

public int Total

{

get { return total; }

set

{

total = value;

txtTotal.Text = total + " " + material.MaterialMeasure;

}

public event EventHandler CountChanged;

public FormMatCount(Storage_Coursework.Objects.Material m, int d)

{

InitializeComponent();

material = m;

matCount = material.StorageCount;

delta = d;

}

private void FormMatCount_Load(object sender, EventArgs e)

{

SetupControls();

}

private void SetupControls()

{

txtCount.Text = matCount + " " + material.MaterialMeasure;

txtTotal.Text = txtCount.Text;

nudInOut.ValueChanged += nudInOut_ValueChanged;

if (delta > 0)

{

this.Text = "Добавить материал";

lbInOut.Text = "Ввод на склад";

lbTotal.Text = "Станет";

}

else

{

this.Text = "Вывести материал";

lbInOut.Text = "Вывод со склада";

lbTotal.Text = "Останется";

}

void nudInOut_ValueChanged(object sender, EventArgs e)

{

if (delta > 0)

{

Total = matCount + (int)nudInOut.Value;

}

else

{

if ((int)nudInOut.Value > matCount)

nudInOut.Value = matCount;

Total = matCount - (int)nudInOut.Value;

}

private void btOk_Click(object sender, EventArgs e)

{

if ((int)nudInOut.Value != 0)

{

Storage_Coursework.Providers.MaterialProvider.UpdateMaterialCount(this.material.MaterialID, this.total);

CountChanged(null, null);

}

this.Close();

}

namespace Storage_Coursework

{

partial class FormMatCount

{

private System.ComponentModel.IContainer components = null;

protected override void Dispose(bool disposing)

{

if (disposing && (components != null))

{

components.Dispose();

}

base.Dispose(disposing);

}

#region Windows Form Designer generated code

private void InitializeComponent()

{

this.gbMaterial = new System.Windows.Forms.GroupBox();

this.btOk = new System.Windows.Forms.Button();

this.nudInOut = new System.Windows.Forms.NumericUpDown();

this.txtTotal = new System.Windows.Forms.Label();

this.txtCount = new System.Windows.Forms.Label();

this.lbTotal = new System.Windows.Forms.Label();

this.lbInOut = new System.Windows.Forms.Label();

this.lbStorage = new System.Windows.Forms.Label();

this.gbMaterial.SuspendLayout();

((System.ComponentModel.ISupportInitialize)(this.nudInOut)).BeginInit();

this.SuspendLayout();

this.gbMaterial.Anchor = System.Windows.Forms.AnchorStyles.None;

this.gbMaterial.Controls.Add(this.btOk);

this.gbMaterial.Controls.Add(this.nudInOut);

this.gbMaterial.Controls.Add(this.txtTotal);

this.gbMaterial.Controls.Add(this.txtCount);

this.gbMaterial.Controls.Add(this.lbTotal);

this.gbMaterial.Controls.Add(this.lbInOut);

this.gbMaterial.Controls.Add(this.lbStorage);

this.gbMaterial.Location = new System.Drawing.Point(12, 12);

this.gbMaterial.Name = "gbMaterial";

this.gbMaterial.Size = new System.Drawing.Size(448, 171);

this.gbMaterial.TabIndex = 0;

this.gbMaterial.TabStop = false;

this.gbMaterial.Text = "Материал";

this.btOk.Location = new System.Drawing.Point(331, 131);

this.btOk.Name = "btOk";

this.btOk.Size = new System.Drawing.Size(111, 34);

this.btOk.TabIndex = 6;

this.btOk.Text = "Выполнить";

this.btOk.UseVisualStyleBackColor = true;

this.btOk.Click += new System.EventHandler(this.btOk_Click);

this.nudInOut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));

this.nudInOut.Location = new System.Drawing.Point(340, 63);

this.nudInOut.Maximum = new decimal(new int[] {

this.nudInOut.Name = "nudInOut";

this.nudInOut.Size = new System.Drawing.Size(102, 27);

this.nudInOut.TabIndex = 5;

this.nudInOut.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;

this.txtTotal.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));

this.txtTotal.Location = new System.Drawing.Point(260, 96);

this.txtTotal.Name = "txtTotal";

this.txtTotal.Size = new System.Drawing.Size(182, 19);

this.txtTotal.TabIndex = 4;

this.txtTotal.Text = "0";

this.txtTotal.TextAlign = System.Drawing.ContentAlignment.TopRight;

this.txtCount.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));

this.txtCount.Location = new System.Drawing.Point(256, 34);

this.txtCount.Name = "txtCount";

this.txtCount.Size = new System.Drawing.Size(186, 19);

this.txtCount.TabIndex = 3;

this.txtCount.Text = "0";

this.txtCount.TextAlign = System.Drawing.ContentAlignment.TopRight;

this.lbTotal.AutoSize = true;

this.lbTotal.Location = new System.Drawing.Point(6, 96);

this.lbTotal.Name = "lbTotal";

this.lbTotal.Size = new System.Drawing.Size(127, 19);

this.lbTotal.TabIndex = 2;

this.lbTotal.Text = "Будет на складе";

this.lbInOut.AutoSize = true;

this.lbInOut.Location = new System.Drawing.Point(6, 65);

this.lbInOut.Name = "lbInOut";

this.lbInOut.Size = new System.Drawing.Size(112, 19);

this.lbInOut.TabIndex = 1;

this.lbInOut.Text = "Ввод на склад";

this.lbStorage.AutoSize = true;

this.lbStorage.Location = new System.Drawing.Point(6, 34);

this.lbStorage.Name = "lbStorage";

this.lbStorage.Size = new System.Drawing.Size(145, 19);

this.lbStorage.TabIndex = 0;

this.lbStorage.Text = "Имеется на складе";

this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 19F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.ClientSize = new System.Drawing.Size(472, 195);

this.Controls.Add(this.gbMaterial);

this.Font = new System.Drawing.Font("Tahoma", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204)));

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;

this.Margin = new System.Windows.Forms.Padding(4);

this.Name = "FormMatCount";

this.Text = "Добавить";

this.Load += new System.EventHandler(this.FormMatCount_Load);

this.gbMaterial.ResumeLayout(false);

this.gbMaterial.PerformLayout();

((System.ComponentModel.ISupportInitialize)(this.nudInOut)).EndInit();

this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.GroupBox gbMaterial;

private System.Windows.Forms.Button btOk;

private System.Windows.Forms.NumericUpDown nudInOut;

private System.Windows.Forms.Label txtTotal;

private System.Windows.Forms.Label txtCount;

private System.Windows.Forms.Label lbTotal;

private System.Windows.Forms.Label lbInOut;

private System.Windows.Forms.Label lbStorage;

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

namespace Storage_Coursework

{

public class ObjectProvider

{

public ObjectProvider()

}

public static object GetObject(DataRow r, Type objectType)

{

System.Reflection.ConstructorInfo cnstr = objectType.GetConstructor(System.Type.EmptyTypes);

var o = cnstr.Invoke(null);

System.Reflection.MemberInfo[] members = objectType.GetMembers();

int fieldsCount = r.Table.Columns.Count;

for (int i = 0; i < fieldsCount; i++)

{

string fieldName = r.Table.Columns[i].ColumnName;

object fieldValue = r[fieldName];

var member = members.First(t => t.Name == fieldName && t.MemberType == System.Reflection.MemberTypes.Property);

if (member != null)

{

System.Reflection.PropertyInfo property = (System.Reflection.PropertyInfo)member;

Type t = property.PropertyType;

object val;

if (t.Name == "String" || t.Name == "Char")

if (fieldValue.ToString() != "")

val = fieldValue;

else

val = null;

else

{

if (fieldValue.ToString() == "")

val = null;

else

{

System.Reflection.MethodInfo parseMethod = t.GetMethod("Parse", new Type[] { "s".GetType() });

val = parseMethod.Invoke(o, new object[] { fieldValue.ToString() });

}

property.SetValue(o, val, null);

}

return o;

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

using System.Data.OleDb;

namespace Storage_Coursework

{

public static class OleDB

{

private static OleDbConnection ole;

static OleDB()

{

string connStr = "Provider=Microsoft.Ace.OLEDB.12.0; Data Source=Storage_CourseworkDB.accdb";

ole = new OleDbConnection(connStr);

ole.Open();

}

public static DataSet ExecuteQuery(string query)

{

try

{

OleDbDataAdapter adapter = new OleDbDataAdapter(query, ole);

DataSet ds = new DataSet("Data");

adapter.FillSchema(ds, SchemaType.Source, "Table");

adapter.Fill(ds, "Table");

return ds;

}

catch (Exception e)

{

return null;

}

public static bool DsIsNullOrEmpty(DataSet ds)

{

if (ds == null || ds.Tables[0].Rows.Count == 0)

return true;

return false;

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace Storage_Coursework

{

static class Program

{

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new FormMain());

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Data;

using System.Data.SqlClient;

namespace Storage_Coursework

{

public static class SqlDB

{

private static SqlConnection sql;

static SqlDB()

{

string connStr = "Data Source=TIMOFEYPC\\SQLEXPRESS;Database=Storage_Coursework;Integrated Security=false;User ID=sa; Password=123123";

sql = new SqlConnection(connStr);

sql.Open();

}

public static DataSet ExecuteQuery(string query)

{

try

{

SqlDataAdapter adapter = new SqlDataAdapter(query, sql);

DataSet ds = new DataSet("Data");

adapter.FillSchema(ds, SchemaType.Source, "Table");

adapter.Fill(ds, "Table");

return ds;

}

catch (Exception e)

{

return null;

}

public static bool DsIsNullOrEmpty(DataSet ds)

{

if (ds == null || ds.Tables[0].Rows.Count == 0)

return true;

return false;

}

Заключение

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

В процессе выполнения этой курсовой работы мной был разработан нестандартный метод преобразования объектов базы данных в объекты классов приложения. Такой подход позволит упростить дальнейшую разработку и сопровождение программы «Склад строительных материалов» и расширить её до масштабов полноценной многофункциональной информационной системы для строительного предприятия.

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

1. Михаил Флёнов. Библия C#. 2-е издание. БХВ-Петербург. 2011

2. Эндрю Троелсен. Язык программирования C# 2010. Вильямс. 2011 г.

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


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

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