Приложение № 2 к Техническому заданию на разработку информационной системы
Унифицированная форма № ТОРГ- 2
Утверждена постановлением Госкомстата
России от 25.12.98 г. № 132
Код | |||||||||||||||||||||||
Форма по ОКУД | 0330202 | ||||||||||||||||||||||
по ОКПО | |||||||||||||||||||||||
(организация, адрес, номер телефона) | |||||||||||||||||||||||
(структурное подразделение) | Вид деятельности по ОКДП | ||||||||||||||||||||||
Основание для составления акта | приказ, распоряжение | номер | |||||||||||||||||||||
(ненужное зачеркнуть) | дата | ||||||||||||||||||||||
Вид операции | |||||||||||||||||||||||
УТВЕРЖДАЮ Руководитель | |||||||||||||||||||||||
Номер документа | Дата составления | ||||||||||||||||||||||
А К Т | (должность) | ||||||||||||||||||||||
(подпись) | (расшифровка подписи) | ||||||||||||||||||||||
ОБ УСТАНОВЛЕННОМ РАСХОЖДЕНИИ ПО КОЛИЧЕСТВУ | “ | ” | г. | ||||||||||||||||||||
И КАЧЕСТВУ ПРИ ПРИЕМКЕ ТОВАРНО-МАТЕРИАЛЬНЫХ ЦЕННОСТЕЙ |
Место приемки товара
Настоящий акт составлен комиссией, которая установила: | “ | ” | г. |
по сопроводительным документам
(наименование, номер, дата)
доставлен товар. Документ о вызове представителя грузоотправителя, поставщика, производителя:
(ненужное зачеркнуть)
телеграмма, факс, телефонограмма, радиограмма | № | от “ | ” | г. | |||||||||||
(ненужное зачеркнуть) |
Грузоотправитель
(наименование, адрес, номер телефона)
Производитель
(наименование, адрес, номер телефона)
Поставщик
(наименование, адрес, номер телефона)
Страховая компания
(наименование, адрес, номер телефона)
Договор (контракт) на поставку товара № | от | “ | ” | г. | |||||||||
Счет-фактура № | от | “ | ” | г. | |||||||||
Коммерческий акт № | от | “ | ” | г. | |||||||||
Ветеринарное свидетельство (свидетельство) № | от | “ | ” | г. | |||||||||
Железнодорожная накладная № | от | “ | ” | г. |
Способ доставки | № | |||||||||||
(вид транспортного средства) | ||||||||||||
Дата отправления товара “ | ” | г. | ||||||||||
со станции (пристани, порота) отправления | ||||||||||||
(наименование) | ||||||||||||
или со склада отправителя товара | ||||||||||||
(наименование) |
ДАТА, ВРЕМЯ, ч. мин. | ||||||||
прибытия товара на станцию (пристань, порт) назначения | вскрытия вагона, автофургона, контейнера и других транспортных средств | выдачи товара организацией транспорта | доставки товара на склад организации-получателя | начала разгрузки | приемки товара | |||
начало | приостановление | возобновление | окончание | |||||
2-я страница формы № ТОРГ-2
Сведения о состоянии вагонов, автофургонов и т. д. Наличие, описание упаковочных ярлыков, пломб транспорта на отдельных местах (сертификатов, спецификаций в вагоне, контейнере) и отправительская маркировка
По сопроводительным транспортным документам значится:
Отметка об оплом бировании товара (груза), состояние пломб и содержание оттиска | Количество мест | Вид упаковки | Наименование товара (груза) или номера вагонов (контейнеров, авто фургонов и т.д.) | Единица измерения | Масса брутто товара (груза) по документам | Особые отметки отправителя по накладной | |
отправителя | транспортной организации (станции, пристани, порта) | ||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Сведения о состоянии вагонов, автофургонов и т.д. Наличие, описание установленных ярлыков, пломб транспорта на отдельных местах (сертификатов, спецификации в вагоне, контейнере)
фактически
Расхождение по количеству мест и массе в актируемой партии товара, обнаружен ные на складе товарополучателя | Количество мест | Масса, кг | Степень заполнения тарного места, вагона, контейнера и т.п. | ||
брутто | тара | нетто | |||
По документам грузоотправителя | |||||
Фактически поступило | |||||
Расхождение (+, -) |
Товар (наименование) | Номер места | Единица измерения | По документам поставщика значится | |||||
наименование | код по ОКЕИ | |||||||
артикул товара | сорт | количество (масса) | цена, руб. коп. | сумма, руб. коп. | ||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
3-я страница формы №ТОРГ-2
Условия хранения товара (продукции) до его вскрытия на складе получателя:
Сведения о температуре при разгрузке в вагоне (рефрижераторе и т.д.) в товаре, 0С
Состояние тары и упаковки, маркировка мест, товара и тары в момент внешнего осмотра товара (продукции)
Содержание наружной маркировки тары и другие данные, на основании которых можно сделать выводы о том, в чьей упаковке предъявлен товар (производителя или отправителя)
Дата вскрытия тары | “ | ” | г. |
Организация, которая взвесила и опломбировала отгруженный товар, исправность пломб и содержание оттисков, соответствие пломб товаросопроводительным документам
Порядок отбора товара (продукции) для выборочной проверки с указанием ГОСТ, особых условий поставки по договору (контракту), основание выборочной проверки:
Фактически оказалось | Брак | Бой | Отклонения | Номер паспорта | |||||||||
артикул товара | сорт | количество (масса) | цена, руб. коп. | сумма, руб. коп. | количество (масса) | сумма, руб. коп. | количество (масса) | сумма, руб. коп. | недостача | излишки | |||
количество (масса) | сумма, руб. коп. | количество (масса) | сумма, руб. коп. | ||||||||||
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
4-я страница формы №ТОРГ-2
Определение количества товара (продукции) проводилось
(взвешиванием, счетом мест, обмером и т. п.,
место определения количества товара (продукции))
Взвешивание товаров (продукции) проводилось на исправных весах, проверенных в установленном порядке. Сведение об исправности весоизмерительных приборов (тип весов, год клеймения)
Другие данные
По остальным товарно-материальным ценностям, перечисленным в сопроводительных документах поставщика, расхождений в количестве и качестве нет.
Подробное описание дефектов (характер недостачи, излишков, ненадлежащего качества, брака, боя) и мнение комиссии о причинах их образования
Заключение комиссии
Члены комиссии предупреждены об ответственности за подписание акта, содержащего данные, не соответствующие действительности.
Председатель комиссии | ||||||
(место работы, должность) | (подпись) | (расшифровка подписи) | ||||
Члены комиссии: | ||||||
(место работы, должность) | (подпись) | (расшифровка подписи) | ||||
(место работы, должность) | (подпись) | (расшифровка подписи) | ||||
(место работы, должность) | (подпись) | (расшифровка подписи) |
Представитель грузоотправителя (поставщика, производителя)
(место работы, должность) | (подпись) | (расшифровка подписи) |
Документ, удостоверяющий полномочия
№ | выдан “ | ” | г. | |||||||||||
Акт с приложением на | листах получил | |||||||||||||
Главный (старший) бухгалтер | ||||||||||||||
(подпись) | (расшифровка подписи) |
Решение руководителя
Приложение № 1 к Техническому заданию на разработку информационной системы
Унифицированная форма № ТОРГ-1
Утверждена постановлением Госкомстата
России от 25.12.98 г. № 132
Код | |||||||||
Форма по ОКУД | 0330201 | ||||||||
по ОКПО | |||||||||
(организация, адрес, номер телефона) | |||||||||
(структурное подразделение) | Вид деятельности по ОКДП | ||||||||
Номер | камера | ||||||||
секция | |||||||||
Основание для составления акта | приказ, распоряжение | номер | |||||||
(ненужное зачеркнуть) | дата | ||||||||
Вид операции |
УТВЕРЖДАЮ
Номер документа | Дата составления | Руководитель | |||||||||||||||
А К Т | (должность) | ||||||||||||||||
(подпись) | (расшифровка подписи) | ||||||||||||||||
о приемке товаров | “ | ” | г. | ||||||||||||||
Место приемки товара
Настоящий акт составлен комиссией, которая установила: | “ | ” | г. |
по сопроводительным документам
(наименование, номер, дата)
доставлен товар. Документ о вызове представителя | грузоотправителя, поставщика, производителя: | ||||||||||||||
(ненужное зачеркнуть) | |||||||||||||||
телеграмма, факс, телефонограмма, радиограмма | № | от | “ | ” | г. | ||||||||||
(ненужное зачеркнуть) |
Грузоотправитель
(наименование, адрес, номер телефона)
Производитель
(наименование, адрес, номер телефона)
Поставщик
(наименование, адрес, номер телефона)
Страховая компания
(наименование, адрес, номер телефона)
Договор (контракт) на поставку товара № | от | “ | ” | г. | |||||||||
Счет-фактура № | от | “ | ” | г. | |||||||||
Коммерческий акт № | от | “ | ” | г. | |||||||||
Ветеринарное свидетельство (свидетельство) № | от | “ | ” | г. | |||||||||
Железнодорожная накладная № | от | “ | ” | г. |
Способ доставки | № | ||
(вид транспортного средства) |
Дата отправления товара | “ | ” | г. |
со станции (пристани, порта) отправления
(наименование)
или со склада отправителя товара
(наименование)
Температура в толще мяса (рыбы) оС
Дата, время, ч. мин. | ||||
прибытия товара | приемки товара | |||
начало | приостановление | возобновление | окончание | |
2-я страница формы № ТОРГ-1
Товар | Катего-рия, сорт | Единица измерения | Цена, руб. коп. | По документам поставщика значилось | ||||||
наименование | код | наименование | код по ОКЕИ | количество | масса | стоимость, руб. коп. | ||||
в одном месте | мест, штук | брутто | нетто | |||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
1. | ||||||||||
Сертификат | ||||||||||
2. | ||||||||||
Сертификат | ||||||||||
тара | ||||||||||
тариф | ||||||||||
Итого |
Состояние товара, тары и упаковки в момент осмотра
Способ определения недостающего товара
Заключение о причинах и месте образования недостачи товара
3-я страница формы № ТОРГ-1
Фактически принято | Сумма с учетом НДС, руб. коп. | НДС | Отклонение (+, -) | |||||||||
количество | масса | стоимость, руб. коп. | ставка, % | сумма, руб. коп. | количество | масса | стоимость, руб. коп. | |||||
в одном месте | мест, штук | брутто | нетто | в одном месте | мест, штук | брутто | нетто | |||||
12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 0; border-right: 1px solid #000000; padding: 0in 0.02in;">24 |
Х | Х | Х |
4-я страница формы № ТОРГ-1
Все члены комиссии ознакомлены с правилами приемки товаров по количеству и качеству и предупреждены об ответственности за подписание акта, содержащего данные, не соответствующие действительности.
Правильность количества и качества товара подтверждаем:
Председатель комиссии | |||||
(место работы, должность) | (подпись) | (расшифровка подписи) |
Члены комиссии: | |||||
(место работы, должность) | (подпись) | (расшифровка подписи) |
(место работы, должность) | (подпись) | (расшифровка подписи) |
(место работы, должность) | (подпись) | (расшифровка подписи) |
Заключение комиссии
Представитель грузоотправителя (поставщика, производителя)
Документ, удостоверяющий полномочия
№ | выдан | “ | ” | г. |
(место работы, должность) | (подпись) | (фамилия, имя, отчество) |
Акт с приложением на | листах получил |
Главный (старший) бухгалтер | |||
(подпись) | (расшифровка подписи) |
“ | ” | г. |
Решение руководителя
Товар и тару на ответственное хранение принял
Заведующий складом (кладовщик) | |||
(подпись) | (расшифровка подписи) |
Приложение 1 к пояснительной записке
<ФИО>, 05-ПИЭ-622.
наименование организации – разработчика ТЗ на АС
УТВЕРЖДАЮ | |||
Руководительпредприятия - заказчика АС | |||
Личная подпись | Расшифровка подписи | ||
МП | |||
Дата |
УТВЕРЖДАЮ | |||
Руководительпредприятия - разработчика АС | |||
Личная подпись | Расшифровка подписи | ||
МП | |||
Дата |
Автоматизированная информационная система |
наименование вида АС |
«Оптовый продовольственный склад». |
наименование объекта автоматизации |
АИС «Подуктовый склад» |
сокращенное наименование |
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
На 12 листах
Киров 2010 г.
ОглавлениеОбщие сведения 2
Назначение и цели создания системы 2
Требования к системе 3
Состав и содержание работ по разработке системы. 11
Общие сведенияНаименование разработки: Автоматизированная информационная система «Оптовый продовольственный склад».
Условное обозначение системы: АИС «Продуктовый склад».
Разработчик: Полицын Алексей Николаевич, студент 5 курса Вечерне-заочного факультета Вятского Государственного университета, шифр: 05-ПИЭ-622.
Заказчик: кафедра информационных систем в экономике Вятского государственного университета.
Документ, на основании которого ведется разработка: задание на курсовую работу.
Организация, утвердившая документ: кафедра информационных систем в экономике Вятского государственного университета.
Дата утверждения: 08.10.2009 года.
Сроки выполнения работы: январь 2010 года.
Назначение и цели создания системыСистема предназначена для организации автоматизированной обработки следующих элементов учета:
Прием заявок от покупателей на поставку продовольственных товаров
Формирование заявок поставщикам на основании полученных заявок от покупателей
Учет текущих товарных остатков, отражение в учете прихода и расхода товарных ценностей.
Оформление актов несоответствия
Учет реализации товара покупателям и контроль своевременности и полноты оплаты.
Цели создания системы:
Возможность покупателя самостоятельно авторизироваться в информационной системе.
Возможность удаленной работы с системой.
Наличие гибко настраиваемых фильтров для учета пожеланий заказчиков.
Отражение состояний выполнения заявки покупателя.
Наличие автоматических алгоритмов, способных выбирать математически оптимальные варианты формирования заявок поставщикам и удовлетворения заявок покупателей.
Разделение прав доступа пользователей.
Требования к системе 1.1Требования к системе в целом 1.1.1Требования к структуре и функционированию системыСистема состоит из системы управления базы данных и клиентского приложения, работающего с ней.
1.1.2требования к численности и квалификации персонала системы и режиму его работыПерсонал системы – один оператор и неопределенное количество клиентов-покупателей. Требования к пользователям системы: элементарные навыки работы с операционной системой windows, минимальные знания в области информационной безопасности.
Режим работы с системой не регламентирован.
1.1.2.1степень приспособляемости системы к изменению процессов и методов управления, к отклонениям параметров объекта управленияВ случае изменения процессов и методов управления информационная система требует внесения соответствующих изменений в алгоритмы функционирования.
1.1.2.2допустимые пределы модернизации и развития системыТехнические пределы
Поскольку свободная лицензия MySQL предусматривает только некоммерческое использование системы, то для возможности сделать из решения платный продукт необходимо доработать её под другую СУБД.
Повышение эргономики, повышающей скорость ввода данных, то есть использование «горячих клавиш», автодополнения и т.д.
Логические пределы
Возможна реализация в системе учета аналогов продовольственной продукции для более полного удовлетворения потребностей покупателей.
1.1.2.3Вероятностно-временные характеристики, при которых сохраняется целевое назначение системы.С точки зрения экономической логики система не имеет временных ограничений своей функциональности.
1.1.3Требования к надежностиСистема должна обеспечивать целостность данных в базе, запрещать ввод недопустимых или нарушающих требования уникальности значений и иметь встроенные средства проверки логической и физической целостности база данных. Основной контроль входной и выходной информации возлагается на пользователя. Потенциально опасные действия пользователя должны сопровождаться предупреждениями вида “Вы уверены, что …?” и т.п. Необходимо создание системы подсказок, информирования об ошибках.
1.1.4Требования к безопасности.Обычный режим работы для автоматизированного рабочего места.
1.1.5Требования к эргономике и технической эстетике.Обычный режим работы для автоматизированного рабочего места.
1.1.6Требования к эксплуатации, техническому обслуживанию, ремонту и хранению компонентов системы.Необходимо обслуживание системы, обновление (при доработке) её компонентов.
1.1.7Требования к защите информации от несанкционированного доступа.Система должна иметь разграничение доступа в зависимости от должности сотрудника.
1.1.8Требования по сохранности информации при авариях.Сохранность должна быть обеспечена в случаях потери питания.
1.2Требования к функциям (задачам), выполняемым системой 1.2.1Общая схема функционирования программыРабота в системе проходит по следующим этапам:
1.2.1.1Регистрация заявокФункционирование начинается с аутентификации покупателя в системе. Покупатель вносит информацию о желаемом товаре.
1.2.1.2Принятие заявокМенеджер по закупкам принимает или отклоняет заявки покупателей, основываясь на истории закупок и оплат покупателя.
1.2.1.3Формирование заявок поставщикуМенеджер использует функции системы для автоматического формирования заявок поставщику.
1.2.1.4Отражение прихода от поставщикаМенеджер по закупкам вносит в систему информацию о полученном и принятом товаре
1.2.1.5Удовлетворение заявок покупателейОператор системы, контролируя наличие оплаты со стороны покупателей, оформляет документы по передаче товаров в адрес клиентов.
1.2.2Справочники и классификаторы 1.2.2.1ПользователиНеобходим для накопления информации о пользователях, зарегистрированных в системе и уровня доступа к автоматизированной информационной системе. Редактируется только администратором системы.
1.2.2.2ПоставщикиХранит необходимую для формирования печатных форм информацию о поставщиках. Кроме того, возможно хранение информации необходимой для выбора предпочтения.
1.2.2.3Виды характеристик товаровСодержит информацию о возможных характеристиках, используемых при выборе товаров. Включает наименование характеристики, тип содержащейся информации, длина значения и его точность.
1.2.2.4Виды товаровХранит обобщенные наименования продовольственных товаров.
1.2.2.5Характеристики видов товаровИспользуется для определения какие характеристики для какого вида товаров применимы.
1.2.2.6ТоварыСодержит полный перечень предоставляемых продуктов со ссылками на справочник поставщиков.
1.2.2.7Характеристики товаровХранит информацию о значениях характеристик
1.2.3Функции и задачи, решаемые системой 1.2.3.1Принятие заявки от покупателяЗаявка оформляется покупателем, в ней указываются идентификатор (код) заявки, дата формирования заявки, вид желаемого товара и его количество. Поля «код заявки» и «дата заявки» не редактируются. Кроме того, заявка содержит перечень условий по одному на каждый вид характеристики товара. Условие содержит название вида характеристики, значение условия и вид сравнения со значением характеристики. Покупатель имеет право выбора, какие из условий включать в заявку. Печатной формы документа не предусмотрено.
1.2.3.2Оформление заявки поставщикуДокумент содержит информацию о поставщике и дату формирования заказа. Таблично указывается перечень необходимых товаров и количество, которое необходимо заказать. Документ позволяет сформировать печатную форму заявки поставщику. Печатная форма представляет собой просто перечисление товаров с указанием количества. Форма не приводится по причине её примитивности.
1.2.3.3Оформление поступления товараДокумент прихода содержит информацию о поставщике, ссылку на заявку поставщику и дату оформления поступления, а также перечень поступивших товаров с указанием, количества, которое указано в документах поставщика, фактическом количестве поступившего товара, количестве принятого по качеству товара, цены, указанной в документах, и стоимости принятых товаров. Документ имеет возможность формирования двух печатных форм: ТОРГ-1 «Акт о приемке товара» и ТОРГ-2 «Акт об установленном расхождении по количеству и качеству при приемке товарно - материальных ценностей». Формы приведены в приложениях 1 и 2 соответственно.
1.2.3.4Оформление реализации товара покупателюВ документе указываются: наименование покупателя, дата формирования документа реализации, указывается статус оплаты от покупателя. В табличной части приводятся: перечень товаров, ссылки на заявки, которыми товар заказывался, количество, цена реализации, сумма реализации. Документ позволяет сформировать печатные формы ТОРГ-12 «Товарная накладная» и «Счет-фактуру». Формы приведены в приложениях 3 и 4.
1.3Требования к видам обеспечения. 1.3.1Информационное обеспечение системыИнформационное обеспечение системы составляют базы данных (БД) подсистем, функционирующих под управлением реляционной СУБД
1.3.2Лингвистическое обеспечение системыДиалог пользователя с системой должен осуществляться на русском языке.
1.3.3Программное обеспечение системыДля функционирования подсистемы необходимо следующее базовое программное обеспечение. Программное обеспечение клиентских рабочих мест: ОС MS Windows 2000/XP/Vista/7. Также необходимо наличие набора системных библиотек .NET Framework версии не ниже 3.5.
1.3.4Техническое обеспечение системыТехническое обеспечение подсистемы составляют:
источник бесперебойного питания;
рабочие станции (персональные компьютеры) с минимальными характеристиками, которые требует установленная операционная система.
принтеры;
устройства записи на внешние носители информации.
1.3.5Метрологическое обеспечение системыУчет всех значений, отвечающих за стоимость, цену производится в рублях, данные вводятся и предоставляются в виде чисел с двумя знаками после запятой.
Процент исполнения рассчитывается и предоставляется в пользователю в процентном формате (т.е. с указанием знака %) с одним знаком после запятой.
1.3.6Организационное обеспечение системыВ функционировании системы участвуют:
Зарегистрированные в системе покупатели
Менеджер по закупкам.
Администратор системы
Руководство фирмы
Состав и содержание работ по разработке системы.Стадии | Этапы работ | Срок исполнения |
1. Исследование и обоснование создания АС | 1.1. Обследование (сбор и анализ данных) автоматизированного объекта | |
1.2. Разработка и оформление требований к системе | ||
2. Техническое задание | 2.1. Научно-исследовательские работы | |
2.2. Разработка аванпроекта | ||
2.3. Разработка технического задания на АС в целом и, при необходимости, частных ТЗ на подсистемы АС | ||
3. Эскизный проект | 3.1. Разработка предварительных решений по выбранному варианту АС и отдельным видам обеспечения | |
4. Технический проект | 4.1. Разработка окончательных решений по общесистемным вопросам, в том числе по структурам АС (функциональной, организационной); процедурам (задачам), реализуемым системой; процессу функционирования системы и, при необходимости, выдача частных технических заданий на разработку видов обеспечения АС или видов обеспечения подсистемы АС | |
4.2. Разработка решений по организационному обеспечению, включая разработку плана мероприятий по подготовке к внедрению АС | ||
4.3. Разработка решений по техническому обеспечению | ||
4.4. Разработка или выбор алгоритмов автоматизируемой деятельности | ||
4.5. Разработка решений по информационному обеспечению | ||
4.6. Разработка решений по лингвистическому обеспечению | ||
4.7. Разработка решений по программному обеспечению | ||
4.8. Разработка решений по методическому обеспечению | ||
4.9. Разработка проектно-сметной строительной документации | ||
4.10. Согласование решений по связям видов обеспечения между собой и разработка общесистемной документации на АС в целом | ||
4.11. Составление заказной документации на поставляемые компоненты и комплексы средств автоматизации или технических заданий на их разработку | ||
5. Рабочая документация | 5.1. Разработка рабочей документации по информационному обеспечению | |
5.2. Разработка рабочей документации по организационному обеспечению | ||
5.3. Разработка рабочей документации по методическому обеспечению | ||
5.4. Разработка рабочей документации по лингвистическому обеспечению | ||
5.5. Разработка или адаптация программ и программной документации | ||
5.6. Разработка документации на технические средства разового изготовления | ||
5.7. Разработка проектно-сметной строительной документации | ||
6. Изготовление несерийных компонентов комплекса средств автоматизации (КСА) | 6.1. Изготовление компонентов КСА | |
6.2. Автономная отладка и испытание компонентов КСА | ||
7. Ввод в действие | 7.1. Подготовка организации к вводу АС в действие, обучение персонала пользователя | |
7.2. Строительно-монтажные работы | ||
7.3. Комплектация АС поставляемыми комплексами средств автоматизации, техническими средствами, программными средствами и др. | ||
7.4. Пуско-наладочные работы (комплексная отладка КСА) | ||
7.5. Проведение опытной эксплуатации АС | ||
7.6. Проведение приемочных испытаний (государственных, межведомственных или ведомственных) | ||
7.7. Устранение замечаний, выявленных при испытаниях АС | ||
7.8. Приемка АС в промышленную эксплуатацию (внедрение АС) |
12
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение высшегопрофессионального образования
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Вечерне-заочный факультет
Кафедра информационных систем в экономике
КУРСОВАЯ РАБОТА
по дисциплинам «Проектирование экономическихинформационных систем» и «Базы данных»
Автоматизированная информационная система«Оптовый продовольственный склад»
Пояснительная записка
Выполнил студент
группы ПИЭ _____<ШИФР>___________________ <ФИО> ______________
(шифр) (подпись) (дата)
Проверил преподаватель ________________________ <ФИО> ______________
(подпись) (дата)
Киров 2010 г.
ОглавлениеВведение 4
Обзор предметной области 5
Моделирование информационной системы 6
Техническое задание на создание информационной системы 13
Выбор программных средств разработки и реализации системы 14
Концептуальная модель базы данных 17
Пользовательский интерфейс информационной системы и исходные коды объектов 19
ВведениеЦель курсовой работы по предмету «Базы данных» - создание базы данных при помощи любой СУБД и разработка собственного приложения для работы с этой базой данных.
Цель курсовой работы по предмету «Проектирование информационных систем» - спроектировать и реализовать основные функции информационной системы в рабочем приложении.
Так как цели курсовых работ пересекающиеся, а выбор предметной области свободный, то решено сначала спроектировать систему методами и средствами, изученными на занятиях по предмету «Проектирование информационных систем», а затем создать структуру базы данных и информационную систему, работающую со спроектированной БД, как того требует задание по предмету «Базы данных».
Проектирование информационной системы осуществляется при помощи унифицированного языка моделирования 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 является самой важной частью приложения. Именно он определяет параметры для подключения к базе данных, само подключение и доступ к данным.
using System; using System.Data; using System.Data.Odbc; using System.Collections.Generic; namespace winOrders { static class MySQL { public static string Driver { get; set; } public static string Server { get; set; } public static int Port { get; set; } public static string User { get; set; } public static string Pass { get; set; } public static string Database { get; set; } public static OdbcConnection Connection { get; set; } public static Link CurrentUser { get; set; } public static string ConnectionString() {// Формирование строки подключения к БД return "DRIVER=" + Driver + ";" + "SERVER=" + Server + ";" + "PORT=" + Port.ToString() + ";" + "USER=" + User + ";" + "PASSWORD=" + Pass + ";" + "DATABASE=" + Database + ";" + "stmt=SET NAMES 'cp1251';OPTION=4;"; } public static OdbcConnection GetConnection() {// Формирование подключения к БД return new OdbcConnection(ConnectionString()); } public static DataTable TableStructure(this string TableName) { // Возвращает таблицу структуры таблицы базы данных по имени таблицы // простите за тавтологию :) var dt = new DataTable(); string SQLstring = @"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); return dt; } public static string GetSynonym(this string TableName) {// Определяет пользовательское представление таблицы БД по имени таблицы string SQLstring = @"SELECT LEFT(TABLE_COMMENT,LOCATE(';', TABLE_COMMENT)-1) FROM information_schema.`TABLES` where TABLE_SCHEMA = '"+Database+"' and TABLE_NAME = '"+TableName+"'"; string resultString = GetCommand(SQLstring).ExecuteScalar().ToString(); return resultString == "" ? TableName : resultString; } public static string GetSynonym(this string TableName, string ColumnName) {// Определяет пользовательское представление колонки таблицы БД string SQLstring = "SELECT COLUMN_COMMENT FROM information_schema.`COLUMNS`"+ "where TABLE_SCHEMA = '"+ Database+"'" +" and TABLE_NAME = '"+ TableName+"'" +" and COLUMN_NAME = '"+ ColumnName+"'"; string resultString = GetCommand(SQLstring).ExecuteScalar().ToString(); return resultString == "" ? ColumnName : resultString; } public static string GetSynonym(this DataRow row) {// Находит пользовательское представление клонки в строке таблицы структуры БД return row.GetCol("Synonym") == "" ? row.GetName() : row.GetCol("Synonym"); } public static OdbcType GetOdbcType(string TypeName) {// Определение типа данных по имени типа switch (TypeName) { case "int": return OdbcType.Int; case "varchar": return OdbcType.VarChar; case "tinyint": return OdbcType.TinyInt; case "date": return OdbcType.Date; case "datetime": return OdbcType.DateTime; default: return OdbcType.VarChar; } } public static OdbcType GetOdbcType(this DataRow row) {// Получение значения типа данных из строки таблицы структуры БД return GetOdbcType(row.GetCol("Type")); } public static int GetLenght(this DataRow row) {// Получение длины значения для колонки из строки талицы структуры БД return row.GetCol("Length") == "" ? 1 : int.Parse(row.GetCol("Length")); } public static string GetName(this DataRow row) {// получение поля "Name" // необходимо часто, поэтому выделено в отдельный метод return row.GetCol("Name"); } public static string GetCol(this DataRow row, string ColName) {// Получение колонки таблицы по имени с проверкой существования колонки if (row.Table.Columns.Contains(ColName)) return row[ColName].ToString(); else throw new Exception("Нет колонки "+ColName+"!"); } public static bool GetBoolCol(this DataRow row, string ColName) {// Конвертация tinyint в bool return row.GetCol(ColName) == "1" ? true : false; } public static int GetLastId() {// Получение последнего автоматически сгенерированного идентификатора return int.Parse(GetCommand("SELECT LAST_INSERT_ID()").ExecuteScalar().ToString()); } public static int GetId(this DataRow row) {// Получение поля "id" string id = row.GetCol("id").ToString(); return id=="" ? 0 : int.Parse(id); } public static OdbcParameter GetParameter(this DataRow row) {// Формирование параметра к запросу return new OdbcParameter("@" + row.GetName(), row.GetOdbcType(), row.GetLenght(), row.GetName()); } public static OdbcDataAdapter GetAdapter(string SQLstring) {// Получение дата-адаптера return new OdbcDataAdapter(SQLstring, Connection); } public static void Fill(this DataTable table, string SQLstring) {// заполнение таблицы данными на основе строки SQL запроса table.Clear(); GetAdapter(SQLstring).Fill(table); } public static OdbcCommand GetCommand(string SQLstring) {// Получение объекта OdbcCommand return new OdbcCommand(SQLstring, Connection); } public static bool TestConnection() {// Проверка соединения с БД bool result = true; try { Connection.Open(); } catch (Exception) { result = false; } return result; } public static List<Link> ToLinksList(this DataTable dt) {// Формирование списка ссылок из таблицы return new List<Link>(dt.AsEnumerable() .Select(r => new Link(dt.TableName, r.GetId(), r.GetName()))); } public static List<Link> GetLinkCollection(string tableName) {// Получение списка ссылок для выпадающих списков DataTable dt = new DataTable(tableName); dt.Fill("SELECT id, Name FROM "+tableName); return dt.ToLinksList(); } public static string ToMySQL(this DateTime date) {// Конвертация даты в строку формата MySQL return "'" + string.Format("{0:yyyy-MM-dd HH:mm:ss}", date) + "'"; } } } |
Прежде чем приводить исходные коды классов документов нужно сказать несколько слов о служебном классе Link. Так как для системы важна информация о идентификаторе объекта, на которого сослаться, а также название таблицы базы данных, а для пользователя наиболее важно представление, было принято решение сконцентрировать все эти три вещи в одной сущности. Метод ToString()необходим для нормального отображения экземпляра в контролах, с которыми осуществляется связь полей объектов типа Link. Кроме того для возможности упорядочивания необходима реализация интерфейса IComparable, а именно метода CompareTo(objectobj).
public class Link : IComparable { public string TableName { get; private set; } public int Id { get; set; } public string Name { get; set; } public Link(string tableName) { this.TableName = tableName; } public Link(string tableName, int id, string name) { this.TableName = tableName; this.Id = id; this.Name = name; } public Link(string tableName, int id) { this.TableName = tableName; this.Id = id; this.Name = MySQL.GetCommand("SELECT `Name` FROM `"+tableName+ "` WHERE `id` = '" + id + "'").ExecuteScalar().ToString(); } public Link(string tableName, DataRow row, string colPrefix) { this.TableName = tableName; this.Id = int.Parse(row.GetCol(colPrefix+"_id")); this.Name = row.GetCol(colPrefix + "_name"); } public override string ToString() { return this.Name; } public int CompareTo(object obj) { var other = obj as Link; int result = this.Name.CompareTo(other.Name); return result == 0 ? this.Id.CompareTo(other.Id) : result; } } |
Далее приведены исходные коды класса Operation и унаследованного от него класса OrderIn. Кроме того показан класс OrderInParameter. Класс заявки имеет в качестве одного из свойств типизированный список параметров.
public class Operation : IComparable { public DateTime Date { get; set; } public int Id { get; set; } public Operation() { this.Date = DateTime.Now; } public int CompareTo(object obj) {// Функция нужна для возможности упорядочивания var other = obj as Operation; int result = this.Date.CompareTo(other.Date); return result == 0 ? this.Id.CompareTo(other.Id) : result; } public virtual bool Save() { return true; } } |
public class OrderIn : Operation { public Link Client { get; set; } public float Count { get; set; } public int Status { get; set; } // Пока число, потом надо будет создать перечисление public List<OrderInParameter> Parameters { get; set; } private Link _good; public Link Good { get { return _good; } set { _good = value; GenerateNewParameters(); } } public OrderIn() { this.Client = MySQL.CurrentUser; } public OrderIn(int id) { var dt = new DataTable(); string SQLstring = @"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 > 0) { var row = dt.Rows[0]; this.Id = id; this.Date = DateTime.Parse(row.GetCol("date")); this.Client = new Link("users", row, "client"); // присваиваю приватному свойству для того, чтобы // геттер не генерил новые параметры _good = new Link("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); var parameters = dt.AsEnumerable() .Select(row => new OrderInParameter(this, row.GetId(), row.GetBoolCol("checked"), new Link("kcharacteristics", row, "char"), row.GetCol("equality"), row.GetCol("val"))); this.Parameters = new List<OrderInParameter>(parameters); } public void GenerateNewParameters() { var dt = new DataTable(); string SQLstring = @"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); var parameters = dt.AsEnumerable() .Select(row => new OrderInParameter(this, row.GetId(), row.GetBoolCol("checked"), new Link("kcharacteristics", row, "char"), row.GetCol("equality"), row.GetCol("val"))); this.Parameters = new List<OrderInParameter>(parameters); } public void OpenForm(Form1 mainForm) { frmOrderIn f; if (mainForm.OpenWindows.Contains(this.ToString())) { f = (frmOrderIn)mainForm.OpenWindows[this.ToString()]; f.Activate(); } else { f = new frmOrderIn(this, mainForm); mainForm.OpenWindows.Add(this.ToString(), f); f.Show(); } } public override string ToString() { return "Заявка клиента № "+this.Id.ToString() + " от " + this.Date.ToString(); } public override bool Save() { var command = MySQL.GetCommand( (this.Id == 0 ? "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 == 0 ? "" : ("WHERE id = " + this.Id + ""))); command.ExecuteNonQuery(); this.Id = this.Id == 0 ? MySQL.GetLastId() : this.Id; // Сначала удалить те характеристики, которые были со старым товаром, // а потом установить характеристики, которые должны описывать новый товар command.CommandText = "DELETE from orderinparameters WHERE idorder = '" + this.Id + "'"; command.ExecuteNonQuery(); if (this.Parameters.Count != 0) { var SQLvalues = (from par in Parameters 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(); } return true; } } public class OrderInParameter : IComparable { public int Id { get; set; } public OrderIn Order { get; set; } public bool Checked { get; set; } public Link Characteristic { get; set; } public object Val { get; set; } private string _equality; public string Equality { get { return _equality; } set { _equality = value == "" ? "=" : value; } } public OrderInParameter() { this.Checked = false; this.Equality = "="; } public OrderInParameter(OrderIn order) { this.Order = order; this.Checked = false; this.Equality = "="; } public OrderInParameter(OrderIn order, int id) { var dt = new DataTable(); string SQlstring = @"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 > 0) { var row = dt.Rows[0]; this.Id = id; this.Order = order; this.Checked = row.GetBoolCol("checked"); this.Characteristic = new Link("kcharacteristics", row, "char"); this.Equality = row.GetCol("equality"); this.Val = row.GetCol("val"); } } public OrderInParameter(OrderIn order, int id, bool check, Link characteristic, string equality, object val) { this.Id = id; this.Order = order; this.Checked = check; this.Characteristic = characteristic; this.Equality = equality; this.Val = val; } public int CompareTo(object obj) { var other = obj as OrderInParameter; int result = this.Characteristic.CompareTo(other.Characteristic); return result; } } |
Задача главной формы – отображать основную информацию на экране и позволять управлять подчиненными формами. Для того чтобы объекты форм не создавались несколько раз, необходимо чтобы главная форма хранила список открытых окон. В самом верху формы расположена панель инструментов, на которой пока одна гиперссылка, отображающая полное имя пользователя, который в данный момент работает с системой. При нажатии на неё, а также при входе в систему главная форма запрашивает пароль пользователя.
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; } |
На панель инструментов предполагается вывести кнопки, выполняющие общие функции для системы, но пока не известно что может понадобиться пользователю.
В верхней части формы расположены вкладки, позволяющие переключаться между функциями системы. Для экономии места вкладки представлены в виде изображений, характеризующих функции системы. В зависимости от уровня доступа пользователя изменяется набор отображаемых вкладок. Так, например, покупателю доступна только первая вкладка, на которой возможно лишь редактировать собственные заявки. Менеджеру по продажам доступны все вкладки кроме последней, предназначенной для администрирования. Администратору системы разрешён доступ ко всем вкладкам.
1.6.1Вкладка «Формирование заявок покупателя»С данной закладкой работает покупатель. Здесь отображаются только заявки текущего пользователя. Нижняя таблица отображает список допустимых фильтров. Здесь данные только отображаются, редактировать их нельзя. Для редактирования заявок существует отдельная форма. Конечно, удобней было бы редактировать данные прямо в списке, но это временное решение, так как пока не решена проблема с привязкой данных.
1.6.2Вкладка «Утверждение/отклонение заявок покупателя»Работая с этой вкладкой, менеджер по закупкам принимает решение о принятии заявки или об отказе от неё. Слева в верху находятся ссылки на отчеты, дающие информацию для принятия такого решения. Чуть ниже расположены ссылки для списка товаров и их характеристик. В верхней таблице отображается, сгруппированная по покупателям, информация о необработанных заявках. В нижней таблице находится расшифровка по каждой заявке. Здесь же приводится ориентировочная цена товара. Она берется из списка товаров и вычисляется как средняя между всеми товарами, соответствующими условиям, которые определены в заявке.
1.6.3Вкладка «Формирование заявок поставщику»В левой части данной вкладки отображается сгруппированная информация о заказанных товарах. Эта информация приводится справочно и необходима менеджеру для контроля за заказом товаров поставщику. В правой части формы вносятся заявки поставщику. Вверху – список заявок поставщикам, внизу их расшифровка. На панели инструментов кнопки добавить, редактировать и удалить необходимы для ручного управления заявками поставщику. Кнопка «Сформировать автоматически» формирует заявки поставщикам на основании заявок покупателей. Кнопкой «Пакетная печать» вызывается диалог, в котором можно выбрать заявки и распечатать все одновременно. Кнопкой Утвердить заявки меняется статус заявок поставщику и заявки покупателя. После данной операции ни ту ни другую менять уже нельзя.
1.6.4Вкладка «Учет поступления товаров»Здесь менеджер по продажам оформляет приход товара от поставщика. Слева в рамке располагаются ссылки на отчеты связанные с остатками товаров на складе.
1.6.5Вкладка «Учет реализации товара» 1.6.6Вкладка «Настройки системы» 1.6.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.7Форма редактирования списковФорма предназначена для отображения любых справочных сведений, содержащихся в базе данных. Информацию о структуре таблицы данных получает с помощью специального метода статического класса MySQL. Автоматически определяет ссылки на другие таблицы и сама определяет необходимый тип колонок для таблицы. На основании полученной структуры таблицы базы данных форма генерирует строки запросов для выборки, вставки исправления и удаления данных в таблице БД. При необходимости выбора значений из нескольких форма автоматически формирует строки запросов для получения данных для выбора значения. Поля таблицы, которые не предназначены для редактирования форма делает нередактируемыми. При наличии в структуре таблицы БД комментария он используется в качестве заголовка для столбца.
using System; using System.Data; using System.Data.Odbc; using System.Windows; using System.Windows.Forms; using System.Linq; namespace winOrders { public partial class frmListManager : Form { private OdbcDataAdapter adapter; private DataTable dt = new DataTable(); private Form1 MainForm; // Имя таблицы БД для отображения списка public string Table { get; private set; } public frmListManager(string tblName, Form1 mForm) { InitializeComponent(); MainForm = mForm; bindingSource1.DataSource = dt; Table = tblName.Trim(); this.Text = Table.GetSynonym(); // Получение информации о структуре таблицы DataTable tableStructure = Table.TableStructure(); //"Linq-заклинания" для получения строки SQL запросов и параметров к ней var SQLparams = tableStructure.AsEnumerable() // Адаптация DataTable для Linq .Where(row => row.GetName() != "id") // Нужны все, кроме "id" .Select(row => row.GetParameter()); // "Превращение" в OdbcParameter var SqlVars = 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 = new OdbcCommand("INSERT INTO " + Table + " SET" + SqlVars, MySQL.Connection); foreach (var row in SQLparams) adapter.InsertCommand.Parameters.Add(row); adapter.UpdateCommand = new OdbcCommand("UPDATE " + Table + " SET" + SqlVars + " WHERE id = ?", MySQL.Connection); foreach (var row in SQLparams) adapter.UpdateCommand.Parameters.Add(row); adapter.UpdateCommand.Parameters.Add("@id", OdbcType.Int, 0, "id"); adapter.DeleteCommand = new OdbcCommand("DELETE FROM " + Table + " WHERE id = ?", MySQL.Connection); adapter.DeleteCommand.Parameters.Add("@id", OdbcType.Int, 0, "id"); adapter.Fill(dt); DataGridViewColumn dgvCol; foreach (DataRow row in tableStructure.Rows) { if (row.GetCol("rTab") == "") { if (row.GetCol("Type") == "tinyint") // у нас это булево { var tmpCol = new DataGridViewCheckBoxColumn(); tmpCol.DataPropertyName = row.GetName(); tmpCol.TrueValue = 1; tmpCol.FalseValue = 0; tmpCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; dgvCol = tmpCol; } else { var tmpCol = new DataGridViewTextBoxColumn(); tmpCol.DataPropertyName = row.GetName(); dgvCol = tmpCol; } } else // Эта колонка - внешняя ссылка { var tmpCol = new DataGridViewComboBoxColumn(); tmpCol.DataPropertyName = row.GetName(); tmpCol.DataSource = new DataTable(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; } } void da_RowUpdated(object sender, OdbcRowUpdatedEventArgs e) { if (e.Errors == null && e.StatementType == StatementType.Insert) {// при добавлении новой строки автоинкрементное поле id // само собой в гриде не появляется, надо его так "выковыривать" e.Row["id"] = MySQL.GetLastId().ToString(); } } private void frmListManager_FormClosed(object sender, FormClosedEventArgs e) { MainForm.OpenWindows.Remove(Table); } private void frmListManager_Shown(object sender, EventArgs e) { //connection.Open(); } private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (dt.Rows.Count < dataGridView1.Rows.Count) { // Добавлена строка или ячейка - чекбокс if (dataGridView1[e.ColumnIndex, e.RowIndex] is DataGridViewCheckBoxCell) { // какой-то странный глюк с чекбоксами if (dt.Rows.Count < (dataGridView1.Rows.Count-1)) { // Количество строк другое почему-то при добавлении bindingSource1.EndEdit(); adapter.Update(dt); } else if(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); } } else if (dt.Rows[e.RowIndex][e.ColumnIndex].ToString() != dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString()) { // Изменено значение bindingSource1.EndEdit(); adapter.Update(dt); } } private void toolStripButton2_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show("Вы действительно хотите удалить строку?", "Удаление", MessageBoxButtons.OKCancel); if (result == DialogResult.OK) { dataGridView1.Rows.Remove(dataGridView1.CurrentRow); adapter.Update(dt); } } } } |