Разработка автоматизированной системы для магазина автозапчастей

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    878,81 Кб
  • Опубликовано:
    2017-07-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка автоматизированной системы для магазина автозапчастей

Оглавление

Введение

. Аналитический обзор разработки АСУ

.1 Постановка задачи

.2 Основные понятия и определения

.3 Общее описание разрабатываемой АСУ

.4 Анализ существующих АСУ

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

. Разработка базы данных для системы

.1 Анализ и выбор СУБД

.1.1 SQLite

.1.2 MySQL

.1.3 PostgreSQL

.2 Построение концептуальной (инфологической) модели БД

.3 Построение логической схемы БД

. Разработка клиентского приложения

.1 Выбор языка и среды программирования

.2 Требования к клиентскому приложению

.2.1 Требования к интерфейсу

.2.2 Требования к функционалу

.3 Проектирование клиентского приложения

.3.1 Архитектура

.3.2 Выделение компонентов

.3.3 Выбор шаблонов проектирования

.3.4 UML диаграмма классов с учетом выбранных шаблонов

.3.5 Построение блок-схем алгоритмов подпрограмм

. Разработка сайта

.1 Общие сведения по разработке сайта

.2 Выбор языков программирования

.2.1 HTML

.2.2 CSS

.2.3 PHP

.2.4 SQL

.3 Структура сайта

.4 Дизайн сайта

.4.1 Слайдер Slick

. Тестирование АСУ

.1 Тестирование клиентского приложения

.1.1 Страница авторизации

.1.2 Страница «Информация»

.1.3 Заказы. Перевод в поставки

.1.4 Поставки. Установка цены продажи на товар

.1.5 Тестирование продажи товара

.1.6 Тестирование отмены продажи товара

.1.7 Тестирование отчётов

.1.8 Тестирование анализа продаж товаров

.1.9 Тестирование функции «Остатки»

.1.10 Тестирование подпрограммы для работы с пользователями сайта

.2 Тестирование сайта

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

.2.2 Правильность выполнения SQL-запросов к БД

.2.3 Тестирование слайдера «Slick»

. Внедрение продукта в производство

Заключение

Список использованных источников

Приложения

Введение

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

)        Сокращение численности персонала;

)        Увеличение продукции;

)        Повышение качества производства;

)        Ускорение работы персонала;

)        Снижение расходов сырья;

)        Повышение безопасности;

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

1. Аналитический обзор разработки АСУ

 

1.1 Постановка задачи


Определим задачи, которые нужно решить для достижения поставленной цели:

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

.        Выявить основные информационные потоки предприятия.

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

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

.        Улучшение эргономики труда операторов процесса.

.        Выбрать способы и средства для разработки программного обеспечения.

.        Выдвинуть требования к программному продукту.

.        Разработать ПО согласно выдвинутым требованиям.

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

 

1.2 Основные понятия и определения


Информационная система (ИС) - система, главными задачами которой являются хранение, распространение, поиск и обработка информации.

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

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

 

1.3 Общее описание разрабатываемой АСУ


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

 

1.4 Анализ существующих АСУ


В ходе выполнения работы был проведен анализ уже существующих АСУ с требуемым функционалом. Существует несколько аналогов подобной системы:- сервис, который имеет функционал, схожий с разрабатываемым ПП, имеет достаточно удобный интерфейс[1]. Недостатки: высокая стоимость использования. Интерфейс представлен на рисунке 1.1 [1].

Рисунок 1.1. Интерфейс web сервиса «CloudShop»

Retail - Сервис, который имеет очень большой функционал по работе с клиентами, поставщиками, товарами и т.д., построен за счет интересных идей с использованием новейших алгоритмов. Но имеет такие недостатки: высокая стоимость использования, а также невозможность работы с локальной БД, а основным хранилищем является облако. Это безусловно удобно, но я считаю, что это небезопасно. Интерфейс представлен на рисунке 1.2 [2]

Рисунок 1.2. Интерфейс программы «ABM Retail»

Еще одной из похожих АСУ является 1С, но, к сожалению, имеет высокую стоимость, что не устраивает заказчика [3].

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

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

 

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


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

Магазин предназначен для продажи автозапчастей, как новых, так и Б/У, автомобильной электроники, аккумуляторов, аксессуаров и т.д. Не имеет филиалов. Покупатель проходит стандартную процедуру покупки товара, приходя в магазин. Если потенциальный покупатель находится достаточно далеко и не имеет возможности прийти в магазин, но запчасти, которые он хочет купить есть на складе магазина, клиент может зарезервировать их на срок в три дня, после чего сможет выкупить зарезервированный товар, назвав продавцу свой логин на сайте [8].

АСУ предполагает три роли пользователей: администратор, продавец, пользователь сайта.

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

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

Пользователи сайта могут просматривать ассортимент товара и резервировать выбранные товары на срок в три дня.

2. Разработка базы данных для системы

 

2.1 Анализ и выбор СУБД

Для хранения данных, которыми пользователи смогут манипулировать в будущем, понадобится база данных. Поэтому нужно произвести обзор существующих СУБД. По требованиям заказчика в обзоре будет участвовать только бесплатное ПО [4].

 

2.1.1 SQLite

Эта система достаточно просто встраивается в приложения. Базируется на файлах и имеет большое количество различных инструментов для работы с БД. Данные хранятся в файлах и обращение происходит непосредственно к ним. Поэтому SQLite работает достаточно быстро и ее можно назвать достаточно мощной из-за множества библиотек. Преимущества SQLite:

.        Файловая структура. Легко переносится на разные ПК, потому что БД состоит из одного файла.

.        Используемые стандарты. Используются стандарты SQL.

.        SQLite предлагает всё что необходимо для тестирования и разработки, так как состоит всего из одного файла и библиотеки написанной на языке C. Недостатки SQLite:

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

.        Невозможно увеличить производительность.

 

2.1.2 MySQL

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

.        Простота в работе. Имеет достаточно простую установку, понятный интерфейс.

.        Богатый SQL - функционал.

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

.        Отлично работает с большими объемами данных, также хорошо масштабируется.

.        Увеличена производительность за счёт упрощения некоторых стандартов. Недостатки MySQL:

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

.        Невысокая надёжность БД.

.        Медленная разработка - Хотя MySQL технически открытое ПО, существуют жалобы на процесс разработки.

 

2.1.3 PostgreSQL

Данная СУБД считается самой профессиональной по сравнению с СУД, рассмотренными выше. Свободно распространяется, максимально соответствует SQL - стандартам. От других СУБД PostgreSQL отличается поддержкой востребованного объектно-ориентированного и/или реляционного подхода к базам данных. Например, полная поддержка надежных транзакций, т.е. атомарность, последовательность, изолированность, прочность. Данная СУБД имеет высокую производительность из-за применения мощных технологий. Параллельность достигнута не за счет блокировки операций чтения, а благодаря реализации управления многовариантным параллелизмом (MVCC), что также обеспечивает соответствие ACID. PostgreSQL очень легко расширять своими процедурами, которые называются хранимые процедуры. Достоинства PostgreSQL:

.        Открытое ПО соответствующее стандарту SQL - PostgreSQL - бесплатное ПО с открытым исходным кодом. Эта СУБД является очень мощной системой.

.        Большое сообщество - существует довольно большое сообщество в котором вы запросто найдёте ответы на свои вопросы

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

.        Расширения - существует возможность расширения функционала за счет сохранения своих процедур.

.        Объектность - PostrgreSQL это не только реляционная СУБД, но также и объектно-ориентированная с поддержкой наследования и много другого.

Недостатки PostgreSQL:

1.      Производительность - при простых операциях чтения PostgreSQL может значительно замедлить сервер и быть медленнее своих конкурентов, таких как MySQL

.        Популярность - по своей природе, популярностью эта СУБД похвастаться не может, хотя и присутствует довольно большое сообщество.

.        Хостинг - в силу выше перечисленных факторов иногда довольно сложно найти хостинг с поддержкой этой СУБД.

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

 


2.2 Построение концептуальной (инфологической) модели БД


Рисунок 2.1. Концептуальная модель БД

 

2.3 Построение логической схемы БД


Создадим базу данных «Autorun». В общем случае понадобятся таблицы: клиенты, пользователи клиентского приложения (users), пользователи сайта (users1), товары, поставщики, поставки, заказы, продажи, резервирование. Модель представлена на рисунке 2.2. Отмечу, что в базе данных присутствует избыточность полей в некоторых таблицах. Это сделано в целях повышения быстродействия выполнения запросов.

Рисунок 2.2. Логическая модель БД

3. Разработка клиентского приложения

 

3.1 Выбор языка и среды программирования


Для разработки продукта необходимо определиться с языком программирования и выбрать среду. Исходя из требований заказчика, локальное приложение будет предназначено для платформы Windows 10 и выше. Определившись с платформой, на которой будет функционировать будущий продукт, из существующих сред программирования для Windows выбор падает в сторону самой качественной и в то же время бесплатной среды программирования Microsoft Visual Studio 2015 Community. Между языками С# и С++ я склоняюсь к разработке приложения именно на языке С++, т.к. это очень мощный инструмент для разработки ПО и мне как разработчику более близок, нежели С#, который несомненно также является очень мощным ЯВУ [8].

 

3.2 Требования к клиентскому приложению

 

3.2.1 Требования к интерфейсу

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

1.      функциональность (соответствие задачам пользователя);

.        понятность и логичность;

.        обеспечение высокой скорости работы пользователя;

.        обеспечение защиты от ошибок человеческого фактора;

.        быстрая обучаемость пользователя;

.        В цветовой гамме интерфейса сайта и клиентского приложения должны преобладать темные тона;

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

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

Для всей текстовой составляющей приложения (кроме таблиц с выводом данных из БД) будет установлен шрифт Century Gothic. Красные цвета кнопок будут означать отмену/удаление, зеленые будут означать сохранение/применение, светло - серые кнопки будут означать добавление единиц товара к имеющемуся на складе количеству, установку цены на товар, а кнопки белого цвета будут вызывать функции по работе с формой (изменение размера формы, появление некоторых пунктов на форме). Таким образом пользователь быстро поймёт логику распределения цветов в интерфейсе приложения.

 

3.2.2 Требования к функционалу

К основным функциональным требованиям системы можно отнести:

1.      Работа с таблицами БД через клиентское приложение.

.        Автоматическое формирование отчетности работы магазина за определенный промежуток времени.

.        Разграничение доступа к информации работникам.

.        Возможность резервирования товара пользователями сайта.

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

 

3.3 Проектирование клиентского приложения

 

3.3.1 Архитектура

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

Локальное приложение написано на языке С++ в среде программирования Visual Studio 2015 Community.

Для хранения данных понадобится база данных MySQL и сервер OpenServer.

Таким образом, архитектуру АСУ можно представить в виде схемы, изображенной на рисунке 3.1.

Рисунок 3.1. Архитектура АСУ

 

3.3.2 Выделение компонентов

1.      Form1 - форма авторизации пользователя. Программный код приведён в приложении 1.

2.      Form2 - Форма, содержащая большое количество методов для осуществление разного рода манипуляций над данными из БД. Программный код приведён в приложении 2.

3.      ConnToDB - класс, содержащий данные о подключении к БД (Singleton).

Программный код приведён в приложении 3.

4.      DateAdapter - класс, основной и единственной функцией которого является преобразование формата даты из удобного для пользователя в формат сервера MySQL. Программный код приведен в приложении 4.

5.      Command - класс, содержащий методы для реализации команд браузера (execute, undo, redo). Программный код приведён в приложении 5.

3.3.3 Выбор шаблонов проектирования

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

1.      Singleton - используется для работы с единственным экземпляром строки соединения с БД, а также для уменьшения объема кода.

2.      Command - используется для выполнения команд во встроенном браузер (execute, undo, redo).

3.      Adapter - используется для работы с датами, чтобы выводить пользователю в удобном для него формате, а отправлять в БД в формате MySQL.

 

 


3.3.4 UML диаграмма классов с учетом выбранных шаблонов


Рисунок 3.2. Диаграмма классов UML

3.3.5 Построение блок-схем алгоритмов подпрограмм

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

Рисунок 3.3. Общая блок - схема клиентского приложения

Разберем подробно две блок - схемы, приведенные на рисунке 3.4. Сначала пользователь вводит логин и пароль, после чего они проверяются. Если данные для авторизации не верны, то выведется сообщение: «Данные введены неверно! Повторите ввод», в противном случае перейдём к главной странице приложения, к странице продажи товара. При продаже товара продавец может выбрать зарегистрированного покупателя, также может продавать товары анонимным покупателям, производит выбор товара, после чего нажимает кнопку «Продать». После нажатия этой кнопки происходит следующее:

)        Со склада вычитается проданное количество выбранного товара

)        В таблицу БД «Продажи», в поле «Выручка» заносится разность стоимости закупки, умноженной на проданное количество и стоимости продажи, умноженной на количество

)        Далее данные об этой продаже заносятся в БД

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

Рисунок 3.4. Блок-схемы алгоритмов авторизации и продажи товара

На рисунке 3.5 видим, что сначала пользователю предстоит выбрать промежуток времени для анализа с помощью стандартного элемента dateTimePicker. После выбора конца периода выполняются два запроса к БД:

.        Вывод ТОП - 5 самых хорошо продаваемых товаров:

.1.1.  "select Назв_товара,Брэнд,sum(Количество) as 'Продано ед.' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "' group by Назв_товара,Брэнд order by sum(Количество) limit 5;"

.1.2.  Вывод ТОП - 5 самых плохо продаваемых товаров:

.        "select Назв_товара,Брэнд,sum(Количество) as 'Продано ед.' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "' group by Назв_товара,Брэнд order by sum(Количество) desc limit 5;"

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

Рисунок 3.5. Блок-схема алгоритма анализа продаж товаров

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

Рисунок 3.6. Блок - схема алгоритма функции «Отчёты»

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

Рисунок 3.7. Блок - схема алгоритма работы с клиентами сайта

 


4. Разработка сайта

 

4.1 Общие сведения по разработке сайта


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

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

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

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

4.2 Выбор языков программирования

 

4.2.1 HTML

HyperText Markup Language - стандартный язык для веб-браузеров для интерпретации информации из интернета. Является языком разметки. Все форматирование текста, изображения, цвета, фоны, создания ссылки и т.д. это делается в HTML.

 

4.2.2 CSS

Cascading Style Sheets - каскадные таблицы стилей. Является формальным языком описания внешнего вида документа, написанного с использованием языка разметки.

 

4.2.3 PHP

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

 

4.2.4 SQL

Является языком для общения с базами данных, который используется в сочетании с PHP для доступа и размещения веб-контента. SQL является бесплатным для персонального пользователя, и использует команды, которые на самом деле логичны при создании и доступа к содержимому. JavaScript - мультипарадигменный язык программирования. Поддерживает объектно-ориентированный, императивный и функциональный стили. Применяется в браузерах как язык сценариев для придания интерактивности веб-страницам.

4.3 Структура сайта


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

Рисунок 4.1. Структура сайта

 

4.4 Дизайн сайта


Также исходя из дизайна логотипа магазина и требований заказчика принято, что дизайн будет исключительно в тёмных тонах, как и клиентское приложение, входящее в состав разрабатываемой АСУ. Главными цветами будут: чёрный, небесный, красный, белый и мягкий зелёный. Чёрный цвет меню и тёмные фоны страниц сайта будут фундаментом дизайна, небесным голубым цветом будут подсвечиваться пункты меню при наведении, красным цветом будет подсвечиваться кнопка выхода из аккаунта при наведении, а мягким зелёным цветом будут подсвечиваться при наведении кнопки резервирования товара и вход в личный кабинет. Шаблоны страниц сайта будут иметь стандартную структуру - «шапка - контент - подвал». Анимация на страницах сайта, установленная с помощью JQuery(Animate), будет обязательно легкой, чтобы не раздражать пользователя. Цвет текста на сайте, в зависимости от фона активного объекта будет черный или белый. На все объекты сайта установлен достаточно приятный и компактный шрифт «Century Gothic». Под шапкой сайта будет располагаться слайдер «Slick».

 

4.4.1 Слайдер Slick

Slick slider - это плагин, который написан на языке JavaScript с применением библиотеки JQuery, имеющий множество возможностей по созданию слайдера любой сложности. Его функционал позволяет реализовывать зацикливание, автоматическое проигрывание, эффект перехода, динамическое добавление слайдов и многое другое. Также есть возможность пролистывания слайдера пальцем на мобильных устройствах, что является очень современным и удобным для пользователя решением.

программирование шаблон клиентский слайдер

5. Тестирование АСУ


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

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

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

 

5.1 Тестирование клиентского приложения


Для удобства понадобится некий план тестирования. Первым делом нужно протестировать функции, отвечающие за добавление, поиск, удаление данных из таблиц БД (вкладка «Информация»). В данном пункте выделим объекты с одинаковым функционалом, и сгруппируем в один целый пункт плана (клиенты, товары, поставщики, продажи, пользователи). Обозначим данную группу для идентификации «Группа 1». Каждый из этих объектов, безусловно, будет протестирован, но для демонстрации представим один из объектов. Объекты «Заказы» и «Поставки» в данную группу не входят, т.к. их нужно рассматривать отдельно из-за дополнительного функционала (перевод из заказов в поставки в объекте «Заказы» и установка цены на товар в объекте «Поставки»). Таким образом, получим план тестирования:

.        Страница авторизации

.        Страница «Информация»

.1.     Группа 1

.2.     Заказы

.3.     Поставки

.        Страница «Продажа»

.1.     Регистрация нового покупателя

.2.     Продажа какого - то товара

.3.     Быстрый поиск более дешёвого товара

.        Страница «Отчёты»

.        Страница «Анализ продаж»

.1.     Установка скидки, проверка

.        Остатки

.        Страница «Сайт»

 

5.1.1 Страница авторизации

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

Рисунок 5.1. Тестирование авторизации

 

5.1.2 Страница «Информация»

Для демонстрации возьмем за основу объект «Товары».

Добавим некоторый товар в БД. Пример приведен на рисунке 5.2.

Рисунок 5.2. Тестирование добавления нового товара

Код_товара = 19 для новой запчасти. Теперь добавим к последнему занесенному товару пять единиц. На рисунке 5.3. видно, что пользователь ввел значение 19 в поле «Код товара» и значение 5 в поле «Остаток шт». В итоге на складе стало 8 единиц товара «Двери передние» для автомобиля «Nissan Almera Classic».

Рисунок 5.3. Тестирование добавления товара к существующему

Удалим товар «Моторное масло Mobil 1» из БД. Сначала произведем поиск товара по брэнду (Рисунок 5.4), затем удалим его по коду (Рисунок 5.5). Если поля не будут заполнены, то будет выведено соответствующее сообщение

Рисунок 5.4. Тестирование поиска товара

Код товара известен, он равен 1. Введем данный код в поле «Код товара», после чего нажмем на кнопку «Удалить». На рисунке 18 видно, что товары начинаются уже со второго кода после того, как мы удалили товар с идентификатором = 1. То есть данная функция работает корректно.

Рисунок 5.5. Тестирование удаления товара

 

5.1.3 Заказы. Перевод в поставки

Допустим, что в магазин пришло два ранее заказанных руля для автомобиля Ferrarri FF. Чтобы перевести пришедший на склад товар в поставки, нужно узнать код товара, ввести его в соответствующее поле и нажать на кнопку «Перевести в поставки», после чего выведется информация о товаре. Нажимаем на кнопку «Инф. верна, перевести», и товар оказывается в поставках. Результат показан на рисунке 5.6.

Рисунок 5.6. Тестирование перевода товара из заказов в поставки

 

5.1.4 Поставки. Установка цены продажи на товар

После перевода из заказов у товара есть только цена заказа. Администратор рассчитывает наценку и добавляет к товару цену продажи следующим образом (Рисунок 5.7).

Рисунок 5.7. Тестирование установки цены продажи на товар

5.1.5 Тестирование продажи товара

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

Занесем Смирнова Дмитрия Александровича как нового покупателя в БД прямо со страницы продажи. Данная функция сработала корректно. Теперь можно совершить продажу на имя нашего нового клиента (Рисунок 5.8).

В процессе заполнения полей при продаже можно заметить, что кнопка «Продать» становится активной только после заполнения всех полей и расчёта суммы продажи. Это сделано для того, чтобы все поля были заполнены, а расчеты для последующих экономических учетов и анализов были максимально точными, без потерь. В целях хранения исключительно адекватных данных установлены запреты на ввод не подходящих по смыслу символов (Например, в поле «Номер телефона» нельзя вводить буквы, а в поле «Ф.И.О.» нельзя вводить цифры).

Рисунок 5.8. Тестирование продажи товара новому покупателю

После нажатия на кнопку «Продать», происходит следующее:

)        Со склада вычитается проданное количество выбранного товара

)        В таблицу БД «Продажи», в поле «Выручка» заносится разность стоимости закупки, умноженной на проданное количество и стоимости продажи, умноженной на количество

)        Далее данные об этой продаже заносятся в БД

После этого проверены таблицы БД, где убедились, что функция сработала корректно.

 

5.1.6 Тестирование отмены продажи товара

После отмены продажи товара (Рисунок 5.9) должно произойти следующее:

)        Проданное количество товара вернётся на склад

)        Из таблицы «Продажи» удалится запись об этой продаже

Рисунок 5.9. Тестирование отмены продажи

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

 

5.1.7 Тестирование отчётов

Произведем расчет продаж за месяц с 1 апреля по 1 мая вручную.

Сумма = 3000 + 1400 + 1400 + 1400+ 1400 + 390 + 1400 + 150 + 650 + 390 = 11580 (Рисунок 5.10). Выручка на данный момент выводится только как сумма всех записей (Стоимость_продажи - Стоимость_закупки) за выбранный период. На данный момент нет функционала, предоставляющего выручку с учётом налогов, заработных плат персонала и других расходов магазина.

Рисунок 5.10. Тестирование отчётов

 

5.1.8 Тестирование анализа продаж товаров

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

Рисунок 5.11. Тестирование анализа продаж товаров

Раздел программы «Анализ товара» предусматривает возможность установки скидки на самый плохо продаваемый товар от 5% до 70%. Для тестирования правильности установки скидки на товар «Фильтр воздушный» производства фирмы «Росдеталь» возьмем 50% скидку. На данный момент цена продажи за единицу данного товара составляет 130 руб. После установки скидки 50% стоимость должна уменьшиться до 65 руб (Рисунок 5.12).

Рисунок 5.12. Тестирование правильности установки скидки на товар

 

5.1.9 Тестирование функции «Остатки»

Функционал данной подпрограммы достаточно прост. Имеется два поля: слева - заканчивающиеся товары (менее 8 ед. товара на складе, в том числе закончившиеся), справа - закончившиеся товары выводятся отдельно для удобства. Сверимся с данными в таблице БД «Товары», выделим, что функция действительно работает корректно (Рисунок 5.13).

Рисунок 5.13. Тестирование правильности вывода остатков

 

5.1.10 Тестирование подпрограммы для работы с пользователями сайта

Для примера авторизуемся на сайте под логином dima11 и зарезервируем товар «Фильтр воздушный» фирмы «Росдеталь» 1шт (Рисунок 5.14).

Рисунок 5.14. Проверка резервирования товара на пользователя

После этого заходим в программу и продаем данный резерв пользователю dima11 (Рисунок 5.15).

Рисунок 5.15. Продажа резерва реальному покупателю с логином dima11

После нажатия кнопки «Продать» происходят те же манипуляции над данными, что и при нажатии одноимённой кнопки на форме продажи.

Для тестирования правильности продажи проверим соответствующие таблицы БД («Товары», «Продажи»). В таблице «Товары» количество проданного товара составляло 121 шт. На данный момент количество данного товара составляет 120 шт. В таблице «Продажи» появилась соответствующая этой продаже запись (Рисунок 5.16).

Рисунок 5.16. Данные о продаже товара присутствуют в таблице «Продажи»

Тестирование элемента прошло успешно, ошибок не выявлено.

 


5.2 Тестирование сайта


Составим план тестирования сайта:

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

.        Правильность выполнения SQL - запросов к БД. Регистрация и авторизация

.        Слайдер Slick

 

5.2.1 Правильность выполнения функций по нажатию кнопок и переходов по гиперссылкам

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

Рисунок 5.17. Шапка сайта

После нажатия на кнопку «Товар в наличии» пользователь попадает на страницу выбора категории товара (Рисунок 5.18), где каждая гиперссылка выполняет переход абсолютно верно.

Рисунок 5.18. Категории

Гиперссылка, находящаяся в подвале сайта (Рисунок 5.19) осуществляет переход в группу магазина в социальной сети ВКонтакте. Переход осуществляется адекватно.

Рисунок 5.19. Подвал сайта

 

5.2.2 Правильность выполнения SQL-запросов к БД

Некоторые кнопки активируют конструкцию, написанную на языке PHP, предназначенную для выполнения SQL - запроса, поэтому рассмотрим эти кнопки в данном пункте. Начнем с работы формы регистрации (Рисунок 5.20).

Рисунок 5.20. Страница регистрации

Для проверки отправки данных после нажатия на кнопку «Зарегистрироваться» зарегистрируем нового пользователя «Иванов Пётр Петрович», логин: «abcd9», пароль: «11111». После регистрации перейдем в панель управления БД PhpMyAdmin (Рисунок 5.21), где убедимся, что данные отправлены успешно в нужные поля, а конструкция «$user->password = password_hash($data['password'], PASSWORD_DEFAULT);» для шифрования пароля выполняется успешно. Данная конструкция является стандартной в технологии RedBean. Использование этой технологии позволяет увеличить защиту проекта с использованием несложных готовых конструкций.

Рисунок 5.21. Пользователь успешно зарегистрирован, пароль зашифрован

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

Рисунок 5.22. Поле заполнено неверно

Отметим, что страница регистрации и авторизации прошли тестирование отлично, поэтому перейдем к выводу товаров (Рисунок 5.23).

Рисунок 5.23. Вывод ассортимента

Товар выводится правильно в зависимости от выбора категории. Зарезервируем 1ед. товара «Дверь передняя» для автомобиля «Nissan Almera Classic» на пользователя dima11. Проверим в клиентском приложении наличие данного резерва (Рисунок 5.24).

Рисунок 5.24. Результат работы кнопки «Зарезервировать»

SQL - запрос по занесению в БД данных о резерве на конкретного пользователя работает корректно. Далее проверили следующие конструкции:

.        «$result11 = $mysqli->query("UPDATE Товары,Резервирование set Товары.Остаток_шт=Товары.Остаток_шт+Резервирование.Количество WHERE Код_товара = Резервирование.Код_тов and Резервирование.Дата_резерва < (NOW() - INTERVAL 3 DAY)");

2.      «$result22 = $mysqli->query("DELETE FROM Резервирование WHERE Дата_резерва < (NOW() - INTERVAL 3 DAY)");»

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

 


5.2.3 Тестирование слайдера «Slick»

Слайдер работает корректно, без замечаний. Изображения автоматически перелистываются каждые три секунды, также можно выбирать фотографии благодаря нажатиям на круглые, которые расположены под самим слайдером (Рисунок 5.25). Кнопки работают правильно, без нареканий.

Рисунок 5.25. Внешний вид слайдера «Slick»

6. Внедрение продукта в производство


Для внедрения проекта в производство следует составить план действий, представленный в таблице 6.1.

Таблица 6.1. Этапы внедрения ПП в производство

Этап работы

Результат

Срок

Подготовка рабочего места на предприятии

Приобретение со стороны предприятия необходимого ПО и аппаратного обеспечения

10 дней

Установка 1

Установка ПО для ПП

1 день

Установка 2

Установка клиентского приложения посредством запуска установочной программы, установка БД

1 день

Внедрение сайта

Покупка домена, хостинга, загрузка сайта на хостинг

1 день

Обучение персонала

Персонал и администрация успешно используют функции АСУ

10 дней

Работы с БД

Наполнение магазина ассортиментом, клиентами, пользователями и т.д.

3 дня

Проведение предварительных испытаний

Испытания системы на работоспособность и соответствие техзаданию, устранение неисправностей

10 дней

Проведение опытной эксплуатации

Опытная эксплуатация. Доработка ПО и дополнительная наладка технических средств

10 дней

Проведение приёмочных испытаний

Испытания системы в соответствии с ПИМ проведены. Устранение неисправностей и внесение изменений в документацию проведено.

5 дней


 

Заключение


На данный момент проект разработан. Из промежуточного тестирования интерфейса и функций ПП можно сказать, что и клиентское приложение, и сайт работают корректно и выполняют свои функции достаточно быстро. Интерфейс можно назвать интуитивно понятным из результатов тестирования на реальных пользователях разных возрастов, поэтому можно сказать, что цель по созданию удобного для пользователя интерфейса достигнута. Задача по улучшению читабельности кода, инкапсуляции объектов, добавлению новых функций с применением шаблонов проектирования достигнута. Доработка существующего функционала программного продукта в данный момент не будет составлять особой сложности из-за повышения читабельности и структурированности кода. После добавления шаблона Singleton объем программного кода уменьшился на 900 строк. Работа с экономическим анализом продаж за определенный промежуток времени стала намного удобнее из-за применения шаблона Adapter. Браузер обрёл несколько важных функций с применением шаблона Command. Примерный срок для полноценного внедрения в производство: 52 рабочих дня. На данный момент абсолютно все функции сайта и клиентского приложения выполняются правильно, выдают адекватные результаты без сбоев, а также выполняются быстро.

Список использованных источников


1.      CloudShop [Электронный ресурс]: офиц. сайт. - Режим доступа: https://cloudshop.ru.

2.      ABM Retail [Электронный ресурс]: офиц. сайт. - Режим доступа: http://abmcloud.com/solution/upravleniye-magazinami/

.        1С [Электронный ресурс]: офиц. сайт. - Режим доступа: http://solutions.1c.ru/catalog/service-center/features

.        Wikipedia - свободная энциклопедия [Электронный ресурс]: офиц. сайт. - Режим доступа: https://ru.wikipedia.org

6.      prj-exp [Электронный ресурс]: офиц. сайт. - Режим доступа: http://www.prj-exp.ru/dwh/dwh_stages_of_development.php

.        Смирнов Д.А. УМНЫЙ ИНТЕРФЕЙС ПОЛЬЗОВАТЕЛЯ ДЛЯ АСУ МАГАЗИНА АВТОЗАПЧАСТЕЙ//Молодёжь и XXI век - 2017. Материалы международной молодёжной научной конференции., 22 февраля 2017г. /ЮЗГУ. - Курск, 2017 - Т.3, С. 66 - 69.

.        Смирнов Д.А. РАЗРАБОТКА АСУ ДЛЯ МАГАЗИНА АВТОЗАПЧАСТЕЙ // Материалы межрегиональной научной конференции Х ежегодной научной сессии аспирантов и молодых ученых. /,. - Вологда, 2017 - Т.1, С. 104 - 107.

Приложение 1


Программный код формы авторизации:

#pragma endregion: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для синхронизации вводимых имени польз и пароля

try {^ cmd = "select * from autorun2.users where user_name='" + this->username_txt->Text

+ "' and password='" + this->password_txt->Text + "';";^ myReader = ConnToDB::getSingleton()->doSQLCommand(cmd);count = 0;(myReader->Read()) {

count = count + 1;

}(count == 1) {

//Если имя польз. и пароль введены верно, то переходим на форм2

this->Hide();^ f2 = gcnew form2();->ShowDialog();>Close();

}if (count > 1) {

MessageBox::Show("Дублированные имя пользователя и пароль");

}{::Show("Имя пользователя и пароль введены неверно");

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {->Text = System::DateTime::Now.Date.ToShortDateString();::String^ WeekDayName;(System::DateTime::Now.DayOfWeek) {System::DayOfWeek::Sunday:= "воскресенье" + ","; break;System::DayOfWeek::Monday:= "понедельник" + ","; break;System::DayOfWeek::Tuesday:= "вторник" + ","; break;System::DayOfWeek::Wednesday:= "среда" + ","; break;System::DayOfWeek::Thursday:= "четверг" + ","; break;System::DayOfWeek::Friday:= "пятница" + ","; break;System::DayOfWeek::Saturday:= "суббота" + ","; break;

}->Text = WeekDayName;(System::DateTime::Now.TimeOfDay.Minutes < 10) {->Text = System::DateTime::Now.TimeOfDay.Hours + ":0" + System::DateTime::Now.TimeOfDay.Minutes;

}{->Text = System::DateTime::Now.TimeOfDay.Hours + ":" + System::DateTime::Now.TimeOfDay.Minutes;

}

}: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {::Exit();

}

};

}

Приложение 2


Программный код Form 2.h:(void)

{();= gcnew ArrayList();= gcnew ArrayList();>Height = 445;(gcnew NavigateCommand(browser, "http://google.com"));

//////choose_cli заполнение_cli->Items->Clear();

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Ф_И_О from autorun2.Клиенты ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Ф_И_О"));

}each (String^ name in names) {_cli->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}_tov->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Название_товара from autorun2.Товары where Категория = '"+categ->Text+"' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Название_товара"));

}each (String^ name in names) {_tov->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names1 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name1 in names1) {->Items->Add(name1);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names2 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name2 in names2) {->Items->Add(name2);

}

}(Exception^ex) {::Show(ex->Message);

}->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names3 = gcnew ArrayList();(myReader->Read()) {->Add(myReader->GetString("Категория"));

}each (String^ name3 in names3) {->Items->Add(name3);

}

}(Exception^ex) {::Show(ex->Message);

}>Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Категория"));

}each (String^ name in names) {>Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}_cli2->Items->Clear();{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select * from autorun2.Клиенты ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Ф_И_О"));

}each (String^ name in names) {_cli2->Items->Add(name);

}

}(Exception^ex) {::Show(ex->Message);

}(txt_sum->Text == "") {>Enabled = false;

}

}:

~form2()

{(components)

{components;

}

}: ArrayList^ browserExecuted;: ArrayList^ browserUnexecuted;

#pragma endregion: void execute(Command^ command) {>Clear();>execute();>Add(command);

}: void undo() {(browserExecuted->Count == 0) {;

}^ command = dynamic_cast<Command^>(browserExecuted[browserExecuted->Count - 1]);>RemoveAt(browserExecuted->Count - 1);>undo();>Add(command);

}: void redo() {(browserUnexecuted->Count == 0) {;

}^ command = dynamic_cast<Command^>(browserUnexecuted[browserUnexecuted->Count - 1]);>RemoveAt(browserUnexecuted->Count - 1);>execute();>Add(command);

}

//Кнопка "выход": System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {::Exit();

}

//кнопка вывода информации из таблицы "клиенты"

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Лишние кнопки делаем невидимыми

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код клиента";

lbl2->Text = "Ф.И.О";

lbl3->Text = "Телефон";

lbl4->Text = "Автомобиль";

lbl5->Text = "WIN";

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_клиента,Ф_И_О as 'Ф.И.О',Телефон,Автомобиль,WIN from autorun2.Клиенты ;");

}

//кнопка вывода информации из таблицы "товары"

private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние кнопки делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код товара";

lbl2->Text = "Категория";

lbl3->Text = "Брэнд";

lbl4->Text = "Наименование";

lbl5->Text = "Стоимость закупки";

lbl6->Text = "Стоимость продажи";

lbl7->Text = "Остаток шт.";

lbl8->Text = "Для автомобиля";

lbl9->Text = "Размеры";

lbl10->Text = "Характеристики";

//Чистим видимые текстбоксы при повторном нажатии на кнопку

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_товара as 'Код товара', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.', Для_авто as 'Для автомобиля',Размеры,Характеристики,Категория as 'Категория' from autorun2.Товары;");

}

//кнопка вывода информации из таблицы "поставщики"

private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Лишние кнопки делаем невидимыми

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код_Поставщика";

lbl2->Text = "Название";

lbl3->Text = "Представитель";

lbl4->Text = "Телефон";

lbl5->Text = "Адрес";->Text = "E-mail";->Text = "Сайт";::getSingleton()->fillTable(dataGridView1, "select Код_Поставщика as 'Код поставщика',Название_поставщика as 'Название поставщика',Представитель,Телефон,Адрес,Эл_почта as 'E-mail',Сайт from autorun2.Поставщики ;");

}

// кнопка вывода информации из таблицы "заказы"

private: System::Void button5_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код Заказа";

lbl2->Text = "Название товара";

lbl3->Text = "Брэнд";

lbl4->Text = "Заказано шт.";

lbl5->Text = "Стоимость закупки";

lbl6->Text = "Категория";

lbl7->Text = "Размеры";

lbl8->Text = "Характеристики";

lbl9->Text = "Для автомобиля";

//Лишние кнопки делаем невидимыми

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_заказа as 'Код заказа', Название_товара as 'Название товара', Брэнд, Количество_ед_товара as 'Заказано шт.', Стоимость_закупки as 'Стоимость закупки',Категория as 'Категория', Размеры, Характеристики,Для_авто as 'Для авто', Дата_заказа as 'Дата заказа' from autorun2.Заказы ;");

}

//кнопка вывода информации из таблицы "поставки"

private: System::Void button6_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код Поставки";

lbl2->Text = "Название товара";

lbl3->Text = "Брэнд";

lbl4->Text = "Доставлено товара";

lbl5->Text = "Стоимость заказа";

lbl6->Text = "Стоимость продажи";

lbl7->Text = "Категория";

lbl8->Text = "Размеры";

lbl9->Text = "Характеристики";

lbl10->Text = "Для автомобиля";

//Лишние кнопки делаем невидимыми

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_поставки as 'Код поставки',Название_товара as 'Название товара',Брэнд, Доставлено_ед_товара as 'Доставлено товара',Стоимость_заказа as 'Стоимость заказа',Стоимость_продажи as 'Стоимость продажи',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_поставки as 'Дата поставки' from autorun2.Поставки ;");

}: System::Void form2_Load(System::Object^ sender, System::EventArgs^ e) {

//вывод даты и дня недели на форму

label2->Text = System::DateTime::Now.Date.ToShortDateString();::String^ WeekDayName;(System::DateTime::Now.DayOfWeek) {System::DayOfWeek::Sunday:= "воскресенье" + ","; break;System::DayOfWeek::Monday:= "понедельник" + ","; break;System::DayOfWeek::Tuesday:= "Вторник" + ","; break;System::DayOfWeek::Wednesday:= "Среда" + ","; break;System::DayOfWeek::Thursday:= "Четверг" + ","; break;System::DayOfWeek::Friday:= "Пятница" + ","; break;System::DayOfWeek::Saturday:= "Суббота" + ","; break;

}->Text = WeekDayName;(System::DateTime::Now.TimeOfDay.Minutes < 10) {->Text = System::DateTime::Now.TimeOfDay.Hours + ":0" + System::DateTime::Now.TimeOfDay.Minutes;

}{->Text = System::DateTime::Now.TimeOfDay.Hours + ":" + System::DateTime::Now.TimeOfDay.Minutes;

}

}

//кнопка сохранения данных в таблицу"клиенты"

private: System::Void save_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Клиенты (Ф_И_О,Телефон,Автомобиль,WIN) values('" + this->txt2->Text + "','" + this->txt3->Text + "','" + this->txt4->Text + "','" + this->txt5->Text + "') ;");(myReader->Read()) {

}::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_клиента,Ф_И_О as 'Ф.И.О',Телефон,Автомобиль,WIN from autorun2.Клиенты ;");

}

//кнопка удаления из таблицы "клиенты"

private: System::Void drop_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления данных по любому введенному полю

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.клиенты where Код_клиента = '" + this->txt1->Text + "' ;");(myReader->Read()) {

}::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_клиента,Ф_И_О as 'Ф.И.О',Телефон,Автомобиль,WIN from autorun2.Клиенты ;");

}

//Кнопка сохранения информации в таблицу "товары"

private: System::Void save1_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для сохранения информации в таблицу "товары"

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.товары (Категория, Брэнд, Название_товара, Стоимость_закупки, Стоимость_продажи, Остаток_шт, Для_авто, Размеры, Характеристики) values('" + this->categ1->Text + "','" + this->txt3->Text + "', '" + this->txt4->Text + "', '" + this->txt5->Text + "', '" + this->txt6->Text + "', '" + this->txt7->Text + "', '" + this->txt8->Text + "', '" + this->txt9->Text + "', '" + this->txt10->Text + "') ;");

while (myReader->Read()) {

}

MessageBox::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_товара as 'Код товара', Категория as 'Категория', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.',Для_авто as 'Для автомобиля', Размеры, Характеристики from autorun2.Товары;");

}

//Кнопка удаления выбранной информации из таблицы "товары"

private: System::Void drop1_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления строки по любому введенному колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.товары where Код_Товара ='" + this->txt1->Text + "';");(txt1->Text != "" || txt2->Text != "" || txt3->Text != "" || txt4->Text != "" || txt5->Text != "")(myReader->Read()) {

}::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_товара as 'Код товара',Категория as 'Категория', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.',Для_авто as 'Для автомобиля', Размеры, Характеристики from autorun2.Товары;");

}

//кнопка сохранения информации в таблицу"пользователи"

private: System::Void save2_Click(System::Object^ sender, System::EventArgs^ e) {

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

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.users (user_name,password) values( '" + this->txt2->Text + "','" + this->txt3->Text + "') ;");(myReader->Read()) {

}::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}

}

//кнопка вывода информации из таблицы"пользователи"

private: System::Void users_Click(System::Object^ sender, System::EventArgs^ e) {

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Лишние кнопки делаем невидимыми

//меняем имена лэйблов на актуальные для выбранной таблицы

lbl1->Text = "Код_Пользователя";

lbl2->Text = "Имя пользователя";

lbl3->Text = "Пароль";

//чистим текстбоксы при повторном нажатии на кнопку

ConnToDB::getSingleton()->fillTable(dataGridView1, "select user_id,user_name from autorun2.users ;");

}

//кнопка удаления информации из таблицы "пользователи"

private: System::Void drop2_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления информации из таблицы по любому введенному в поле колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.users where user_id ='" + this->txt1->Text + "' or user_name='" + this->txt2->Text + "';");(txt1->Text != "" || txt2->Text != "" || txt3->Text != "")(myReader->Read()) {

}

MessageBox::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}

}

//кнопка сохранения данных в таблицу "поставщики"

private: System::Void save_provid_Click(System::Object^ sender, System::EventArgs^ e) {

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

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Поставщики (Название_поставщика, Представитель, Телефон, Адрес, Эл_почта, Сайт) values('" + this->txt2->Text + "','" + this->txt3->Text + "', '" + this->txt4->Text + "', '" + this->txt5->Text + "', '" + this->txt6->Text + "', '" + this->txt7->Text + "') ;");

MessageBox::Show("Данные успешно занесены в базу");

while (myReader->Read()) {

}

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_Поставщика as 'Код поставщика',Название_поставщика as 'Название поставщика',Представитель,Телефон,Адрес,Эл_почта as 'E-mail',Сайт from autorun2.Поставщики ;");

}

//кнопка удаления информации из таблицы "поставщики"

private: System::Void drop_provid_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.Поставщики where Код_поставщика ='" + this->txt1->Text + "' ;");(txt1->Text != "" || txt2->Text != "" || txt3->Text != "" || txt4->Text != "" || txt5->Text != "" || txt6->Text != "" || txt7->Text != "")(myReader->Read()) {

}::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_Поставщика as 'Код поставщика',Название_поставщика as 'Название поставщика',Представитель,Телефон,Адрес,Эл_почта as 'E-mail',Сайт from autorun2.Поставщики ;");

}

//кнопка сохранения данных в таблицу "заказы"

private: System::Void save_zak_Click(System::Object^ sender, System::EventArgs^ e) {

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

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Заказы (Название_товара, Брэнд, Количество_ед_товара, Стоимость_закупки,Категория,Размеры,Характеристики,Для_авто) values('" + this->txt2->Text + "','" + this->txt3->Text + "', '" + this->txt4->Text + "', '" + this->txt5->Text + "', '" + this->categ2->Text + "', '" + this->txt7->Text + "', '" + this->txt8->Text + "', '" + this->txt9->Text + "') ;");

while (myReader->Read()) {

}

MessageBox::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_заказа as 'Код заказа', Название_товара as 'Название товара', Брэнд, Количество_ед_товара as 'Заказано шт.',Стоимость_закупки as 'Стоимость закупки',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_заказа as 'Дата заказа' from autorun2.Заказы ;");

}

//Кнопка поиска клиентов по любому введенному полю

private: System::Void search_client_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_Клиента,Ф_И_О as 'Ф.И.О',Телефон,Автомобиль,WIN from autorun2.Клиенты where Код_Клиента ='" + this->txt1->Text + "' or Ф_И_О='" + this->txt2->Text + "' or Телефон='" + this->txt3->Text + "' or Автомобиль='" + this->txt4->Text + "'or WIN='" + this->txt5->Text + "';");

}

//Кнопка поиска поставщиков по любому введенному полю

private: System::Void button7_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_Поставщика as 'Код поставщика',Название_поставщика as 'Название поставщика',Представитель,Телефон,Адрес,Эл_почта as 'E-mail',Сайт from autorun2.Поставщики where Код_Поставщика ='" + this->txt1->Text + "' or Название_поставщика='" + this->txt2->Text + "';");

}

//Кнопка поиска пользователей по любому введенному полю

private: System::Void search_user_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select user_id,user_name from autorun2.users where user_id='" + this->txt1->Text + "' or user_name='" + this->txt2->Text + "';");

}

//Кнопка удаления заказов: System::Void drop_zak_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.Заказы where Код_заказа ='" + this->txt1->Text + "' ;");(myReader->Read()) {

}::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_заказа as 'Код заказа', Название_товара as 'Название товара', Брэнд, Количество_ед_товара as 'Заказано шт.',Стоимость_закупки as 'Стоимость закупки',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_заказа as 'Дата заказа' from autorun2.Заказы ;");

}

//Кнопка сохранения поставок: System::Void save_postavka_Click(System::Object^ sender, System::EventArgs^ e) {

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

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Поставки (Название_товара,Брэнд,Доставлено_ед_товара,Стоимость_заказа,Стоимость_продажи,Категория,Размеры,Характеристики,Для_авто) values('" + this->txt2->Text + "','" + this->txt3->Text + "', '" + this->txt4->Text + "', '" + this->txt5->Text + "', '" + this->txt6->Text + "', '" + this->categ3->Text + "', '" + this->txt8->Text + "', '" + this->txt9->Text + "', '" + this->txt10->Text + "') ;");

while (myReader->Read()) {

}

MessageBox::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_поставки as 'Код поставки',Название_товара as 'Название товара',Брэнд, Доставлено_ед_товара as 'Доставлено товара',Стоимость_заказа as 'Стоимость заказа',Стоимость_продажи as 'Стоимость продажи',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_поставки as 'Дата поставки' from autorun2.Поставки ; ");

}

//кнопка удаления поставок: System::Void drop_postavka_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.Поставки where Код_поставки ='" + this->txt1->Text + "' ;");(myReader->Read()) {

}::Show("Данные успешно удалены из базы");

}(Exception^ ex) {::Show(ex->Message);

}

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_поставки as 'Код поставки',Название_товара as 'Название товара',Брэнд, Доставлено_ед_товара as 'Доставлено товара',Стоимость_заказа as 'Стоимость заказа',Стоимость_продажи as 'Стоимость продажи',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_поставки as 'Дата поставки' from autorun2.Поставки ; ");

}

//кнопка поиска заказов: System::Void search_zak_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_заказа as 'Код заказа', Название_товара as 'Название товара', Брэнд, Количество_ед_товара as 'Заказано шт.',Стоимость_закупки as 'Стоимость закупки',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_заказа as 'Дата заказа' from autorun2.Заказы where Код_Заказа ='" + this->txt1->Text + "' or Название_товара='" + this->txt2->Text + "' or Брэнд='" + this->txt3->Text + "';");

}

//кнопка поиска товара: System::Void search_tovar_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_товара as 'Код товара',Категория as'Категория',Брэнд,Название_товара as 'Наименование товара',Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи',Остаток_шт as 'Остаток шт.',Для_авто,Размеры,Характеристики from autorun2.Товары where Код_товара ='" + this->txt1->Text + "' or Категория = '" + this->categ->Text + "' or Брэнд='" + this->txt3->Text + "'or Название_товара='" + this->txt4->Text + "';");

}

//кнопка поиска поставок: System::Void search_postavka_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_поставки as 'Код поставки',Название_товара as 'Название товара',Брэнд,Доставлено_ед_товара as 'Доставлено товара',Стоимость_заказа as 'Стоимость заказа',Стоимость_продажи as 'Стоимость продажи',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля',Дата_поставки as 'Дата поставки' from autorun2.Поставки where Код_поставки ='" + this->txt1->Text + "' or Название_товара='" + this->txt2->Text + "' or Брэнд='" + this->txt3->Text + "';");

}

//кнопка вывода информации о продажах: System::Void prodazhi_Click(System::Object^ sender, System::EventArgs^ e) {

//Изменяем имена лейблов на актуальные для выбранной таблицы

lbl1->Text = "Код продажи";

lbl2->Text = "Дата продажи";

lbl3->Text = "Покупатель";

lbl4->Text = "Название товара";

//Чистим видимые текстбоксы при повторном нажатии на кнопку

//Лишние лейблы делаем невидимыми

//Лишние текстбоксы делаем невидимыми

//Лишние кнопки делаем невидимыми

ConnToDB::getSingleton()->fillTable(dataGridView1, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Брэнд,Количество as 'Количество товара',Сумма,Выручка from autorun2.Продажа ;");

}

//кнопка поиска продаж: System::Void search_prod_Click(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView1, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Брэнд,Количество as 'Количество товара',Сумма,Выручка from autorun2.Продажа where Код_продажи ='" + this->txt1->Text + "' ;");

}

//работа с существующим клиентом: System::Void old_client_Click(System::Object^ sender, System::EventArgs^ e) {

}

//Занесение нового клиента: System::Void button9_Click_1(System::Object^ sender, System::EventArgs^ e) {

}

//кнопка сохранения нового покупателя для страницы "продажа"

private: System::Void save_cli_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Клиенты (Ф_И_О,Телефон,Автомобиль,WIN) values('" + this->txt_FIO->Text + "','" + this->txt_number->Text + "','" + this->txt_auto->Text + "','" + this->txt_win->Text + "') ;");(myReader->Read()) {

}::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}

}

//кнопка "продажа": System::Void prod_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = false;a, b;= Convert::ToInt32(txt_ost->Text);= Convert::ToInt32(txt_tov_count->Text);(choose_tov->Text == "") {::Show("Пожалуйста выберите товар для продажи!");

}(txt_tov_count->Text == "") {::Show("Пожалуйста введите количество товара!");

}

if (a >= b) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

button21->Visible = true;->Visible = true;->Visible = true;{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Остаток_шт=Остаток_шт-'" + this->txt_tov_count->Text + "'where Код_товара='" + this->combo_ID->Text + "'; Insert into autorun2.Продажа (Покупатель,Назв_товара,Категория_тов,Брэнд,Количество,Сумма,Выручка) values ('" + this->choose_cli->Text + "','" + this->choose_tov->Text + "','" + this->categ->Text + "','" + this->choose_brend->Text + "','" + this->txt_tov_count->Text + "',replace('" + this->txt_sum->Text + "',',','.'), replace('" + this->txt_viruchka->Text + "',',','.'));");(myReader->Read()) {

}(choose_cli->Text != "") {::Show("Продано '" + txt_tov_count->Text + "' шт. товара '" + choose_tov->Text + "' покупателю '" + choose_cli->Text + "'");

}{::Show("Продано '" + txt_tov_count->Text + "' шт. товара '" + choose_tov->Text + "'");

}

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView2, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Количество as 'Количество товара',Сумма from autorun2.Продажа where Покупатель = '" + this->choose_cli->Text + "';");

}

else {

MessageBox::Show("Недостаточно товара на складе!");

}

checkBox1->Visible = false;

}

//кнопка "добавить имеющийся товар"

private: System::Void add_tovar_Click(System::Object^ sender, System::EventArgs^ e) {

}: System::Void form_width_btn_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = false;>Visible = false;->Height = 535;>Visible = true;>Height = 640;::getSingleton()->fillTable(dataGridView2, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Количество as 'Количество товара',Сумма from autorun2.Продажа where Покупатель = '" + this->choose_cli->Text + "';");

}: System::Void minus_Click(System::Object^ sender, System::EventArgs^ e) {>Visible = true;->Visible = true;>Height = 445;->Height = 340;

}: System::Void button10_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = false;>Width = 1290;->Location = System::Drawing::Point(996, 8);

}

//продать еще товар этому же покупателю

private: System::Void button8_Click_2(System::Object^ sender, System::EventArgs^ e) {

}: System::Void button13_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = false;>Width = 1290;->Location = System::Drawing::Point(996, 8);

}: System::Void button14_Click(System::Object^ sender, System::EventArgs^ e) {>Width = 933;->Location = System::Drawing::Point(643, 8);->Visible = true;

}: System::Void button16_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {

}: System::Void button16_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {

}: System::Void comboBox1_Enter(System::Object^ sender, System::EventArgs^ e) {1->Items->Clear();

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Код_продажи FROM autorun2.Продажа where Покупатель='" + this->choose_cli2->Text + "' ;");^ times = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Код_продажи"));

}each (String^ time in times) {->Items->Add(time);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void comboBox1_TextChanged(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Дата_продажи,Назв_товара,Количество,Сумма FROM autorun2.Продажа where Код_продажи='" + this->comboBox1->Text + "' ;");

String^ date;^ tov_name;^ tov_count;^ summa_prod;(myReader->Read()) {= myReader->GetString("Дата_продажи");_name = myReader->GetString("Назв_товара");_count = myReader->GetString("Количество");_prod = myReader->GetString("Сумма");

}->Text = date;->Text = tov_name;->Text = tov_count;->Text = summa_prod;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Выручка from autorun2.Продажа where Код_продажи = '" + this->comboBox1->Text + "';");^ viruchka;(myReader->Read()) {= myReader->GetString("Выручка");

}_viruchka1->Text = viruchka;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void button12_Click(System::Object^ sender, System::EventArgs^ e) { (comboBox1->Text != "") {

//выполняем sql запрос к базе для удаления строки из таблицы по любому введенному колумну

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("delete from autorun2.Продажа where Код_продажи='" + this->comboBox1->Text + "';update autorun2.Товары set Остаток_шт=Остаток_шт+'" + this->textBox4->Text + "' where Код_товара='" + this->comboBox1->Text + "';");

while (myReader->Read()) {

}::Show("Продажа отменена");

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView2, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Количество as 'Количество товара',Сумма from autorun2.Продажа where Покупатель = '" + this->choose_cli->Text + "';");->Text = "";->Text = "";->Text = "";->Text = "";->Text = "";

}{::Show("Заполните поле 'Код продажи'!");

}

}: System::Void choose_cli_TextChanged(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView2, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Количество as 'Количество товара',Сумма from autorun2.Продажа where Покупатель = '" + this->choose_cli->Text + "';");

}: System::Void form2_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {(MessageBox::Show("Вы действительно хотите выйти?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {>Cancel = false;

}{>Cancel = true;

}

}: System::Void button11_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Клиенты;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Клиенты'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void button15_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Товары;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Товары'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void button17_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Поставщики;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Поставщики'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void button18_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Заказы;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Заказы'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void button19_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Поставки;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Поставки'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void button20_Click(System::Object^ sender, System::EventArgs^ e) {(MessageBox::Show("Вы действительно хотите удалить все записи из таблицы без возможности восстановления?", "AutoRun", MessageBoxButtons::YesNo, MessageBoxIcon::Question) == System::Windows::Forms::DialogResult::Yes) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("TRUNCATE TABLE autorun2.Продажа;");(myReader->Read()) {

}::Show("Все записи удалены из таблицы 'Продажа'");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void form2_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {::Exit();

}: System::Void txt_tov_count_TextChanged(System::Object^ sender, System::EventArgs^ e) {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Стоимость_продажи*'" + this->txt_tov_count->Text + "' as 'Сумма' from autorun2.Товары where Код_товара='" + this->combo_ID->Text + "';");^ rasschet1;(myReader->Read()) {= myReader->GetString("Сумма");

}_sum->Text = rasschet1;

}(Exception^ ex) {::Show(ex->Message);

}(txt_sum->Text != "") {>Enabled = true;

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select (Стоимость_продажи-Стоимость_закупки)*'" + this->txt_tov_count->Text + "' as 'Выручка' from autorun2.Товары where Код_товара = '" + this->combo_ID->Text + "' ;");^ viruchka;(myReader->Read()) {= myReader->GetString("Выручка");

}_viruchka->Text = viruchka;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void button21_Click(System::Object^ sender, System::EventArgs^ e) {

}: System::Void start_Click(System::Object^ sender, System::EventArgs^ e) {(gcnew NavigateCommand(browser, adress->Text));

//browser->Navigate(adress->Text);

}: System::Void home_Click(System::Object^ sender, System::EventArgs^ e) {(gcnew NavigateCommand(browser, "http://google.com"));

//browser->Navigate("http://google.com");

}: System::Void refresh_Click(System::Object^ sender, System::EventArgs^ e) {>Refresh();

}: System::Void forward_Click(System::Object^ sender, System::EventArgs^ e) {(gcnew ForwardCommand(browser));

//browser->GoForward();

}: System::Void back_Click(System::Object^ sender, System::EventArgs^ e) {(gcnew BackCommand(browser));

//browser->GoBack();

}: System::Void Браузер_Enter(System::Object^ sender, System::EventArgs^ e) {>Height = 693;->Visible = false;->Visible = false;->Visible = false;->Height = 610;

}: System::Void browser_DocumentCompleted(System::Object^ sender, System::Windows::Forms::WebBrowserDocumentCompletedEventArgs^ e) {>Text = browser->Url->ToString();

}: System::Void Продажа_Enter(System::Object^ sender, System::EventArgs^ e) {->Visible = true;->Visible = true;->Visible = true;>Height = 445;>Visible = true;

}: System::Void Информация_Enter(System::Object^ sender, System::EventArgs^ e) {>Height = 445;

}: System::Void Отчёты_Enter(System::Object^ sender, System::EventArgs^ e) {>Height = 445;

}: System::Void dateTimePicker2_ValueChanged(System::Object^ sender, System::EventArgs^ e) {^ dateStart = (gcnew DateAdapter(dateTimePicker1))->getDate();^ dateEnd = (gcnew DateAdapter(dateTimePicker2))->getDate();::getSingleton()->fillTable(otchet, "select Код_продажи as 'Код продажи',Дата_продажи as 'Дата продажи',Покупатель,Назв_товара as 'Наименование товара',Количество as 'Количество товара',Сумма from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "';");

}: System::Void choose_brend_Enter(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {_brend->Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Брэнд from autorun2.Товары where Название_товара = '" + this->choose_tov->Text + "' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Брэнд"));

}each (String^ name in names) {_brend->Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void choose_brend_TextChanged(System::Object^ sender, System::EventArgs^ e) {

}: System::Void choose_tov_TextChanged_1(System::Object^ sender, System::EventArgs^ e) {_brend->Text = "";>Enabled = false;

}: System::Void checkBox1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {(checkBox1->Checked == true) {::getSingleton()->fillTable(dataGridView2, "select Название_товара, Брэнд , Стоимость_продажи as 'Цена',Остаток_шт as 'Остаток', Для_авто as 'Для автомобиля', Размеры, Характеристики from autorun2.Товары where Стоимость_продажи < '" + this->txt_tsena->Text + "' and Название_товара = '" + this->choose_tov->Text + "';");->Visible = false;>Visible = false;->Height = 535;>Visible = true;>Height = 640;

}(checkBox1->Checked == false) {>Visible = true;->Visible = true;>Height = 445;->Height = 340;

}

}: System::Void txt_tsena_TextChanged(System::Object^ sender, System::EventArgs^ e) {

//checkBox1->Visible = true;

}: System::Void radioButton1_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {(radioButton1->Checked == false)

{->Visible = false;->Visible = false;->Visible = false;->Visible = false;

}(radioButton1->Checked == true) {22->Text = ("Интересует ли вас выручка магазина за этот период?");

this->label22->BackColor = System::Drawing::Color::Maroon;->Visible = false;->Visible = false;->Visible = false;>Visible = true;->Visible = true;->Visible = true;->Visible = true;->Visible = true;

}

}: System::Void radioButton2_CheckedChanged(System::Object^ sender, System::EventArgs^ e) {(radioButton2->Checked == false)

{->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;->Visible = false;

}(radioButton2->Checked == true) {->Visible = true;->Visible = true;->Visible = true;->Visible = true;

}

}: System::Void checkBox1_Leave(System::Object^ sender, System::EventArgs^ e) {->Checked = false;

}: System::Void СППР_Enter(System::Object^ sender, System::EventArgs^ e) {>Height = 445;

}: System::Void dateTimePicker3_ValueChanged(System::Object^ sender, System::EventArgs^ e) {^ dateStart = (gcnew DateAdapter(dateTimePicker4))->getDate();^ dateEnd = (gcnew DateAdapter(dateTimePicker3))->getDate();::getSingleton()->fillTable(otchet, "select sum(Сумма) as 'Сумма продаж за выбранный период' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "';");->Visible = true;->Visible = true;->Visible = true;

//otchet2->Visible = true;::getSingleton()->fillTable(otchet2, "select sum(Выручка) as 'Выручка за выбранный период' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "';");

}: System::Void button23_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = true;>label22->BackColor = System::Drawing::Color::Black;^ dateStart = (gcnew DateAdapter(dateTimePicker4))->getDate();^ dateEnd = (gcnew DateAdapter(dateTimePicker3))->getDate();22->Text = ("Выведена выручка магазина за период с " + dateStart + " по " + dateEnd + "");

button23->Visible = false;->Visible = false;

}: System::Void button24_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = false;->Visible = false;->Visible = false;

}: System::Void button22_Click(System::Object^ sender, System::EventArgs^ e) {

//tabControl1->SelectedIndex = 1;

//int x = 35;

//int y = 13;

//this->button22->Size = System::Drawing::Size(x, y);

//while (this->button22->Size != System::Drawing::Size(66, 55)) {

//x++;y++;

//}

}: System::Void button25_Click(System::Object^ sender, System::EventArgs^ e) {

//tabControl1->SelectedIndex = 2;

}: System::Void button27_Click(System::Object^ sender, System::EventArgs^ e) {

//tabControl1->SelectedIndex = 3;

}: System::Void button26_Click(System::Object^ sender, System::EventArgs^ e) {

// " select sum(Выручка) as 'Выручка за выбранный период' from autorun2.Выручка where Дата_продажи Between '" + this->dateTimePicker4->Text + "' AND '" + this->dateTimePicker3->Text + "';"

//tabControl1->SelectedIndex = 4;

}: System::Void dateTimePicker5_ValueChanged(System::Object^ sender, System::EventArgs^ e) {^ dateStart = (gcnew DateAdapter(dateTimePicker6))->getDate();^ dateEnd = (gcnew DateAdapter(dateTimePicker5))->getDate();::getSingleton()->fillTable(otchet3, "select Назв_товара,Брэнд,sum(Количество) as 'Продано ед.' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "' group by Назв_товара,Брэнд order by sum(Количество) limit 5;");::getSingleton()->fillTable(otchet4, "select Назв_товара,Брэнд,sum(Количество) as 'Продано ед.' from autorun2.Продажа where Дата_продажи Between '" + dateStart + "' AND '" + dateEnd + "' group by Назв_товара,Брэнд order by sum(Количество) desc limit 5;");{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Назв_товара,Брэнд,sum(Количество) as 'Продано ед.' from autorun2.Продажа group by Назв_товара,Брэнд order by sum(Количество) limit 1;");^ pName;^ pName1;(myReader->Read()) {= myReader->GetString("Назв_товара");= myReader->GetString("Брэнд");

}_mask_name->Text = pName;_brend_mask->Text = pName1;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void btn_add_yes_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Остаток_шт=Остаток_шт+'" + this->txt7->Text + "'where Код_товара='" + this->txt1->Text + "' or Название_товара='" + this->txt4->Text + "' and Брэнд ='" + this->txt3->Text + "';");

while (myReader->Read()) {

}::Show("Добавлено '" + this->txt7->Text + "' единиц(ы) товара '" + this->txt4->Text + "'");

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void comboBox2_Enter(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {>Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Категория from autorun2.Товары;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Категория"));

}each (String^ name in names) {>Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void perevodOK_Click(System::Object^ sender, System::EventArgs^ e) {>Visible = false;(txt1->Text == "") {::Show("Не заполнены поля!");

}

else {

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

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Поставки (Название_товара,Брэнд,Доставлено_ед_товара,Стоимость_заказа,Категория,Размеры,Характеристики,Для_авто) values('" + this->txt2->Text + "','" + this->txt3->Text + "', '" + this->txt4->Text + "', '" + this->txt5->Text + "', '" + this->txt6->Text + "', '" + this->txt7->Text + "', '" + this->txt8->Text + "', '" + this->txt9->Text + "') ;");

while (myReader->Read()) {

}

MessageBox::Show("Данные успешно занесены в базу");

}(Exception^ ex) {::Show(ex->Message);

}

}

}: System::Void perevod_Click(System::Object^ sender, System::EventArgs^ e) {->Visible = true;

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Название_товара,Брэнд,Количество_ед_товара,Стоимость_закупки,Категория,Размеры,Характеристики,Для_авто,Дата_заказа from autorun2.Заказы where Код_заказа='" + this->txt1->Text + "';");

String^ pName;^ name1;^ name2;^ name3;^ name4;^ name5;^ name6;^ name7;^ name8;(myReader->Read()) {= myReader->GetString("Название_товара");= myReader->GetString("Брэнд");= myReader->GetString("Количество_ед_товара");= myReader->GetString("Стоимость_закупки");= myReader->GetString("Категория");= myReader->GetString("Размеры");= myReader->GetString("Характеристики");= myReader->GetString("Для_авто");= myReader->GetString("Дата_заказа");

}->Text = pName;->Text = name1;->Text = name2;->Text = name3;->Text = name4;->Text = name5;->Text = name6;->Text = name7;->Text = name8;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void button26_Click_1(System::Object^ sender, System::EventArgs^ e) {

}: System::Void button27_Click_1(System::Object^ sender, System::EventArgs^ e) {

}: System::Void button28_Click(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.поставки set Стоимость_продажи='" + this->txt6->Text + "'where Код_поставки='" + this->txt1->Text + "' ;");

while (myReader->Read()) {

}

}(Exception^ ex) {::Show(ex->Message);

}::getSingleton()->fillTable(dataGridView1, "select Код_поставки as 'Код поставки',Название_товара as 'Название товара',Брэнд, Доставлено_ед_товара as 'Доставлено товара',Стоимость_заказа as 'Стоимость заказа',Стоимость_продажи as 'Стоимость продажи',Категория as 'Категория',Размеры,Характеристики,Для_авто as 'Для автомобиля', Дата_поставки as 'Дата поставки' from autorun2.Поставки ; ");

}: System::Void txt_tov_count_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {((e->KeyChar<'0' || e->KeyChar>'9') && e->KeyChar != 127 && e->KeyChar != 8)>Handled = true;>Handled = false;

}: System::Void txt_FIO_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {(e->KeyChar<'0' || e->KeyChar>'9')>Handled = false;>Handled = true;

}: System::Void choose_cli_KeyPress(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e) {(e->KeyChar<'0' || e->KeyChar>'9')>Handled = false;>Handled = true;

}: System::Void categ_TextChanged(System::Object^ sender, System::EventArgs^ e) {{_tov->Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select distinct Название_товара from autorun2.Товары where Категория = '" + this->categ->Text + "' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Название_товара"));

}each (String^ name in names) {_tov->Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void combo_ID_TextChanged(System::Object^ sender, System::EventArgs^ e) {>Enabled = false;->Visible = true;_tsena->Clear();_ost->Clear();_tov_count->Clear();_sum->Clear();_viruchka->Clear();^ ostatok;^ tsena;

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

try {^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Остаток_шт from autorun2.Товары where Код_товара = '" + this->combo_ID->Text + "' ;");(myReader->Read()) {= myReader->GetString("Остаток_шт");

}_ost->Text = ostatok;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Стоимость_продажи from autorun2.Товары where Код_товара='" + this->combo_ID->Text + "';");^ pName;(myReader->Read()) {= myReader->GetString("Стоимость_продажи");

}_tsena->Text = pName;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void combo_ID_Enter(System::Object^ sender, System::EventArgs^ e) {{_ID->Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Код_товара from autorun2.Товары where Название_товара = '" + this->choose_tov->Text + "' and Брэнд = '" + this->choose_brend->Text + "' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Код_товара"));

}each (String^ name in names) {_ID->Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void Сайт_Enter(System::Object^ sender, System::EventArgs^ e) {>Height = 445;{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select count(login) from autorun2.users1 where Статус='Онлайн';");^ login;(myReader->Read()) {= myReader->GetString("count(login)");

}>Text = login;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void txt_login_Enter(System::Object^ sender, System::EventArgs^ e) {{_login->Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select login from autorun2.users1;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("login"));

}each (String^ name in names) {_login->Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void combo_ID2_Enter(System::Object^ sender, System::EventArgs^ e) {{_ID2->Items->Clear();^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Код_резерва from autorun2.Резервирование where Логин = '" + this->combo_login->Text + "' ;");^ names = gcnew ArrayList();(myReader->Read()) {>Add(myReader->GetString("Код_резерва"));

}each (String^ name in names) {_ID2->Items->Add(name);

}

}(Exception^ ex) {::Show(ex->Message);

}

}

private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {

if (combo_ID2->Text != "" || txt_tov2->Text != "") {

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Insert into autorun2.Продажа (Покупатель,Назв_товара,Категория_тов,Брэнд,Количество,Сумма) values ('" + this->txt_fio1->Text + "','" + this->txt_tov2->Text + "','" + this->txt_categ->Text + "','" + this->txt_brend->Text + "','" + this->textBox6->Text + "',replace('" + this->txt_sum1->Text + "',',','.'));");

while (myReader->Read()) {

}

}

catch (Exception^ ex) {

MessageBox::Show(ex->Message);

}

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("Delete from autorun2.Резервирование where Код_резерва = '" + this->combo_ID2->Text + "';");

while (myReader->Read()) {

}

MessageBox::Show("Продано!");

}

catch (Exception^ ex) {

MessageBox::Show(ex->Message);

}

ConnToDB::getSingleton()->fillTable(dataGridView3, "select * from autorun2.Резервирование where Логин = '" + this->combo_login->Text + "' ;");

}

else if (txt_tov2->Text == "") {

MessageBox::Show("На выбранного покупателя ничего не зарезервировано!");

}

else if (combo_ID2->Text == "") {

MessageBox::Show("Заполните поля для продажи!");

}

combo_login->Text = "";

combo_ID2->Text = "";

}: System::Void combo_login_TextChanged(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView3, "select * from autorun2.Резервирование where Логин = '" + this->combo_login->Text + "' ;");_ID2->Enabled = true;

}: System::Void combo_ID2_TextChanged(System::Object^ sender, System::EventArgs^ e) {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Количество from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ count;(myReader->Read()) {= myReader->GetString("Количество");

}->Text = count;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select ФИО from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ fio;(myReader->Read()) {= myReader->GetString("ФИО");

}_fio1->Text = fio;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Название_товара from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ name2;(myReader->Read()) {= myReader->GetString("Название_товара");

}_tov2->Text = name2;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Бренд from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ brend;(myReader->Read()) {= myReader->GetString("Бренд");

}_brend->Text = brend;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Сумма from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ sum;(myReader->Read()) {= myReader->GetString("Сумма");

}_sum1->Text = sum;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Категория_тов from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ categ;(myReader->Read()) {= myReader->GetString("Категория_тов");

}_categ->Text = categ;

}(Exception^ ex) {::Show(ex->Message);

}{^ myReader = ConnToDB::getSingleton()->doSQLCommand("select Код_тов from autorun2.Резервирование where Код_резерва='" + this->combo_ID2->Text + "';");^ id;(myReader->Read()) {= myReader->GetString("Код_тов");

}>Text = id;

}(Exception^ ex) {::Show(ex->Message);

}

}: System::Void Остатки_Enter(System::Object^ sender, System::EventArgs^ e) {::getSingleton()->fillTable(dataGridView4, "select Код_товара as 'Код товара', Категория as 'Категория', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.',Для_авто as 'Для автомобиля', Размеры, Характеристики from autorun2.Товары where Остаток_шт<=8 order by Остаток_шт;");::getSingleton()->fillTable(dataGridView5, "select Код_товара as 'Код товара', Категория as 'Категория', Брэнд, Название_товара as 'Наименование товара', Стоимость_закупки as 'Стоимость закупки', Стоимость_продажи as 'Стоимость продажи', Остаток_шт as 'Остаток шт.',Для_авто as 'Для автомобиля', Размеры, Характеристики from autorun2.Товары where Остаток_шт=0 order by Остаток_шт;");

}: System::Void button22_Click_2(System::Object^ sender, System::EventArgs^ e) {

//выполняем sql запрос к базе для добавления введенных данных на сервер в базу

if (comboSkidka->Text == "5") {

try {

MySqlDataReader^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.05 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");

while (myReader->Read()) {

}

MessageBox::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 5%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "10") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.1 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 10%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "15") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.15 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 15%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "20") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.2 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 20%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "25") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.25 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 25%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "50") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.5 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 50%");

}(Exception^ ex) {::Show(ex->Message);

}

}(comboSkidka->Text == "70") {{^ myReader = ConnToDB::getSingleton()->doSQLCommand("update autorun2.товары set Стоимость_продажи=Стоимость_продажи-Стоимость_продажи*0.7 where Название_товара='" + this->lbl_mask_name->Text + "' and Брэнд ='" + this->lbl_brend_mask->Text + "';");(myReader->Read()) {

}::Show("На товар'" + this->lbl_mask_name->Text + "' производителя '" + this->lbl_brend_mask->Text + "' установлена скидка 70%");

}(Exception^ ex) {::Show(ex->Message);

}

}>Text = "";

}

};

}

Приложение 3


Программный код ConnToDB.cpp:

#include "stdafx.h"

#include "ConnToDB.h"::ConnToDB() {

//соединяемся с БД::String^ connString = L"datasource=localhost;port=3306; username=root;password=160795ad";= gcnew MySql::Data::MySqlClient::MySqlConnection(connString);>Open();

}^ ConnToDB::getSingleton() {(instance == nullptr) {= gcnew ConnToDB();

}instance;

}::Data::MySqlClient::MySqlConnection^ ConnToDB::getConnection() {connection;

}::Data::MySqlClient::MySqlDataReader^ ConnToDB::doSQLCommand(System::String^ command) {();= getSQLCommand(command)->ExecuteReader();reader;

}::Data::MySqlClient::MySqlCommand^ ConnToDB::getSQLCommand(System::String^ command) {gcnew MySql::Data::MySqlClient::MySqlCommand(command, connection);

}ConnToDB::closeReader() {(reader != nullptr && !reader->IsClosed) {>Close();

}(connection->State == System::Data::ConnectionState::Closed) {>Open();

}

}ConnToDB::fillTable(System::Windows::Forms::DataGridView^ table, System::String^ command) {{closeReader();::Data::MySqlClient::MySqlDataAdapter^ sda = gcnew MySql::Data::MySqlClient::MySqlDataAdapter(getSQLCommand(command));::Data::DataTable^ dbdataset = gcnew System::Data::DataTable();>Fill(dbdataset);::Windows::Forms::BindingSource^ bSource = gcnew System::Windows::Forms::BindingSource();>DataSource = dbdataset;>DataSource = bSource;>Update(dbdataset);

}(System::Exception^ ex) {::Windows::Forms::MessageBox::Show(ex->Message);

}

}::~ConnToDB() {connection->Close();

}

 


Приложение 4


Программный код DateAdapter.cpp:

#include "stdafx.h"

#include "DateAdapter.h"namespace AutoRUNapp;::DateAdapter(DateTimePicker^ datePicker) : picker(datePicker) {}::String ^ AutoRUNapp::DateAdapter::getDate() {picker->Value.ToString("yyyy-MM-dd");

}

Приложение 5


Программный код Command.h:

#pragma onceAutoRUNapp {namespace System::Windows::Forms;ref class Command abstract {:~Command() {}void execute() = 0;void undo() = 0;

};ref class NavigateCommand : public Command {:^ browser;::String^ url;:(WebBrowser^ browser, System::String^ url) : browser(browser), url(url) {}

~NavigateCommand() {}execute() override {>Navigate(url);

}

};ref class ForwardCommand : public Command {:^ browser;:(WebBrowser^ browser) : browser(browser) {}

~ForwardCommand() {}execute() override {>GoForward();

}undo() override {>GoBack();

}

};ref class BackCommand : public Command {:^ browser;:(WebBrowser^ browser) : browser(browser) {}

~BackCommand() {}execute() override {>GoBack();

}undo() override {>GoForward();

}

};

}

Похожие работы на - Разработка автоматизированной системы для магазина автозапчастей

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!