Главная страница

Автоматизированная информационная система Оптовый продовольственный склад. 1. Курсовая - ПЭИС. Курсовая работа по дисциплинам Проектирование экономических информационных систем иБазы данных


Скачать 0.82 Mb.
НазваниеКурсовая работа по дисциплинам Проектирование экономических информационных систем иБазы данных
АнкорАвтоматизированная информационная система Оптовый продовольственный склад
Дата19.05.2021
Размер0.82 Mb.
Формат файлаdoc
Имя файла1. Курсовая - ПЭИС.doc
ТипКурсовая
#206993
страница6 из 7
1   2   3   4   5   6   7

6.3Главная форма приложения


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



private void btnOK_Click(object sender, EventArgs e)

{

string oldUser = MySQL.User;

string oldPass = 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;

}

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

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

6.3.1Вкладка «Формирование заявок покупателя»




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

6.3.2Вкладка «Утверждение/отклонение заявок покупателя»




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

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




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

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




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

6.3.5Вкладка «Учет реализации товара»



6.3.6Вкладка «Настройки системы»



6.3.7Исходный код главной формы


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

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

public partial class Form1 : Form

{

public IDictionary OpenWindows { get; private set; }
public Form1()

{

InitializeComponent();

this.OpenWindows = new Dictionary<string, Form>();
}

***

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

private void OpenList(string TableName)

{

frmListManager list;

if (OpenWindows.Contains(TableName))

{

list = (frmListManager)OpenWindows[TableName];

list.Activate();

}

else

{

list = new frmListManager(TableName, this);

OpenWindows.Add(TableName, list);

list.Show();

}

}
private void lnkUsers_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)

{

OpenList("users");

}

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

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

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

public void UpdateOrders()

{

var dt = new DataTable();

string SQLstring =

@"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);
var parameters = from row in dt.AsEnumerable()

select new

{

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")

};

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

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

var orders = from param in parameters

group param by new

{

id = param.idorder,

date = param.date,

good = param.good,

count = param.count,

status = param.status

} into ord

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

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

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 запрос здесь на порядок сложнее предыдущего. В нём используется вложенность, группировка и агрегатные функции.


public void UpdateFoldOrders()

{

var dt = new DataTable();

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

var SQLstring =

@"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 в анонимный тип для облегчения доступа

var orders = from row in dt.AsEnumerable()

select new

{

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"))

};

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

var clients = from order in orders

group order by order.client into gr

select new

{

client = gr.Key,

kol = gr.Count(),

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

orders = gr

};

bsOrderInOnClients.DataSource = clients;

}

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


написать администратору сайта