Реферат по предмету "Информатика"


Автоматизированная информационная система Оптовый продовольственный склад

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

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

ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Вечерне-заочный факультет

Кафедра информационных систем в экономике

КУРСОВАЯ РАБОТА

по дисциплинам «Проектирование экономических
информационных систем» и «Базы данных»

Автоматизированная информационная система
«Оптовый продовольственный склад»

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


Выполнил студент

группы ПИЭ ________________________ ФИО>______________

(шифр) (подпись) (дата)
Проверил преподаватель ________________________ ФИО>______________

(подпись) (дата)
Киров 2010 г.

Оглавление

Введение
Цель курсовой работы по предмету «Базы данных» — создание базы данных при помощи любой СУБД и разработка собственного приложения для работы с этой базой данных.

Цель курсовой работы по предмету «Проектирование информационных систем» — спроектировать и реализовать основные функции информационной системы в рабочем приложении.

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

Проектирование информационной системы осуществляется при помощи унифицированного языка моделирования UML при помощи приложения Visual Paradigm for UML community Edition.

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

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

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

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

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

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

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

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

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

/>

По данной диаграмме можно судить о том, какие функции должна выполнять разрабатываемая информационная система. Первой и самой важной функцией системы является формирование заявок на поставку товара формируемых менеджером по закупкам. Поскольку товар необходимо заказывать не просто так, а для кого-то, то также неотъемлемой частью системы становится учет заявок покупателей. Исходными данными для формирования входящих заявок является информация о нуждаемости того или иного покупателя в том или ином продукте. Такая информация может вноситься в систему либо оператором системы, либо потенциальным покупателем лично. В задачи менеджера по продажам входит проанализировать сведения о заявках покупателей, информацию о покупателях, поставщиках и товарах, а также сформировать и направить заявки на поставки товара. После этого менеджер по закупкам обязан принять товар от поставщика. Кроме того система позволяет также и сформировать расходные документы для продажи товара покупателю, однако данный момент выходит за рамки компетенции менеджера по закупкам.
1.2Модель анализа
Модель анализа выявляет основные классы и взаимоотношения между ними.Диаграммой классов (Class diagram) называют диаграмму, на которой показано множество классов, интерфейсов, коопераций и отношений между ними.

По диаграмме классов можно легко заметить насколько важную роль в функционировании системы играет класс MySQL. Именно он содержит свойства и методы необходимые для подключения к СУБД, выборки и изменения данных. Также важным классом является главная форма приложения (MainForm). MainForm является отправной точкой для выполнения всех функций системы. С помощью её создаются экземпляры классов документов, которые открывают собственные формы, вызывается форма ввода имени пользователя и пароля, а также создается объект frmlistManager, который тоже не менее интересен. С помощью данного класса можно отобразить на экране и управлять данными любой таблицы, содержащей справочную информацию. Информацию о структуре таблицы он получает при помощи метода TableStructure класса MySQL.
/>
1.3Модель проектирования
Модель проектирования показывает взаимодействия внутри системы, способы передачи информации, потоки данных, состояния объектов системы. Для описания модели проектирования используем диаграммы взаимодействия (последовательности и кооперации) и состояния.

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

Сообщения «Operation» и «frmDocument» выделены шрифтом так как обобщают классы и формы всех документов. Применена диаграмма кооперации для концентрации внимания на связях между объектами. Благодаря этому хорошо заметно, что редактирование справочной информации в БД происходит напрямую из формы, в то время как изменение и выборка данных о документах происходит только через промежуточный объект.
1.3.2Диаграмма взаимодействия
/>На данной диаграмме показан порядок действий программы при авторизации пользователя.

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

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

Дополнительно могут быть разработаны ТЗ на части АС:

на подсистемы АС, комплексы задач АС и т. п. в соответствии с требованиями настоящего стандарта;

на комплектующие средства технического обеспечения и программно-технические комплексы в соответствии со стандартами ЕСКД и СРПП;

на программные средства в соответствии со стандартами ЕСПД;

на информационные изделия в соответствии с ГОСТ 19.201 и НТД, действующей в ведомстве заказчика АС.

Техническое задание на разработку рассматриваемой системы содержится в Приложении 1.

Выбор программных средств разработки и реализации системы
Потенциальными потребителями разрабатываемой системы, скорее всего, окажутся небольшие предприятия и индивидуальные предприниматели. Для них один их актуальных критериев выбора информационной системы – это стоимость. Следовательно, средство разработки средство разработки должно стоить как можно меньше или вообще распространяться свободно. В то же время, информационная система обязана быть конкурентоспособной, а значит должна поддерживать актуальные на сегодняшний момент платформы. Из таких решений можно выбрать Microsoft Visual Studio Express Edition 2008 (VS EE 2010 на момент написания курсового проекта находится в стадии beta-тестирования и потому не рассматривается) и проект компании Nokia — QT Creator. Среда разработки от компании Microsoft – наиболее распространена, но позволяет разрабатывать только приложения совместимые с операционной системой Windows. QT Creator же позволяет создавать приложения, совместимые с набором мультиплатформенных библиотек — QT. А значит, приложения, которые созданы в этой IDE – тоже мультиплатформенные. Однако данная среда разработки позволяет писать приложения только на языке С++, которому автор курсового проекта не симпатизирует. Visual Studio предлагает разрабатывать проекты с использованием Visual Basic, C++, а также, всё больше набирающим популярность, С#. Кроме того, последняя версия языка C# приобрела такие приятные функции как вывод типа, анонимные типы, расширяющие методы, лямбда-выражения, а также встроенный язык доступа к коллекциям объектов – Linq. И, наконец, «контрольным выстрелом» является то, что с недавнего времени Visual Studio 2008 полностью переведена на русский язык. Так что разрабатываемая система написана на языке программирования C# и будет использоваться только с операционной системой Windows. Для подключения к базе данных предполагается использовать интерфейс ODBC. Он позволяет абстрагироваться от внутренней механики той или иной СУБД и использовать любую из них. Единственное требование к СУБД в таком случае – наличие ODBC драйвера. В рамках курсовой работы используется СУБД MySQL. Основная причина выбора данной СУБД – это соблюдение лицензионной чистоты при отсутствии денежных выплат. Данная СУБД распространяется свободно для некоммерческого использования, а потому для образовательных целей подойдет. Кроме того набор визуальных средств администрирования имеет настолько понятный интерфейс, что даже не требуется наличие его локализации. Также данная СУБД удобна тем, что информация о таблицах БД содержится в такой же БД, только системной. Благодаря такой возможности можно реализовать универсальный и интеллектуальный механизм доступа к данным. Имеется ввиду, что, благодаря этой возможности легко реализуется выборка, группировка и анализ информации об именах полей, их типах, наличии внешних ключей интересующей таблицы база данных. Используя эту информацию можно программным кодом генерировать SQL запросы для доступа к информации, содержащейся в БД (Такие возможности будут продемонстрированы в классе frmListManager). Ну и, наконец, последним, и не очень важным, субъективным аргументом в пользу MySQL является его логотип. Дело в том, что в сравнении с другими свободными решениями плывущий дельфин смотрится гораздо приятней горящей птички и тем более на порядок красивей слоника в кепке.

Концептуальная модель базы данных
/>
Пользовательский интерфейс информационной системы и исходные коды объектов 1.4Класс MySQL
Статический класс MySQL является самой важной частью приложения. Именно он определяет параметры для подключения к базе данных, само подключение и доступ к данным.

usingSystem;

usingSystem.Data;

usingSystem.Data.Odbc;

usingSystem.Collections.Generic;

namespacewinOrders

{

staticclassMySQL

{

publicstaticstringDriver {get;set;}

publicstaticstringServer {get;set;}

publicstaticintPort {get;set;}

publicstaticstringUser {get;set;}

publicstaticstringPass {get;set;}

publicstaticstringDatabase {get;set;}

publicstaticOdbcConnection Connection {get;set;}

publicstaticLink CurrentUser {get;set;}


publicstaticstringConnectionString()

{// ФормированиестрокиподключениякБД

return«DRIVER=»+Driver +";"

+«SERVER=»+Server +";"

+«PORT=»+Port.ToString()+";"

+«USER=»+User +";"

+«PASSWORD=»+Pass +";"

+«DATABASE=»+Database +";"

+«stmt=SET NAMES 'cp1251';OPTION=4;»;

}


publicstaticOdbcConnection GetConnection()

{// ФормированиеподключениякБД

returnnewOdbcConnection(ConnectionString());

}


publicstaticDataTable TableStructure(thisstringTableName)

{// Возвращает таблицу структуры таблицы базы данных по имени таблицы

// простите за тавтологию :)

vardt =newDataTable();

stringSQLstring =

@«SELECT

i.COLUMN_COMMENT as Synonym,

i.COLUMN_NAME as Name,

i.DATA_TYPE as Type,

i.CHARACTER_MAXIMUM_LENGTH as Length,

i.COLUMN_KEY as _Key,

k.REFERENCED_TABLE_NAME as rTab,

k.REFERENCED_COLUMN_NAME as rCol

FROM information_schema.COLUMNS as i

LEFT JOIN information_schema.KEY_COLUMN_USAGE as k ON

i.TABLE_SCHEMA = k.TABLE_SCHEMA AND

i.TABLE_NAME = k.TABLE_NAME AND

i.COLUMN_NAME = k.COLUMN_NAME

WHERE i.TABLE_SCHEMA = '»+Database +"' and i.TABLE_NAME = '"+TableName +"'";

dt.Fill(SQLstring);

returndt;

}


publicstaticstringGetSynonym(thisstringTableName)

{// Определяет пользовательское представление таблицы БД по имени таблицы

stringSQLstring =

@«SELECT LEFT(TABLE_COMMENT,LOCATE(';', TABLE_COMMENT)-1)

FROM information_schema.`TABLES`

where TABLE_SCHEMA = '»+Database+"' and TABLE_NAME = '"+TableName+"'";

stringresultString =GetCommand(SQLstring).ExecuteScalar().ToString();

returnresultString ==""?TableName :resultString;

}


publicstaticstringGetSynonym(thisstringTableName,stringColumnName)

{// Определяет пользовательское представление колонки таблицы БД

stringSQLstring =

«SELECT COLUMN_COMMENT FROM information_schema.`COLUMNS`»+

«where TABLE_SCHEMA = '»+Database+"'"

+" and TABLE_NAME = '"+TableName+"'"

+" and COLUMN_NAME = '"+ColumnName+"'";

stringresultString =GetCommand(SQLstring).ExecuteScalar().ToString();

returnresultString ==""?ColumnName :resultString;

}


publicstaticstringGetSynonym(thisDataRow row)

{// Находит пользовательское представление клонки в строке таблицы структуры БД

returnrow.GetCol(«Synonym»)==""?row.GetName():row.GetCol(«Synonym»);

}


publicstaticOdbcType GetOdbcType(stringTypeName)

{// Определение типа данных по имени типа

switch(TypeName)

{

case«int»:returnOdbcType.Int;

case«varchar»:returnOdbcType.VarChar;

case«tinyint»:returnOdbcType.TinyInt;

case«date»:returnOdbcType.Date;

case«datetime»:returnOdbcType.DateTime;


default:returnOdbcType.VarChar;

}

}


publicstaticOdbcType GetOdbcType(thisDataRow row)

{// Получение значения типа данных из строки таблицы структуры БД

returnGetOdbcType(row.GetCol(«Type»));

}


publicstaticintGetLenght(thisDataRow row)

{// Получение длины значения для колонки из строки талицы структуры БД

returnrow.GetCol(«Length»)==""?1:int.Parse(row.GetCol(«Length»));

}


publicstaticstringGetName(thisDataRow row)

{// получение поля «Name»

// необходимо часто, поэтому выделено в отдельный метод

returnrow.GetCol(«Name»);

}


publicstaticstringGetCol(thisDataRow row,stringColName)

{// Получение колонки таблицы по имени с проверкой существования колонки

if(row.Table.Columns.Contains(ColName))

returnrow[ColName].ToString();

elsethrownewException("Нетколонки"+ColName+"!");

}


publicstaticboolGetBoolCol(thisDataRow row,stringColName)

{// Конвертацияtinyint вbool

returnrow.GetCol(ColName)==«1»?true:false;

}
publicstaticintGetLastId()

{// Получение последнего автоматически сгенерированного идентификатора

returnint.Parse(GetCommand(«SELECT LAST_INSERT_ID()»).ExecuteScalar().ToString());

}


publicstaticintGetId(thisDataRow row)

{// Получениеполя«id»

stringid =row.GetCol(«id»).ToString();

returnid==""?:int.Parse(id);

}


publicstaticOdbcParameter GetParameter(thisDataRow row)

{// Формированиепараметракзапросу

returnnewOdbcParameter("@"+row.GetName(),row.GetOdbcType(),row.GetLenght(),row.GetName());

}


publicstaticOdbcDataAdapter GetAdapter(stringSQLstring)

{// Получениедата-адаптера

returnnewOdbcDataAdapter(SQLstring,Connection);

}


publicstaticvoidFill(thisDataTable table,stringSQLstring)

{// заполнение таблицы данными на основе строки SQL запроса

table.Clear();

GetAdapter(SQLstring).Fill(table);

}


publicstaticOdbcCommand GetCommand(stringSQLstring)

{// ПолучениеобъектаOdbcCommand

returnnewOdbcCommand(SQLstring,Connection);

}


publicstaticboolTestConnection()

{// ПроверкасоединениясБД

boolresult =true;

try

{

Connection.Open();

}

catch(Exception)

{



result =false;

}

returnresult;

}


publicstaticListLink>ToLinksList(thisDataTable dt)

{// Формированиеспискассылокизтаблицы

returnnewListLink>(dt.AsEnumerable()

.Select(r =>newLink(dt.TableName,r.GetId(),r.GetName())));

}


publicstaticListLink>GetLinkCollection(stringtableName)

{// Получение списка ссылок для выпадающих списков

DataTable dt =newDataTable(tableName);

dt.Fill(«SELECT id, Name FROM „+tableName);

returndt.ToLinksList();

}


publicstaticstringToMySQL(thisDateTime date)

{// Конвертация даты в строку формата MySQL

return“'»+string.Format("{0:yyyy-MM-dd HH:mm:ss}",date)+"'";

}

}

}
--PAGE_BREAK--

1.5Классы документов
Прежде чем приводить исходные коды классов документов нужно сказать несколько слов о служебном классе Link. Так как для системы важна информация о идентификаторе объекта, на которого сослаться, а также название таблицы базы данных, а для пользователя наиболее важно представление, было принято решение сконцентрировать все эти три вещи в одной сущности. Метод ToString()необходим для нормального отображения экземпляра в контролах, с которыми осуществляется связь полей объектов типа Link. Кроме того для возможности упорядочивания необходима реализация интерфейса IComparable, а именно метода CompareTo(objectobj).

publicclassLink :IComparable

{

publicstringTableName {get;privateset;}

publicintId {get;set;}

publicstringName {get;set;}


publicLink(stringtableName)

{

this.TableName =tableName;

}


publicLink(stringtableName,intid,stringname)

{

this.TableName =tableName;

this.Id =id;

this.Name =name;

}


publicLink(stringtableName,intid)

{

this.TableName =tableName;

this.Id =id;

this.Name =MySQL.GetCommand(«SELECT `Name` FROM `»+tableName+

"` WHERE `id` = '"+id +"'").ExecuteScalar().ToString();

}


publicLink(stringtableName,DataRow row,stringcolPrefix)

{

this.TableName =tableName;

this.Id =int.Parse(row.GetCol(colPrefix+"_id"));

this.Name =row.GetCol(colPrefix +"_name");

}


publicoverridestringToString()

{

returnthis.Name;

}


publicintCompareTo(objectobj)

{

varother =obj asLink;

intresult =this.Name.CompareTo(other.Name);

returnresult ==?this.Id.CompareTo(other.Id):result;

}

}

Далее приведены исходные коды класса Operation и унаследованного от него класса OrderIn. Кроме того показан класс OrderInParameter. Класс заявки имеет в качестве одного из свойств типизированный список параметров.

publicclassOperation :IComparable

{

publicDateTime Date {get;set;}

publicintId {get;set;}


publicOperation()

{

this.Date =DateTime.Now;

}


publicintCompareTo(objectobj)

{// Функция нужна для возможности упорядочивания

varother =obj asOperation;

intresult =this.Date.CompareTo(other.Date);

returnresult ==?this.Id.CompareTo(other.Id):result;

}


publicvirtualboolSave()

{

returntrue;

}

}




publicclassOrderIn :Operation

{

publicLink Client {get;set;}

publicfloatCount {get;set;}

publicintStatus {get;set;}// Пока число, потом надо будет создать перечисление

publicListOrderInParameter>Parameters {get;set;}


privateLink _good;

publicLink Good

{

get {return_good;}

set {

_good =value;

GenerateNewParameters();

}

}



publicOrderIn()

{

this.Client =MySQL.CurrentUser;

}


publicOrderIn(intid)

{

vardt =newDataTable();


stringSQLstring =

@«SELECT orderin.id as id,

orderin.date as date,

orderin.client as client_id,

users.Name as client_name,

orderin.good as good_id,

kgoods.Name as good_name,

orderin.count as count,

orderin.status as status

FROM orderin

LEFT JOIN users ON orderin.client = users.id

LEFT JOIN kgoods ON orderin.good = kgoods.id

WHERE orderin.id = '»+id +"'";


dt.Fill(SQLstring);


if(dt.Rows.Count >)

{

varrow =dt.Rows[];

this.Id =id;

this.Date =DateTime.Parse(row.GetCol(«date»));

this.Client =newLink(«users»,row,«client»);

// присваиваю приватному свойству для того, чтобы

// геттер не генерил новые параметры

_good =newLink(«kgoods»,row,«good»);

this.Count =float.Parse(row.GetCol(«count»));

this.Status =int.Parse(row.GetCol(«status»));

}


dt.Clear();


SQLstring =

@«SElECT o.id as id,

o.checked as checked,

o.characteristic as char_id,

k.name as char_name,

o.equality as equality,

o.val as val

FROM orderinparameters as o

LEFT JOIN kcharacteristics as k ON o.characteristic = k.id

WHERE o.idorder = '»+this.Id +"'";


dt.Fill(SQLstring);


varparameters =dt.AsEnumerable()

.Select(row =>newOrderInParameter(this,

row.GetId(),

row.GetBoolCol(«checked»),

newLink(«kcharacteristics»,row,«char»),

row.GetCol(«equality»),

row.GetCol(«val»)));


this.Parameters =newListOrderInParameter>(parameters);

}


publicvoidGenerateNewParameters()

{

vardt =newDataTable();


stringSQLstring =

@«SELECT curCh.id as id,

curCh.checked as checked,

kc.id as char_id,

kc.Name as char_name,

curCh.equality as equality,

curCh.val as val

FROM kchargoods as kcg

LEFT JOIN kcharacteristics as kc ON kcg.KindOfCharacteristic = kc.id

LEFT JOIN (

SELECT id, checked, characteristic, val, equality

FROM orderinparameters

WHERE idorder = '»+this.Id+@"'

) as curCh ON kc.id = curCh.characteristic

WHERE KindOfGood = '"+this.Good.Id +"'";


dt.Fill(SQLstring);


varparameters =dt.AsEnumerable()

.Select(row =>newOrderInParameter(this,

row.GetId(),

row.GetBoolCol(«checked»),

newLink(«kcharacteristics»,row,«char»),

row.GetCol(«equality»),

row.GetCol(«val»)));


this.Parameters =newListOrderInParameter>(parameters);

}


publicvoidOpenForm(Form1 mainForm)

{

frmOrderIn f;

if(mainForm.OpenWindows.Contains(this.ToString()))

{

f =(frmOrderIn)mainForm.OpenWindows[this.ToString()];

f.Activate();

}

else

{

f =newfrmOrderIn(this,mainForm);

mainForm.OpenWindows.Add(this.ToString(),f);

f.Show();

}

}


publicoverridestringToString()

{

return"Заявкаклиента№ "+this.Id.ToString()+" от"+this.Date.ToString();

}


publicoverrideboolSave()

{

varcommand =MySQL.GetCommand(

(this.Id ==?«INSERT INTO»:«UPDATE»)+" orderin SET "+

"`date` = "+this.Date.ToMySQL()+", "+

"`client` = "+this.Client.Id +", "+

"`status` = "+this.Status +", "+

"`good` = "+this.Good.Id +", "+

"`count` = "+this.Count +" "+

(this.Id ==?"":(«WHERE id = „+this.Id +“»)));

command.ExecuteNonQuery();

this.Id =this.Id ==?MySQL.GetLastId():this.Id;


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

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

command.CommandText =«DELETE from orderinparameters WHERE idorder = '»+this.Id +"'";

command.ExecuteNonQuery();

if(this.Parameters.Count !=)

{

varSQLvalues =

(frompar inParameters

select("("+

par.Id +", "+// id

par.Order.Id +", "+// idorder

(par.Checked ?«1»:«0»)+", "+// checked

par.Characteristic.Id +", "+// characteristic

"'"+par.Equality +"', "+// equality

"'"+par.Val +"')"// val

)).Aggregate((a,b)=>a +", "+b);

command.CommandText =

@«INSERT INTO orderinparameters (id, idorder, checked, characteristic, equality, val)

VALUES „+SQLvalues +“;»;

command.ExecuteNonQuery();

}

returntrue;

}

}


publicclassOrderInParameter :IComparable

{

publicintId {get;set;}

publicOrderIn Order {get;set;}

publicboolChecked {get;set;}

publicLink Characteristic {get;set;}

publicobjectVal {get;set;}


privatestring_equality;

publicstringEquality

{

get {return_equality;}

set {_equality =value ==""?"=":value;}

}


publicOrderInParameter()

{

this.Checked =false;

this.Equality ="=";

}


publicOrderInParameter(OrderIn order)

{

this.Order =order;

this.Checked =false;

this.Equality ="=";

}


publicOrderInParameter(OrderIn order,intid)

{

vardt =newDataTable();

stringSQlstring =

@«SElECT o.id as id,

o.idorder as idorder,

o.checked as checked,

k.id as char_id,

k.name as char_name,

o.equality as equality,

o.val as val

FROM orderinparameters as o

LEFT JOIN kcharacteristics as k ON o.characteristic = k.id

WHERE o.id = '»+id +"'";


dt.Fill(SQlstring);


if(dt.Rows.Count >)

{

varrow =dt.Rows[];


this.Id =id;

this.Order =order;

this.Checked =row.GetBoolCol(«checked»);

this.Characteristic =newLink(«kcharacteristics»,row,«char»);

this.Equality =row.GetCol(«equality»);

this.Val =row.GetCol(«val»);

}

}


publicOrderInParameter(OrderIn order,intid,boolcheck,Link characteristic,stringequality,objectval)

{

this.Id =id;

this.Order =order;

this.Checked =check;

this.Characteristic =characteristic;

this.Equality =equality;

this.Val =val;

}


publicintCompareTo(objectobj)

{

varother =obj asOrderInParameter;

intresult =this.Characteristic.CompareTo(other.Characteristic);

returnresult;

}

}


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

/>

privatevoidbtnOK_Click(objectsender,EventArgs e)

{

stringoldUser =MySQL.User;

stringoldPass =MySQL.Pass;

MySQL.User =txtUser.Text.Trim();

MySQL.Pass =txtPass.Text.Trim();

MySQL.Connection =MySQL.GetConnection();

if(!MySQL.TestConnection())

{

MessageBox.Show(«Неправильные имя пользователя или пароль!»,«Ошибка аутентификации»,MessageBoxButtons.OK);

MySQL.User =oldUser;

MySQL.Pass =oldPass;


this
.DialogResult =DialogResult.Cancel;

}

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

В верхней части формы расположены вкладки, позволяющие переключаться между функциями системы. Для экономии места вкладки представлены в виде изображений, характеризующих функции системы. В зависимости от уровня доступа пользователя изменяется набор отображаемых вкладок. Так, например, покупателю доступна только первая вкладка, на которой возможно лишь редактировать собственные заявки. Менеджеру по продажам доступны все вкладки кроме последней, предназначенной для администрирования. Администратору системы разрешён доступ ко всем вкладкам.
1.6.1Вкладка «Формирование заявок покупателя»
/>

С данной закладкой работает покупатель. Здесь отображаются только заявки текущего пользователя. Нижняя таблица отображает список допустимых фильтров. Здесь данные только отображаются, редактировать их нельзя. Для редактирования заявок существует отдельная форма. Конечно, удобней было бы редактировать данные прямо в списке, но это временное решение, так как пока не решена проблема с привязкой данных.
1.6.2Вкладка «Утверждение/отклонение заявок покупателя»
/>

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

1.6.3Вкладка «Формирование заявок поставщику»
/>

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

1.6.4Вкладка «Учет поступления товаров»
/>

Здесь менеджер по продажам оформляет приход товара от поставщика. Слева в рамке располагаются ссылки на отчеты связанные с остатками товаров на складе.

1.6.5Вкладка «Учет реализации товара»
/>
1.6.6Вкладка «Настройки системы»
/>

1.6.7Исходный код главной формы
Полный исходный код главной формы приложения приводить не буду, так как он достаточно велик и содержит немало служебных строк кода. Здесь только самые интересные концепции.

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

publicpartial classForm1 :Form

{

publicIDictionary OpenWindows {get;privateset;}


publicForm1()

{

InitializeComponent();

this.OpenWindows =newDictionarystring,Form>();


}

***

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

privatevoidOpenList(stringTableName)

{

frmListManager list;

if(OpenWindows.Contains(TableName))

{

list =(frmListManager)OpenWindows[TableName];

list.Activate();

}

else

{

list =newfrmListManager(TableName,this);

OpenWindows.Add(TableName,list);

list.Show();

}

}


privatevoidlnkUsers_LinkClicked(objectsender,LinkLabelLinkClickedEventArgs e)

{

OpenList(«users»);

}

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

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

Здесь применяется несколько из возможностей новой версии языка C#. Такие как вывод типа, анонимные типы и встроенный язык доступа к объектам Linq. Необходимость применения Linq здесь обусловлена необходимостью получения информации о заявках в двух видах: подробном с параметрами каждой заявки и свернутом по номерам заявок. В методе сначала выполняется запрос к БД для получения подробной информации, затем полученная информация конвертируется в анонимный тип, а затем полученная коллекция анонимных типов группируется по составному ключу, включающему идентификатор заявки, дату и статус заявки, а также наименование и количество товара.

publicvoidUpdateOrders()

{

vardt =newDataTable();

stringSQLstring =

@«SELECT params.id as idrow,

params.checked as checked,

charac.name as characteristic,

params.equality as equality,

params.val as val,

orderin.id as id,

orderin.date as date,

kgoods.name as good,

orderin.`count` as kol,

orderin.status as status

FROM orderinparameters as params

LEFT JOIN kcharacteristics as charac

ON params.characteristic = charac.id

LEFT JOIN orderin ON params.idorder = orderin.id

LEFT JOIN kgoods ON orderin.good = kgoods.id

WHERE orderin.client = '»+MySQL.CurrentUser.Id +"'";

dt.Fill(SQLstring);


varparameters =fromrow indt.AsEnumerable()

selectnew

{

idorder =row.GetId(),

date =DateTime.Parse(row.GetCol(«date»)),

good =row.GetCol(«good»),

count =int.Parse(row.GetCol(«kol»)),

status =row.GetCol(«status»),

idrow =int.Parse(row.GetCol(«idrow»)),

check =row.GetBoolCol(«checked»),

charac =row.GetCol(«characteristic»),

equality =row.GetCol(«equality»),

val =row.GetCol(«val»)

};

// Группировка коллекции по составному ключу, содержащему

// код, дату, код товара, количество, статус заявки

varorders =fromparam inparameters

groupparam bynew

{

id =param.idorder,

date =param.date,

good =param.good,

count =param.count,

status =param.status

}into ord

selectnew// все соберём в отдельный анонимный тип

{// для облегчения привязки данных

order =ord.Key.id,

date =ord.Key.date,

good =ord.Key.good,

count =ord.Key.count,

status =ord.Key.status,

OrderParameters =ord

};

bsOrderIn.DataSource =orders;

}

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

publicvoidUpdateFoldOrders()

{

vardt =newDataTable();

#region Формирование строки запроса

varSQLstring =

@«SELECT

users.FullName as client,

kgoods.name as good,

orderin.id as id,

orderin.`count` as kol,

orderin.status as status,

prices.price as price,

orderin.`count` * prices.price as summ

FROM orderin

LEFT JOIN kgoods ON orderin.good = kgoods.id

LEFT JOIN users ON orderin.client = users.id

LEFT JOIN (

SELECT

g.kindOfGood as good,

AVG(c.`Value`) as price

FROM characteristics as c

LEFT JOIN goods as g ON c.good=g.id

WHERE kChar = '1'

GROUP BY g.kindOfGood

) as prices ON orderin.good=prices.good»;

#endregion

dt.Fill(SQLstring);


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

varorders =fromrow indt.AsEnumerable()

selectnew

{

id =row.GetId(),

client =row.GetCol(«client»),

good =row.GetCol(«good»),

status =int.Parse(row.GetCol(«status»)),

kol =int.Parse(row.GetCol(«kol»)),

price =float.Parse(row.GetCol(«price»)),

summ =float.Parse(row.GetCol(«summ»))

};

// Группировкапопокупателям

varclients =fromorder inorders

grouporder byorder.client into gr

selectnew

{

client =gr.Key,

kol =gr.Count(),

summ =gr.Sum(p =>p.summ),

orders =gr

};

bsOrderInOnClients.DataSource =clients;

}

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


    продолжение
--PAGE_BREAK--1.7Ф/>орма редактирования списков
Форма предназначена для отображения любых справочных сведений, содержащихся в базе данных. Информацию о структуре таблицы данных получает с помощью специального метода статического класса MySQL. Автоматически определяет ссылки на другие таблицы и сама определяет необходимый тип колонок для таблицы. На основании полученной структуры таблицы базы данных форма генерирует строки запросов для выборки, вставки исправления и удаления данных в таблице БД. При необходимости выбора значений из нескольких форма автоматически формирует строки запросов для получения данных для выбора значения. Поля таблицы, которые не предназначены для редактирования форма делает нередактируемыми. При наличии в структуре таблицы БД комментария он используется в качестве заголовка для столбца.

usingSystem;

usingSystem.Data;

usingSystem.Data.Odbc;

usingSystem.Windows;

usingSystem.Windows.Forms;

usingSystem.Linq;


namespacewinOrders

{

publicpartial classfrmListManager :Form

{

privateOdbcDataAdapter adapter;

privateDataTable dt =newDataTable();

privateForm1 MainForm;
// Имя таблицы БД для отображения списка

publicstringTable {get;privateset;}


publicfrmListManager(stringtblName,Form1 mForm)

{

InitializeComponent();


MainForm =mForm;

bindingSource1.DataSource =dt;

Table =tblName.Trim();

this.Text =Table.GetSynonym();

// Получение информации о структуре таблицы

DataTable tableStructure =Table.TableStructure();
//«Linq-заклинания» для получения строки SQL запросов и параметров к ней

varSQLparams =tableStructure.AsEnumerable()// АдаптацияDataTable дляLinq

.Where(row =>row.GetName()!=«id»)// Нужнывсе, кроме«id»

.Select(row =>row.GetParameter());// "Превращение" вOdbcParameter

varSqlVars =

tableStructure.AsEnumerable()// АдаптацияDataTable дляLinq

.Where(row =>row.GetName()!=«id»)// Нужнывсе, кроме«id»

.Select(row =>" `"+row.GetName()+"` = ?")// Формирование переменной SQL-запроса

.Aggregate((a,b)=>a +", "+b);// Сборкаводнустроку


adapter =MySQL.GetAdapter(«select * from „+Table);

adapter.RowUpdated +=da_RowUpdated;// Подписка нужна для обновления поля id в dt

adapter.InsertCommand =

newOdbcCommand(“INSERT INTO „+Table +“ SET»+SqlVars,MySQL.Connection);

foreach(varrow inSQLparams)adapter.InsertCommand.Parameters.Add(row);

adapter.UpdateCommand =

newOdbcCommand(«UPDATE „+Table +“ SET»+SqlVars +

" WHERE id = ?",MySQL.Connection);

foreach(varrow inSQLparams)adapter.UpdateCommand.Parameters.Add(row);

adapter.UpdateCommand.Parameters.Add("@id",OdbcType.Int,,«id»);

adapter.DeleteCommand =

newOdbcCommand(«DELETE FROM „+Table +“ WHERE id = ?»,MySQL.Connection);

adapter.DeleteCommand.Parameters.Add("@id",OdbcType.Int,,«id»);

adapter.Fill(dt);


DataGridViewColumn dgvCol;

foreach(DataRow row intableStructure.Rows)

{

if(row.GetCol(«rTab»)=="")

{

if(row.GetCol(«Type»)==«tinyint»)// унасэтобулево

{

vartmpCol =newDataGridViewCheckBoxColumn();

tmpCol.DataPropertyName =row.GetName();

tmpCol.TrueValue =1;

tmpCol.FalseValue =;

tmpCol.AutoSizeMode =DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;


dgvCol =tmpCol;

}

else

{

vartmpCol =newDataGridViewTextBoxColumn();

tmpCol.DataPropertyName =row.GetName();


dgvCol =tmpCol;

}

}

else// Эта колонка — внешняя ссылка

{

vartmpCol =newDataGridViewComboBoxColumn();

tmpCol.DataPropertyName =row.GetName();

tmpCol.DataSource =newDataTable(row.GetCol(«rTab»));

tmpCol.ValueMember =row.GetCol(«rCol»);

tmpCol.DisplayMember =«Name»;

tmpCol.DisplayStyle =DataGridViewComboBoxDisplayStyle.Nothing;

MySQL.GetAdapter(«select `»

+row.GetCol(«rCol»)+"`, Name from "

+row.GetCol(«rTab»)).Fill((DataTable)tmpCol.DataSource);


dgvCol =tmpCol;

}

dgvCol.Name =row.GetName();


if(row.GetSynonym()!="")dgvCol.HeaderText =row.GetSynonym();

if(row.GetName()==«id»)

{// идентификатор редактировать нельзя

dgvCol.ReadOnly =true;

dgvCol.AutoSizeMode =DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;

}

dataGridView1.Columns.Add(dgvCol);

}


if(Table ==«users»)

{// Отсюда у пользователей можно поменять только полное наименование,

// добавлять/удалять, менять имя/пароль можно только через администратор БД

dataGridView1.AllowUserToAddRows =false;

dataGridView1.AllowUserToDeleteRows =false;

dataGridView1.Columns[«Name»].ReadOnly =true;

toolStripButton2.Visible =false;

}

}


voidda_RowUpdated(objectsender,OdbcRowUpdatedEventArgs e)

{

if(e.Errors ==null&&e.StatementType ==StatementType.Insert)

{// при добавлении новой строки автоинкрементное поле id

// само собой в гриде не появляется, надо его так «выковыривать»

e.Row[«id»]=MySQL.GetLastId().ToString();

}

}


privatevoidfrmListManager_FormClosed(objectsender,FormClosedEventArgs e)

{

MainForm.OpenWindows.Remove(Table);

}


privatevoidfrmListManager_Shown(objectsender,EventArgs e)

{

//connection.Open();

}


privatevoiddataGridView1_CellEndEdit(objectsender,DataGridViewCellEventArgs e)

{

if(dt.Rows.Count dataGridView1.Rows.Count)

{// Добавленастрокаилиячейка— чекбокс

if(dataGridView1[e.ColumnIndex,e.RowIndex]isDataGridViewCheckBoxCell)

{// какой-то странный глюк с чекбоксами

if(dt.Rows.Count (dataGridView1.Rows.Count-1))

{// Количество строк другое почему-то при добавлении

bindingSource1.EndEdit();

adapter.Update(dt);

}

elseif(dt.Rows[e.RowIndex][e.ColumnIndex].ToString()!=dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString())

{

bindingSource1.EndEdit();

adapter.Update(dt);

}

}

else

{

bindingSource1.EndEdit();

adapter.Update(dt);

}

}

elseif(dt.Rows[e.RowIndex][e.ColumnIndex].ToString()!=dataGridView1[e.ColumnIndex,e.RowIndex].Value.ToString())

{// Измененозначение

bindingSource1.EndEdit();

adapter.Update(dt);

}

}


privatevoidtoolStripButton2_Click(objectsender,EventArgs e)

{

DialogResult result =MessageBox.Show(«Вы действительно хотите удалить строку?»,

"Удаление",

MessageBoxButtons.OKCancel);

if(result ==DialogResult.OK)

{

dataGridView1.Rows.Remove(dataGridView1.CurrentRow);

adapter.Update(dt);

}

}

}

}


1.8Форма редактирования заявки покупателя
/>
1.9Форма редактирования заявки поставщику
/>

1.10Форма редактирования поступления товаров
/>
1.11Форма редактирования реализации товаров
/>


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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

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

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :

Реферат Отделение по выработке бисквитного полуфабриката
Реферат Роль и значение международных корпораций в мировом хозяйстве
Реферат Чем похож и непохож булгаковский дьявол на своих литературных предшественников?
Реферат Государственный кредит и возможности его использования
Реферат Персонал управления
Реферат Причины правонарушений и пути их устранения в РФ
Реферат Peter the Great
Реферат «Усадьба Кусково XVIII века» и Государственный музей керамики
Реферат «Глагол + ing»
Реферат Общеэкономическое значение рекламы Ее особенности в России
Реферат Family Relationships In Morrison
Реферат Административное право Украины
Реферат Роль максимальной андрогенной блокады в лечении больных раком предстательной железы
Реферат Совершенствование депозитной политики коммерческого банка
Реферат Технология и техника добывания лося в Магдагачинском районе Амурской области