Розробка програмного забезпечення розрахунку прибутку перукарні

Загальна характеристика інформаційної підтримки перукарні. Розгляд основ створення програмної системи для розрахунку прибутку. Опис табличного та графічного вигляду запитів та звітів. Використання мови програмування Visual С++, Visual С#; СУБД ACCES.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 11.01.2015
Размер файла 3,0 M

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

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

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

Міністерство освіти і науки України

Державний вищий навчальний заклад

"Криворізький національний університет"

Кафедра інформатики та прикладного програмного забезпечення

Курсова робота

Розробка програмного забезпечення розрахунку прибутку перукарні

Студента 4 курсу

ФІТ групи ПЗАС-10-3

Будніка Дмитра Васильовича

Керівник курсової роботи

к.е.н., доцент Лисенко В.С.

Кривий Ріг 2013

Завдання на курсову роботу

перукарня прибуток програма visual

Дисципліна "Програмування клієнт-серверних додатків"

Тема курсової роботи "Розробка програмного забезпечення розрахунку прибутку перукарні"

Мета роботи: створення програмного забезпечення розрахунку прибутку перукарні; табличний та графічний вигляд запитів та звітів; мова програмування Visual С++, Visual С#; СУБД ACCES.

Реферат

Буднік Дмитро Васильович

Розробка програмного забезпечення розрахунку прибутку перукарні

Курсова робота студента 4 курсу спеціальності "Програмна інженерія" з дисципліни "Програмування клієнт-серверних додатків". "Криворізький національний університет". Кривий Ріг, 2013.

Обсяг роботи 30 сторінок, 8 таблиць, 25 рисунків, 19 джерел, 12 додатків.

Предмет дослідження: інформаційна підтримка процесу управління перукарні.

Об'єкт дослідження: перукарня.

Мета роботи: Створення програмного забезпечення розрахунку прибутку перукарні.

Методи дослідження: методи об'єктоно-орієнтованого проектування, методика проектування баз даних, методи дослідження операцій.

Програмне забезпечення: мова програмування Visual С++, Visual С#, Microsoft Access.

Результати та їх новизна: спроектовано базу даних та створено програмне забезпечення управління перукарнею.

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

Ключові слова: перукарня, СУБД, програмне забезпечення, Visual С++, Visual С#.

Зміст

  • Вступ
  • Розділ І. Постановка задачі
    • 1.1 Характеристика задачі
    • 1.2 Вхідна інформація
    • 1.3 Вихідна інформація
  • Розділ ІІ. Розробка алгоритму розвязання задачі
    • 2.1 Розробка алгоритму розв'язання задачі на мові програмування Visual С++
    • 2.2 Розробка алгоритму розв'язання задачі на мові програмування Visual С#
  • Розділ ІІІ. Організація інформаційного забезпечення
    • 3.1 Загальна характеристика інформаційного забезпечення
    • 3.2 Структура баз даних та інформаційних масивів
  • Розділ IV. Розробка програмного забезпечення задачі
    • 4.1 Опис головного модулю програми (головного вікна) на мові Visual С++
    • 4.2 Опис головного модулю програми (головного вікна) на мові Visual С#
  • Висновки
  • Список використаних джерел
  • Додатки

Вступ

Інформація - явище незрівнянно більш древнє, ніж сама людина. Уже природа у процесі своєї еволюції передавала закодовану інформацію в рослинах і живих організмах.

З перших своїх кроків люди шукають і знаходять нові засоби передачі, збереження та обробки інформації.

Однак ніколи раніше людство не накопичувало інформацію й знання настільки стрімкими темпами.

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

На сучасному етапі можна без особливих труднощів навести приклади використання інформаційних технологій у всі галузях: від освіти і до менеджменту.

Сьогодні успіх буде мати та фірма, той заклад, який володіє найсучаснішими комп'ютерними технологіями. Значного прогресу можна досягти і в галузі освіти з впровадженням відповідних інформаційних комп'ютерних технологій, які зможуть зробити процес здобуття освіти більш гнучким, індивідуалізованим і одночасно нададуть змогу студентам використовувати глобальні ресурси для навчання, спілкуватись та обмінюватись досвідом із студентами інших міст, країн тощо.

Насправді, перспективи розвитку інформаційних комп'ютерних технологій безмежні.

Мета курсової роботи - створення програмного забезпечення розрахунку прибутку перукарні.

Головні завдання роботи: автоматизація розрахунку прибутку перукарні; вивід в окремій таблиці прибуток від окремого перукаря; вироблення основних вимог до програмного забезпечення в цій галузі. Як об'єкти досліджень в роботі виступають перукарі.

Предметом дослідження даної роботи є інформаційна підтримка перукарні.

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

Програмна система, що розроблятиметься, буде призначена для полегшення та покращення обліку.

Програмний продукт буде розроблено за допомогою інструментальних засобів розробки мови програмування Visual С++ та Visual C#.

Розділ І. Постановка задачі

1.1 Характеристика задачі

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

На меті є програмний комплекс, який би мав такі характерні риси:

а) простий та зрозумілий інтерфейс;

б) робота з базою даних;

в) вивід діаграми;

г) пошук даних.

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

1.2 Вхідна інформація

Вхідні данні представляють собою інформацію про підприємство, а також ті данні яки необхідно обчисляти, та аналізувати.

Для найбільшої ефективності, необхідна вся важлива первісна інформація.

Для проектування ефективної роботи перукарні вхідними даними виступають показники таких таблиць як "Услуги"(послуги)- таблиця 1.1, "Сотрудники"(співробітники)- таблиця 1.2, "Заказы"(замовлення) - таблиця 1.3.

В них зібрана вся довідкова інформація про працівників,пропозиції та замовлення.

Перелік і опис вхідних повідомлень

Таблиця 1.1

Таблиця "Услуги"(Послуги)

№ п/п

Назва Вхідного повідомлення

Ідентифікатор

Форма представлення

Частота Оновлення

Джерело

1

Код послуги

IDy

Таблична

При реєстрації нової послуги

Перукар

2

Назва послуги

Tip

Таблична

При реєстрації нової послуги

Перукар

3

Вартість послуги

Stoimost

Таблична

При реєстрації нової послуги

Перукар

Таблиця 1.2

Таблиця "Сотрудники" (Співробітники)

№ п/п

Назва Вхідного повідомлення

Ідентифікатор

Форма представлення

Частота оновлення

Джерело

1

Код співробітника

IDsotr

Таблична

При реєстрації нового співробітника

Перукар

2

Прізвище співробітника

Fam

Таблична

При реєстрації нового співробітника

Перукар

3

Ім'я співробітника

Name

Таблична

При реєстрації нового співробітника

Перукар

4

Дата народження

Datarog

Таблична

При реєстрації нового співробітника

Перукар

5

Мобільний номер

Mobnum

Таблична

При реєстрації нового співробітника

Перукар

Таблиця 1.3

Таблиця "Заказы"(замовлення)

№ п/п

Назва Вхідного повідомлення

Ідентифікатор

Форма представлення

Частота оновлення

Джерело

1

Код замовлення

IDzak

Таблична

При реєстрації нового замовлення

Перукар

2

Дата замовлення

Datazak

Таблична

При реєстрації нового замовлення

Перукар

3

Код співробітника

IDsotr

Таблична

При реєстрації нового замовлення

Перукар

4

Код послуги

IDy

Таблична

При реєстрації нового замовлення

Перукар

1.3 Вихідна інформація

Вихідна інформація представляє собою результати роботи з базою даних.

У даному проекті вихідною інформацією є розрахований прибуток від кожної послуги окремо, прибуток від послуг по дням, прибуток від кожного співробітника по дням, а також загальний прибуток співробітників.

Характеристика вихідних повідомлень наведена у таблиці 1.4.

Таблиця 1.4

Перелік і опис вихідних повідомлень

№ п/п

Назва вхідного повідомлення

Ідентифікатор

Форма представлення

Термін і частота надходження

Джерело

1

Прибуток від послуг

SUM

Таблична

Генерується після виконання послуги

Перукар

2

Прибуток співробітників

SUM

Таблична

Генерується після виконання послуги

Перукар

Розділ ІІ. Розробка алгоритму розвязання задачі

2.1 Розробка алгоритму розв'язання задачі на мові програмування Visual С++

Робота з програмою здійснюється на основі управління через об'єкти типу ListBox та Button, зображених на рис. 2.1 та рис. 2.2.

Рис. 2.1. Управління через об'єкт типу ListBox

Рис. 2.2. Управління через об'єкти типу Button

Редагування, додавання та видалення інформації можливе лише при виконанні SQL-запиту (дивись рис. 2.3). Треба спочатку вписати SQL-запит у текстове поле, потім натиснути відповідну кнопку.

Рис. 2.3. Редагування, додавання та видалення інформації з бази даних

Як видно з рисунку 2.3. у програмі є можливість пошуку та сортування даних обраної таблиці.

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

Рис. 2.4

Опис алгоритму:

1. Початок - це відкриття нашої програми.

2. Створення головного вікна програми - малюється головне вікно програми.

3-4. Підключення бази даних - підключається база даних, котру обере користувач.

5-6. Якщо успішне підключення то ми продовжуємо роботу з програмою, в протилежному випадку є можливість обрати іншу базу даних.

7. З'являється Форма-1, в котрій є можливість роботи за базою даних: відображення таблиць, запитів, створення запитів на видалення, додавання,редагування даних.

8. При на тисненні кнопки "График", в нас з'явиться Форама-2.

9. Форма 2 - в цій формі відображається діаграма.

10. Діаграма з Форми-2 відображається на екрані.

11. Кнопка завершення роботи з програмою.

12. Кінець роботи з програмою.

2.2 Розробка алгоритму розв'язання задачі на мові програмування Visual С#

Робота з програмою здійснюється на основі управління через об'єкти типу ListBox та Button, зображених на рис. 2.5 та рис. 2.6.

Рис. 2.5. Управління через об'єкт типу ListBox

Рис. 2.6. Управління через об'єкти типу Button

Редагування, додавання та видалення інформації можливе е при виконанні SQL-запиту (дивись рис. 2.7) або через об'єкт типу bindingNavigator(дивись рис. 2.8). Треба спочатку вписати SQL-запит у текстове поле, потім натиснути кнопку "Выполнить".

Рис. 2.7. Редагування, додавання та видалення інформації з бази даних

Рис. 2.8. Робота з даними бази даних за допомогою об'єкту bindingNavigator

Як видно з рисунку 2.8, дані можна додавати , видаляти та редагувати.

Щоб зберегти зміни треба клацнути на зображення дискети.

Нижче приведений програмний код збереження даних в базу даних:

dbCon.Open();

if (MessageBox.Show("Вы хотите сохранить изменения в базе данных?",

"Сохранение", MessageBoxButtons.YesNo,

MessageBoxIcon.Question) == DialogResult.Yes) dbAdapter1.Update(dataTable);

dbCon.Close();

При натисканні на , в нас з'являється повідомлення, при натисненні "Да" - зміни зберігаються, але якщо натиснути на "Нет" зміни не будуть збережені в базі даних, й вона прийме вид, котрий був при початку роботи з базою.

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

Рис. 2.9

Опис алгоритму:

1. Початок - це відкриття нашої програми.

2. Створення головного вікна програми - малюється головне вікно програми.

3-4. Підключення бази даних - підключається база даних за замовчуванням.

5-6. Якщо успішне підключення то ми продовжуємо роботу з програмою, в протилежному випадку є можливість обрати іншу базу даних.

7. З'являється Форма-1, в котрій є можливість роботи за базою даних: відображення таблиць, запитів, створення запитів на видалення, додавання,редагування даних .

8. При на тисненні кнопки "График", в нас з'явиться Форама-2.

9. Форма 2 - в цій формі відображається діаграма.

10. Діаграма з Форми-2 відображається на екрані.

11. Кнопка завершення роботи з програмою.

12. Кінець роботи з програмою.

Розділ ІІІ. Організація інформаційного забезпеченн

3.1 Загальна характеристика інформаційного забезпечення

Вся необхідна інформація в базі даних розміщена у вигляді таблиці 3.1. База даних створена у форматі Microsoft Access (.mdb)

Таблиця 3.1

Перелік і опис таблиць бази даних

№ п/п

Назва таблиці

Ідентифікатор

Опис

1

Замовлення

Заказы

Інформація про замовлення послуг: номер,дата,співробітник та послуга.

2

Співробітники

Сотрудники

Інформація про робітників: код, прізвище, ім'я, дата народження,номер телефону.

3

Послуги

Услуги

Інформація про види послуг: код , назва, вартість.

Для контролю введення інформації використовується "унікальність полів", тобто в таблиці, наприклад, не може бути однакового коду робітника. Також таблиці реляційно зв'язані між собою.

3.2 Структура баз даних та інформаційних масивів

База даних, використана для роботи програми, складається з трьох таблиць: Замовлення,Робітники, та Послуги.

Таблиця "Замовлення" має ідентифікатор "Заказы". Її структура наведена у таблиці 3.2.

Таблиця "Послуги" має ідентифікатор "Услуги". Її структура наведена у таблиці 3.3.

Таблиця "Робітники" має ідентифікатор "Сотрудники". Її структура наведена у таблиці 3.4.

Таблиця 3.2

Опис структури таблиці "Замовлення"

Найменування

Поле

Тип поля

Довжина

Кількість знаків після десятинної точки

Первинний ключ

Умова на значення

Обов'язкове поле

Індексне поле

1

2

3

4

5

6

7

8

9

Номер

IDzak

Лічильник

+

-

+

+

Дата

Datazak

Дата/Час

-

-

+

-

Код Робітника

IDsotr

Числове

0

-

-

+

-

Код Послуги

IDy

Числове

0

-

-

+

-

Таблиця 3.3

Опис структури таблиці "Послуги"

Найменування

Поле

Тип поля

Довжина

Кількість знаків після десятинної точки

Первинний ключ

Умова на значення

Обов'язкове поле

Індексне поле

1

2

3

4

5

6

7

8

9

Код послуги

IDy

Лічильник

+

-

+

+

Тип послуги

Tip

Текстове

50

-

-

+

+

Вартість

Stoimost

Грошове

-

-

+

-

Таблиця 3.4

Опис структури таблиці "Робітники"

Найменування

Поле

Тип поля

Довжина

Кількість знаків після десятинної точки

Первинний ключ

Умова на значення

Обов'язкове поле

Індексне поле

1

2

3

4

5

6

7

8

9

Код робітника

IDsotr

Лічильник

+

-

+

+

Прізвище

Fam

Текстове

50

-

-

+

+

Ім'я

Name

Текстове

50

-

-

+

-

Дата народження

Datarog

Дата/Час

-

-

+

-

Номер телефону

Mobnum

Текстове

20

-

-

+

-

Таблиці бази даних зв'язані між собою (рис 3.2).

Рис. 3.2.Реляційний зв'язок таблиць БД.

Розділ IV. Розробка програмного забезпечення задачі

4.1 Опис головного модулю програми (головного вікна) на мові Visual С++

Рис 4.1. Головне вікно програми

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

При натисненні кнопки "Выбор БД" запускається функція OnOpenDb(), яка відкриває діалог, в котрому обирається база даних. Після того, як відкривається База Даних, стають активні елементи для роботи з базою даних (див. рис. 4.2):

a) "Сортировка";

b) "Запрос на выполнение";

c) "Запрос на выборку";

d) "Поиск";

e) "Доход от услуг";

f) "Доход по дням";

g) "Доход от сотрудников по дням";

h) "Общий доход от сотрудников".

Рис. 4.2. DataGrid з даними після відкриття БД.

Як видно за малюнку що вище, в нас є можливість відсортувати дані по обраному стовбцю. Для цього необхідно ввести в текстове поле стовпця, по якому необхідно відсортувати дані та нажати на СheckBox.

При виконані заитів на виконання та вибірку діє перевірка. Наприклад якщо натиснути на запит вивконаня в нас діє такая перевірка:

if (str.Mid(0,3).Compare("SEL")==0)

{MessageBox("Команда SELECT недопустима для этой кнопки");return;}

if (str.Mid(0,3).Compare("DEL")==0)

{ str1 = "DELETE FROM <таблица> [ where<условие> ]";

kod = 1; }

if (str.Mid(0,3).Compare("UPD")==0)

{

str1 = "UPDATE <таблица> SET <поле>=<выражение>, [<поле>=<выражение>,]... [where<условие>]";

kod=2;

}

if (str.Mid(0,3).Compare("INS")==0)

{ str1 = "INSERT INTO <таблица> (<список имен полей>) VALUES (<список значений>)";

kod=3;}

if (str.Mid(0,3).Compare("CRE")==0)

{ str1 = "CREATE TABLE <таблица> (<имя поля1> <тип>, < имя поля 2> < тип >... )";

kod=4;

}

if (str.Mid(0,3).Compare("DRO")==0)

{str1 = "DROP TABLE <Таблица>";

kod=5; }

Якщо ми ввели в поле запит не на виконання то нам висвітиться про не відповідність запиту (див. рис. 4.3.).

Рис. 4.3. Перевірка в запиті на виконання

Якщо в нас буде введена не вірна структура запиту, тоді з'явиться строка з синтаксисом запиту (див. рис. 4.4.).

Рис. 4.4. Підсказка синтаксису запиту

Як видно з малюнку вище в текстовому полі нам висвітився синтаксис запроса на додавання запису до БД, аналогічні синтаксиси будуть з'являтися якщо ми введемо не вірно запит на: видалення, редагування даних. Це дуже зручно адже не завжди пам'ятаєш синтаксис кожної операції.

Для того щоб підрахувати : прибуток від послуг, прибуток по дням, прибуток співробітників по дням та загальний прибуток співробітників, необхідно клацнути на відповідну кнопку в панелі "Робота с БД".

Для пошуку даних треба натиснути у формі на кнопку "Поиск". Перед цим обравши таблицю пошуку, та в текстовому полі ввести назву поля та його значення, після чого в нас здійметься пошук й про результат нас проінформує повідомлення (див рис. 4.5.).

Рис. 4.5. Пошук даних в таблиці

При перегляді загального прибутку від співробітників в нас з'являється ще одна кнопка "График" (дивись рис. 4.6.).

Рис. 4.6. DataGrid з даними при перегляді загального прибутку.

При натисканні на кнопку "График", в нас з'являється нове вікно, в якому відображається діаграма по даним загального прибутку від співробітників (дивись рис. 4.7.)

Рис. 4.7. Графік по загальному прибутку від співробітників

Будування графіку виконується за допомогою наступного коду:

double sum=0;

for( i=0;i<Doc->n;i++)sum+=Doc->mas[i];

for(i=0;i<Doc->n;i++)kof[i]=(100*Doc->mas[i])/sum;

for(i=0;i<Doc->n;i++)otr[i]=(360*kof[i])/100;

double data;

srand(time(0));

GLUquadricObj *quadObj;

quadObj = gluNewQuadric();

gluQuadricDrawStyle(quadObj, GLU_FILL);

data=90;

int r,g,b;

for(i=0;i<Doc->n;i++)

{r=colorArray[i];

g=(colorArray[i])>>8;

b=(colorArray[i])>>16;

glColor3ub(r,g,b);

gluPartialDisk(quadObj, 0, 0.5, 15, 1,data,otr[i]);

data+=otr[i];}

В цьому коді ми спочатку підраховуємо необхідні значення для малювання круговою діаграми, а потім вже малюємо саму діаграму за допомогою функціїї gluPartialDisk().

4.2 Опис головного модулю програми (головного вікна) на мові Visual С#

При старті програми в нас з'являється головне вікно програми (див. рис. 4.8).

Рис. 4.8. Головне вікно програми

Головне вікно одразу заповнюється даними котрі знаходяться в базі даних. Для того щоб переключатись між таблицями, необхідно клікнути на необхідну таблицю в об'єкті ListBox "Таблицы", й записи цієї таблиці відобразяться в об'єкті DataGrid.

Також в є можливість підрахунку різних видів прибутку:

a) від послуг;

b) по дням;

c) співробітників по дням;

d) загальний прибуток співробітників.

Підрахунок прибутку від послуг здійснюється за допомогою SQL_запиту до бази даних та відображається на екрані (див. рис. 4.9). При натисненні на кнопку "Доход от услуг" викликається функція запиту до бази даних zapros(string str), в котру ми передаємо строку з запитом до бази даних.

Код підрахунку прибутку від послуг виглядає наступним чином:

zapros("SELECT Услуги.Tip, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Услуги.Tip ORDER BY Услуги.Tip, Sum(Услуги.Stoimost)");

Рис. 4.9. Відображення прибутку від послуг

При натисканні на кнопку "Общий доход по сотрудникам" (див. рис. 4.10.) в нас виконуються майже ті самі дії, що і при натисканні кнопки "Доход от услуг".

Рис. 4.10. Відображення загального прибутку по перукарям

Змінюється лише запит до бази даних, котрий виглядає наступним чином:

zapros("SELECT Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Услуги INNER JOIN (Сотрудники INNER JOIN Заказы ON Сотрудники.IDsotr = Заказы.IDsotr) ON Услуги.IDy = Заказы.IDy GROUP BY Сотрудники.Fam ORDER BY Sum(Услуги.Stoimost) DESC");

В цьому запиті ми з'єднуємо таблиці бази даних, та отримуємо виручку від перукарів за весь період.

Для того щоб отримати прибуток від перукарів по дням, необхідно клацнути на кнопку "Доход сотрудников по дням" (див. рис. 4.11.).

Рис. 4.11. Прибуток від перукарів по дням

Запит підрахунку прибутку від перукарів по дням виглядає так:

zapros("SELECT Заказы.Datazak, Сотрудники.Fam, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Заказы.Datazak, Сотрудники.Fam ORDER BY Заказы.Datazak, Sum(Услуги.Stoimost) DESC");

Завдяки цьому запиту ми отримуємо дані про те скільки грошей та в який день кожен перукар заробив.

Також є можливість підрахунку загальною суми прибутку за день. Для цього необхідно клацнути на кнопку "Доход по дням" (рис. 4.12.). Після чого в нашому вікні відобразиться вся інформація прибутку котрий ми отримує в окремий день.

Ця інформація відображається в елементі DataGridWiev, кожен день відображається на новому рядку. Дані можна відсортувати по даті заказів або по їх загальній сумі, для цього необхідно клікнути на заголовок стовпця, й поруч з заголовком з'явиться стрілка вверх (сортування даних від мінімально до максимально) або стрілка вгору (сортування даних відповідного стовпця від максимального значення до мінімального).

Рис. 4.12. Прибуток по дням

Запит до бази даних для підрахунку прибутку по дням виглядає наступним чином:

zapros("SELECT Заказы.Datazak, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Заказы.Datazak ORDER BY Заказы.Datazak");

В цьому запиті ми об'єднуємо таблиці "Сотрудники", "Услуги" та "Заказі", та групую записи по полю дати, також здійснюється сортування даних від меншої до більшої дати.

Після підрахунку прибутку від послуг та загального прибутку від співробітників, є можливість відображення цих даних на діаграмі. Для цього необхідно клікнути на кнопку "График", яка появиться в нашому вікні (див. рис. 4.13.).

При натисканні на кнопку "Графік" виконуються наступний код:

a = new string[dataGridView1.RowCount];

b = new float[dataGridView1.RowCount];

n = dataGridView1.RowCount+1;

for (int i = 0; i < dataGridView1.RowCount-1; i++)

{a[i] = dataGridView1[0, i].Value.ToString();

b[i] = float.Parse(dataGridView1[1, i].Value.ToString());}

Form2 f2 = new Form2();

f2.temp(a, b, n);

f2.Show();

Завдяки цьому коду ми зчитуємо дані прибутку з нашого DataGridView та записуємо їх у змінні і передаємо у Форму-2 й викликаємо саму форму(див. рис. 4.14.).

Рис. 4.13. Вікно з кнопкою "График"

Рис. 4.14. Вікно з діаграмою по прибутку перукарів за весь час

Як видно з рисунку вище, в нас відображається кругова діаграма з легендою по загальному прибутку від перукарів. Відповідний запис підсвічується відповідним кольором сектору діаграми.

В нас є можливість відобразити кругову діаграму по загальному прибутку від послуг (див. рис. 4.15), для цього необхідно клацнути кнопку "Доход от услуг" на Формі-1.

Рис. 4.15. Вікно з діаграмою по загальному прибутку від послуг

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

Висновки

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

Для реалізації задачі було створено базу даних з трьох таблиць, призначену для зберігання вхідної інформації. Відповідно до розробленої моделі, був визначений алгоритм побудови програми. Для його реалізації було обрано мови програмування Visual С++ та Visual С#. В якості СУБД для роботи зі створеною базою даних було використано Microsoft Access.

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

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

Список використаних джерел

1. Секунов Н.Ю. Самоучитель Visual C++ 6. - СПб.: БХВ - Санкт-Петербург, 1999. - 960 с.

2. Абрамян М. Visual C# на примерах. - СПб.: БХВ-петербург, 2008. - 496с.

3. Агуров П. C#. Разработка компонентов в MS Visual Studio 2005/2008. - СПб.: БХВ-петербург, 2008. - 480с

4. Павловская Т.А. C#. Программирование на языке высокого уровня. Учебник для вузов. - СПб.: Питер, 2007. - 432 с.

5. Шкарина Л.Ш. Язык SQL: учебный курс. - СПб.: Питер, 2001. - 592 с.: ил.

6. Страуструп Б. Язык программирования C++. - СПб.: БИНОМ, 1999. - 991 с.

7. Павловская Т.А. С/С++. Программирование на языке высокого уровня. - СПб.: Питер, 2003. - 461 с.

8. Джон Вейскас. Эфективная работа с Access 7.0. - Санкт-Петербург: Питер, 1997.-830с.

9. Уэйт М. Язык С. Руководство для начинающих. / М. Уэйт, С. Прага, Д. Мартин. - М.: Мир, 1995. - 521 с.: ил.

10. Фридман А.Л. Язык программирования С++ / А.Л.Фридман. - М.: Бином, 2006. - 523 с.: ил.

11. OpenGL. Суперкнига, 3-е издание.: Пер. с англ - М.: Издательский домм "Вильямс", 2006. - 1040с. : ил. - Парал. тит. англ.

12. Программирование для Microsoft Windows на С#/ Петцольд Ч. - М.: Издательско-торговый дом "Русская Редакция", 2002 - В 2-х т. Т. 1. - 576 с.

13. Холзнер С. Visual C++ 6: учебный курс - СПб: ЗАО "Издательство "Питер"", 1999. - 576 с.

14. Грегори К. Использование Visual C++ 6. Учебное пособие - СПб: К.: Издательский дом "Вильямс", 1999. - 864 с.

15. Олафсен Ю., Скрайбнер К., Уайт К. MFC и Visual C++ 6. Энциклопедия программиста - СПб.: ООО "ДиаСофтЮП", 2003. - 992 с.

16. Секунов Н.Ю. Самоучитель Visual C++ 6. - СПб.: БХВ - Санкт-Петербург, 1999. - 960 с.

17. Зеленский А.С., Лысенко В.С., Баран С.В. Методические указания к выполнению лабораторных и индивидуальных работ на основе типовых примеров разработки программного обеспечения в Visual C++ 6.0 по дисциплине "Новые информационные технологии" для магистров специальности "Экономическая кибернетика" (программа "Информационный менеджмент") // ГВУЗ "КНЭУ имени Вадима Гетьмана" Криворожский экономический институт - Кривой Рог: КЭИ - 2007. - 63 с.

18. Зеленский А.С., Лысенко В.С., Баран С.В. Методические указания для самостоятельного изучения работы с базами данных на Visual C++ с использованием объектов ActiveX Data Object (ADO) по дисциплинам "Мониторинг информационных технологий", "Информационные системы в экономике", "Автоматизация проэктирования информационных систем" // ГВУЗ "КНЭУ имени Вадима Гетьмана" Криворожский экономический институт - Кривой Рог: КЭИ - 2008. - 54 с.

19. Зеленский А.С., Лысенко В.С. Методические указания использования объектов ADO при работе с базами данных на Visual C++ в примерах по дисциплинам: "Мониторинг информационных технологий", "Информационные системы в экономике", "Автоматизация проэктирования информационных систем" (практическая основа для выполнения лабораторних, индивидуальных, курсових и дипломних работ) // ГВУЗ "КНЭУ имени Вадима Гетьмана" Криворожский экономический институт - Кривой Рог: КЭИ - 2008. - 65 с.

Додатки

Додаток А

StdAfx.h

#if !defined(AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_)

#define AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define VC_EXTRALEAN// Exclude rarely-used stuff from Windows headers

#include <afxwin.h> // MFC core and standard components

#include <afxext.h> // MFC extensions

#include <afxdisp.h> // MFC Automation classes

#include <afxdtctl.h>// MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h>// MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

#include "msado15.tlh"

using namespace ADODB;

#include <GL\gl.h>

#include <GL\glu.h>

#include <GL\glut.h>

#include <GL\glaux.h>

#pragma comment(lib, "opengl32.lib")

#pragma comment(lib, "glu32.lib")

#pragma comment(lib, "glaux.lib")

#pragma comment(lib, "glut32.lib")

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__1D726032_C1AA_4045_BFA7_E5A896B6D590__INCLUDED_)

Додаток В

MainFrm.h

#include "Grafik.h"

#if !defined(AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_)

#define AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CMainFrame : public CFrameWnd

{protected: // create from serialization only

CMainFrame();

DECLARE_DYNCREATE(CMainFrame)

// Attributes

public:

Grafik *graf;

PIXELFORMATDESCRIPTOR pfd;

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CMainFrame)

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CMainFrame();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected: // control bar embedded members

CStatusBar m_wndStatusBar;

CToolBar m_wndToolBar;

// Generated message map functions

protected:

//{{AFX_MSG(CMainFrame)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MAINFRM_H__6646B85B_45EA_409F_8A2A_D5EB66EB65FC__INCLUDED_)

Додаток С

kursovayaView.h

#if !defined(AFX_KURSOVAYAVIEW_H__20E5AAB1_F20B_4B8B_A6CA_DECD3E8A975E__INCLUDED_)

#define AFX_KURSOVAYAVIEW_H__20E5AAB1_F20B_4B8B_A6CA_DECD3E8A975E__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CKursovayaView : public CView

{protected: // create from serialization only

CKursovayaView();

DECLARE_DYNCREATE(CKursovayaView)

// Attributes

public:

CKursovayaDoc* GetDocument();

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CKursovayaView)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CKursovayaView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CKursovayaView)

// NOTE - the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()};

#ifndef _DEBUG // debug version in kursovayaView.cpp

inline CKursovayaDoc* CKursovayaView::GetDocument()

{ return (CKursovayaDoc*)m_pDocument; }

#endif

#endif

Додаток D

kursovayaDoc.h

#if !defined(AFX_KURSOVAYADOC_H__5EC4DE28_9A33_4AC5_B2C0_416A587C8496__INCLUDED_)

#define AFX_KURSOVAYADOC_H__5EC4DE28_9A33_4AC5_B2C0_416A587C8496__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class CKursovayaDoc : public CDocument

{

public: // create from serialization only

CKursovayaDoc();

DECLARE_DYNCREATE(CKursovayaDoc)

// Attributes

public:

_ConnectionPtr pConn;

_RecordsetPtr pRecordset;

FieldsPtr fields;

CString baza;

CString table;

int mas[200];

int n;

CString ms[200];

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CKursovayaDoc)

public:

virtual BOOL OnNewDocument();

virtual void Serialize(CArchive& ar);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CKursovayaDoc();

void ErrMessage(_com_error &ce);

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

// Generated message map functions

protected:

//{{AFX_MSG(CKursovayaDoc)

afx_msg void OnDdd();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif

Додаток E

Grafik.h

#if !defined(AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_)

#define AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_

#include "kursovayaDoc.h"

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "kursovayaDoc.h"

class Grafik : public CFrameWnd

{

DECLARE_DYNCREATE(Grafik)

protected:

// protected constructor used by dynamic creation

// Attributes

public:

Grafik();

void* mf;

long colorArray[17];

int i;

double proc[200];

double kof[200];

double otr[200];

CKursovayaDoc *Doc;

bool Init_3d();

// protected constructor used by dynamic creation

virtual ~Grafik();

// Operations

public:

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(Grafik)

protected:

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(Grafik)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnPaint();

afx_msg void OnSize(UINT nType, int cx, int cy);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_GRAFIK_H__E5B353C8_3870_4731_B7FE_0CA730C9A800__INCLUDED_)

Додаток F

Dlg.h

//{{AFX_INCLUDES()

#include "datagrid.h"

//}}AFX_INCLUDES

#if !defined(AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_)

#define AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_

#include "Grafik.h"

#include "MainFrm.h"

#include "kursovayaDoc.h"

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

class Dlg : public CDialog

{

// Construction

public:

Dlg(CWnd* pParent = NULL); // standard constructor

CKursovayaDoc*Doc;

virtual ~Dlg();

Grafik *graf;

CMainFrame *mfr;

// Dialog Data

//{{AFX_DATA(Dlg)

enum { IDD = IDD_DIALOG1 };

CListBoxm_pol;

CListBoxm_tab;

CEditm_editquery;

CDataGridm_datagrid;

_ConnectionPtr pConn;

_RecordsetPtr pRecordset;

FieldsPtr fields;

CString baza;

CString table;

//}}AFX_DATA

void Structura_BD();

void Connect_Baza(CString str);

void Recordset_Baza(CString str);

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(Dlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(Dlg)

afx_msg void OnOpenDb();

afx_msg void OnZaprosMake();

afx_msg void OnZaprosSelect();

afx_msg void OnFind();

afx_msg void OnGraf();

afx_msg void OnDohodOtUslug();

afx_msg void OnDohodPoDnyam();

afx_msg void OnDohodSotrPodnyam();

afx_msg void OnAllDohodSotr();

afx_msg void OnSelchangeTable();

afx_msg void OnSelchangePolya();

afx_msg void OnFirst();

afx_msg void OnLeft();

afx_msg void OnRight();

afx_msg void OnLast();

afx_msg void OnSort();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DLG_H__30EEC067_937F_4A1E_AF57_5C9ED66CE085__INCLUDED_)

Додаток G

MainFrm.cpp

#include "stdafx.h"

#include "kursovaya.h"

#include "MainFrm.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

//{{AFX_MSG_MAP(CMainFrame)

ON_WM_CREATE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

static UINT indicators[] =

{

ID_SEPARATOR, // status line indicator

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

CMainFrame::CMainFrame()

{

graf=0;

PIXELFORMATDESCRIPTOR

pfd1 =

{

sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

1, // version number

PFD_DRAW_TO_WINDOW | // support window

PFD_SUPPORT_OPENGL | // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0, 0, 0, 0, 0, 0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buffer

0, 0, 0, 0, // accum bits ignored

32, // 32-bit z-buffer

8, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0, 0, 0 // layer masks ignored

};

pfd = pfd1;// TODO: add member initialization code here

}

CMainFrame::~CMainFrame()

{

}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP

| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbar\n");

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\n");

return -1; // fail to create

}

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

return 0;

}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

if( !CFrameWnd::PreCreateWindow(cs) )

return FALSE;

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return TRUE;

}

// CMainFrame diagnostics

#ifdef _DEBUG

void CMainFrame::AssertValid() const

{

CFrameWnd::AssertValid();

}

void CMainFrame::Dump(CDumpContext& dc) const

{

CFrameWnd::Dump(dc);

}

#endif //_DEBUG

Додаток H

kurosvayaDoc.cpp

#include "stdafx.h"

#include "kursovaya.h"

#include "dlg.h"

#include "kursovayaDoc.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

IMPLEMENT_DYNCREATE(CKursovayaDoc, CDocument)

BEGIN_MESSAGE_MAP(CKursovayaDoc, CDocument)

//{{AFX_MSG_MAP(CKursovayaDoc)

ON_COMMAND(ID_DDD, OnDdd)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

CKursovayaDoc::CKursovayaDoc()

{

CoInitialize(NULL);

pConn = 0;

pRecordset = 0;

if(pConn.CreateInstance("ADODB.Connection"))

{

pConn = 0;

::MessageBox(0," Не выполнена инициализация Connection","Ошибка!!!",MB_ICONINFORMATION);

return;

}

pConn->ConnectionTimeout = 15000;

pConn->CommandTimeout = 15000;

pConn->CursorLocation = adUseClient;

pConn->Mode = adModeReadWrite;

if(pRecordset.CreateInstance(L"ADODB.RecordSet"))

{

::MessageBox(0,"Не выполнена инициализация Recordset","!!!!Ошибка!!!",MB_ICONINFORMATION);

pConn.Release();

pConn = 0;

pRecordset = 0;

}

baza = "";

table = "";

if(pConn==0)return;

}

CKursovayaDoc::~CKursovayaDoc()

{

}

void CKursovayaDoc::ErrMessage(_com_error &ce)

{

CString err="";

err+="\n";

err+="Source: ";

err+="\n";

::MessageBox(0,err,"Ошибка!!!",MB_ICONINFORMATION);

}

BOOL CKursovayaDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

return TRUE;

}

// CKursovayaDoc serialization

void CKursovayaDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

}

// CKursovayaDoc diagnostics

#ifdef _DEBUG

void CKursovayaDoc::AssertValid() const

{

CDocument::AssertValid();

}

void CKursovayaDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

void CKursovayaDoc::OnDdd()

{

Dlg dlg;

dlg.Doc = this;

dlg.pConn = pConn;

dlg.pRecordset = pRecordset;

dlg.DoModal();

}

Додаток J

Grafik.cpp

#include "stdafx.h"

#include "kursovaya.h"

#include "Grafik.h"

#include "MainFrm.h"

#include "Dlg.h"

#include "MainFrm.h"

#include <windows.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

IMPLEMENT_DYNCREATE(Grafik, CFrameWnd)

Grafik::Grafik()

{

colorArray[0] = 0x0000000L; colorArray[1] = 0x0AFAFAFL;

colorArray[2] = 0x0FF0000L; colorArray[3] = 0x000FF00L;

colorArray[4] = 0x00000FFL; colorArray[5] = 0x0FFFF00L;

colorArray[6] = 0x000FFFFL;

}

Grafik::~Grafik()

{

//((CMainFrame*)AfxGetMainWnd())->graf = 0;

}

BEGIN_MESSAGE_MAP(Grafik, CFrameWnd)

//{{AFX_MSG_MAP(Grafik)

ON_WM_CREATE()

ON_WM_PAINT()

ON_WM_SIZE()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

// Grafik message handlers

bool Grafik::Init_3d()

{

HGLRChrc;

int pixelformat;

CMainFrame* pp = (CMainFrame*)AfxGetMainWnd();

//if ((pixelformat = ChoosePixelFormat(GetDC()->GetSafeHdc(), &(pp->pfd))) == 0 ||

// SetPixelFormat(GetDC()->GetSafeHdc(), pixelformat, &pp->pfd) == FALSE)

//return false;

if ((pixelformat = ChoosePixelFormat(GetDC()->GetSafeHdc(), &(pp->pfd))) == 0 ||

SetPixelFormat(GetDC()->GetSafeHdc(), pixelformat, &pp->pfd) == FALSE)

return false;

::DescribePixelFormat(GetDC()->GetSafeHdc(), pixelformat, sizeof(pp->pfd), &(pp->pfd));

if (pp->pfd.cColorBits<16)return false;hrc = wglCreateContext(GetDC()->GetSafeHdc());

wglMakeCurrent(GetDC()->GetSafeHdc(), hrc);

glEnable(GL_DEPTH_TEST);

return true;

}

BOOL Grafik::PreCreateWindow(CREATESTRUCT& cs)

{

if (!CFrameWnd::PreCreateWindow(cs))

return FALSE;

cs.dwExStyle |= WS_EX_CLIENTEDGE;

cs.style &= ~WS_BORDER;

cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,

::LoadCursor(NULL, IDC_ARROW), HBRUSH(0), NULL);

return TRUE;

}

int Grafik::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

if(!Init_3d())MessageBox("Error");

return 0;

}

void Grafik::OnPaint()

{

CPaintDC dc(this);

// device context for painting

glPushMatrix();

glClearColor(1,1,1,1);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushAttrib(GL_ALL_ATTRIB_BITS);

double sum=0;

for( i=0;i<Doc->n;i++)sum+=Doc->mas[i];

for(i=0;i<Doc->n;i++)kof[i]=(100*Doc->mas[i])/sum;

for(i=0;i<Doc->n;i++)otr[i]=(360*kof[i])/100;

double data;

srand(time(0));

GLUquadricObj *quadObj;

quadObj = gluNewQuadric();

gluQuadricDrawStyle(quadObj, GLU_FILL);

data=90;

int r,g,b;

for(i=0;i<Doc->n;i++)

{

r=colorArray[i];

g=(colorArray[i])>>8;

b=(colorArray[i])>>16;

glColor3ub(r,g,b);

gluPartialDisk(quadObj, 0, 0.5, 15, 1,data,otr[i]);

data+=otr[i];

}

glEnd();

SwapBuffers(wglGetCurrentDC());

glPopAttrib();

glPopMatrix();

CRect rect;

CFont font;

GetClientRect(&rect);

font.CreatePointFont(140,"Arial");

dc.SelectObject(&font);

int z=40;

CBrush br;

br.CreateSolidBrush(colorArray[0]);

dc.SelectObject(&br);

CRect k;

for(i=0;i<Doc->n;i++)

{

br.DeleteObject();

dc.TextOut(rect.Width()-200,z,Doc->ms[i]);

br.CreateSolidBrush(colorArray[i]);

dc.SelectObject(&br);

dc.Rectangle(rect.Width()-230,z,rect.Width()-210,z+25);

//dc.FillRect(k,br);

z+=40;

}

// TODO: Add your message handler code here

// Do not call CFrameWnd::OnPaint() for painting messages

}

void Grafik::OnSize(UINT nType, int cx, int cy)

{

CFrameWnd::OnSize(nType, cx, cy);

if(cx>cy)

{

glViewport(0,0,cy,cy);

}

else

{

glViewport(0,(cy-cx)/2,cx,cx);

}

Invalidate(false);

}

Додаток K

Dlg.cpp

#include "stdafx.h"

#include "kursovaya.h"

#include "Dlg.h"

#include "time.h"

#include <sys/timeb.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

Dlg::Dlg(CWnd* pParent /*=NULL*/)

: CDialog(Dlg::IDD, pParent)

{

//{{AFX_DATA_INIT(Dlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

Dlg::~Dlg()

{

//exit(0);

}

void Dlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(Dlg)

DDX_Control(pDX, IDC_POLYA, m_pol);

DDX_Control(pDX, IDC_TABLE, m_tab);

DDX_Control(pDX, IDC_EDIT1, m_editquery);

DDX_Control(pDX, IDC_DATAGRID1, m_datagrid);

GetDlgItem(IDC_DOHOD_OT_USLUG)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_DOHOD_PO_DNYAM)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_DOHOD_SOTR_PODNYAM)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_ALL_DOHOD_SOTR)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_ZAPROS_MAKE)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_ZAPROS_SELECT)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_Find)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_Sort)->ShowWindow(SW_HIDE);

GetDlgItem(IDC_GRAF)->ShowWindow(SW_HIDE);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(Dlg, CDialog)

//{{AFX_MSG_MAP(Dlg)

ON_BN_CLICKED(IDC_OPEN_DB, OnOpenDb)

ON_BN_CLICKED(IDC_ZAPROS_MAKE, OnZaprosMake)

ON_BN_CLICKED(IDC_ZAPROS_SELECT, OnZaprosSelect)

ON_BN_CLICKED(IDC_Find, OnFind)

ON_BN_CLICKED(IDC_GRAF, OnGraf)

ON_BN_CLICKED(IDC_DOHOD_OT_USLUG, OnDohodOtUslug)

ON_BN_CLICKED(IDC_DOHOD_PO_DNYAM, OnDohodPoDnyam)

ON_BN_CLICKED(IDC_DOHOD_SOTR_PODNYAM, OnDohodSotrPodnyam)

ON_BN_CLICKED(IDC_ALL_DOHOD_SOTR, OnAllDohodSotr)

ON_LBN_SELCHANGE(IDC_TABLE, OnSelchangeTable)

ON_LBN_SELCHANGE(IDC_POLYA, OnSelchangePolya)

ON_BN_CLICKED(IDC_First, OnFirst)

ON_BN_CLICKED(IDC_Left, OnLeft)

ON_BN_CLICKED(IDC_Right, OnRight)

ON_BN_CLICKED(IDC_Last, OnLast)

ON_BN_CLICKED(IDC_Sort, OnSort)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

void Dlg::OnOpenDb()

{

CFileDialog OpenDialog(true, "", "",

OFN_FILEMUSTEXIST |OFN_HIDEREADONLY,

"Microsoft Access Database (*.mdb)|*.mdb|");

if (OpenDialog.DoModal()!=IDOK) return;

CString str_con = OpenDialog.GetPathName();

str_con.MakeLower ();

m_editquery.SetWindowText("");

int g;

while(1)

{

g = str_con.Find('\\',0);

if (g == -1)break;

str_con = str_con.Mid(g+1);

}

baza = str_con;

baza.MakeUpper();

str_con=("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");

str_con+=OpenDialog.GetPathName();

str_con+=";";

m_datagrid.SetRefDataSource(0);

try

{

Connect_Baza(str_con);

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

return;

}

GetDlgItem(IDC_DOHOD_OT_USLUG)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_DOHOD_PO_DNYAM)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_DOHOD_SOTR_PODNYAM)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_ALL_DOHOD_SOTR)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_ZAPROS_MAKE)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_ZAPROS_SELECT)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_Find)->ShowWindow(SW_SHOW);

GetDlgItem(IDC_Sort)->ShowWindow(SW_SHOW);

Structura_BD();// TODO: Add your control notification handler code here

}

void Dlg::OnZaprosMake()

{

struct _timeb timebuffer;

GetDlgItem(IDC_GRAF)->ShowWindow(SW_HIDE);

_ftime( &timebuffer );

double nach = timebuffer.time+timebuffer.millitm/1000.0;

CString str,str1;

int kod=0;

m_editquery.GetWindowText (str);

str.TrimLeft();

str.MakeUpper ();

if (str.Mid(0,3).Compare("SEL")==0)

{MessageBox("Команда SELECT недопустима для этой кнопки");return;}

if (str.Mid(0,3).Compare("DEL")==0)

{

str1 = "DELETE FROM <таблица> [ where<условие> ]";

kod = 1;

}

if (str.Mid(0,3).Compare("UPD")==0)

{

str1 = "UPDATE <таблица> SET <поле>=<выражение>, [<поле>=<выражение>,]... [where<условие>]";

kod=2;

}

if (str.Mid(0,3).Compare("INS")==0)

{

str1 = "INSERT INTO <таблица> (<список имен полей>) VALUES (<список значений>)";

kod=3;

}

if (str.Mid(0,3).Compare("CRE")==0)

{

str1 = "CREATE TABLE <таблица> (<имя поля1> <тип>, < имя поля 2> < тип >... )";

kod=4;

}

if (str.Mid(0,3).Compare("DRO")==0)

{

str1 = "DROP TABLE <Таблица>";

kod=5;

}

try

{

pConn->BeginTrans();

pConn->Execute((_bstr_t)str,0,adCmdText);

pConn->CommitTrans();

}

catch (_com_error &ce)

{

pConn->RollbackTrans();

Doc->ErrMessage(ce);

if(kod && str.GetLength()< 15)m_editquery.SetWindowText (str1);

m_editquery.SetFocus();

return;

}

if(pRecordset->GetState())pRecordset->Requery (-1);

_ftime( &timebuffer );

double conec = timebuffer.time+timebuffer.millitm/1000.0;

CString vr_zap;

vr_zap.Format(" Запрос выполнен за %f сек ",conec - nach);

MessageBox(vr_zap);

m_editquery.SetWindowText ("");// TODO: Add your control notification handler code here

}

void Dlg::OnZaprosSelect()

{

GetDlgItem(IDC_GRAF)->ShowWindow(SW_HIDE);

CString str_query;

m_editquery.GetWindowText(str_query);

str_query.MakeUpper ();

if (str_query.Mid(0,6).Compare("SELECT"))

{

MessageBox("В запросе на выборку отсутствует параметр SELECT","Ошибка!!!",MB_ICONINFORMATION );

m_editquery.SetWindowText("SELECT <*>|<имя поля> FROM <таблица>");

m_editquery.SetFocus();

return;

}

try

{

Recordset_Baza(str_query);

m_datagrid.SetRefDataSource(pRecordset);

}

catch(_com_error &ce)

{

MessageBox("erorrchik");

Doc->ErrMessage(ce);

}

m_editquery.SetFocus ();// TODO: Add your control notification handler code here

}

void Dlg::OnFind()

{

if(pRecordset->GetState()==0)return;

GetDlgItem(IDC_GRAF)->ShowWindow(SW_HIDE);

_variant_t bb = 0L;

CString str_query;

m_editquery.GetWindowText(str_query);

struct _timeb timebuffer;

_ftime( &timebuffer );

double nach = timebuffer.time+timebuffer.millitm/1000.0;

try

{

pRecordset->Find((_bstr_t)str_query,0L,adSearchForward,bb);

_ftime( &timebuffer );

double conec = timebuffer.time+timebuffer.millitm/1000.0;

CString vr_zap;

vr_zap.Format(" Поиск выполнен за %f сек",conec - nach);

MessageBox(vr_zap);

if(pRecordset->ADO_EOF)

MessageBox("Значение не найдено! Уазатель за концом БД (EOF = true)");

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

m_editquery.SetFocus ();

}// TODO: Add your control notification handler code here

}

void Dlg::OnGraf()

{

if(pRecordset->GetState()==0)return;

int kol_zap = pRecordset->GetRecordCount ();

if (!kol_zap)

{

MessageBox("И что мы собрались считать?!!!","Ошибка!!!",MB_ICONINFORMATION);

return;

}

long i;

int j;

_bstr_t zn;

_variant_t pol,vr;

pol = (long)0;

CString str="";

char buf[100];

try {

m_datagrid.SetRefDataSource(0);

double sum = 0;

int kol = 0;

j=0;

for(i = 0; i < kol_zap;i++)

{

vr = fields->GetItem(0L)->GetValue();

zn = "NULL";

if (vr.vt!= VT_NULL) zn = vr;

str+=zn;

Doc->ms[j]=str;

str="";

vr =fields->GetItem(1L)->GetValue();

Doc->mas[j]=atoi((_bstr_t)vr);

pRecordset->MoveNext();

j++;

}

Doc->n=j;

CRect rect;

GetWindowRect(&rect);

rect.OffsetRect(20,80);

graf = new Grafik;

//graf->mf = mfr;

graf->Doc=this->Doc;

graf->CreateEx(NULL,NULL,"Grafik",WS_VISIBLE|WS_OVERLAPPEDWINDOW,rect,AfxGetMainWnd(), 0);

}

catch(_com_error &ce)

{

Doc->ErrMessage(ce);

} // TODO: Add your control notification handler code here

}

void Dlg::OnDohodOtUslug()

{

CString str_query;

str_query="SELECT Услуги.Tip, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Услуги.Tip ORDER BY Услуги.Tip, Sum(Услуги.Stoimost)";

Recordset_Baza(str_query);

m_datagrid.SetRefDataSource(pRecordset);// TODO: Add your control notification handler code here

GetDlgItem(IDC_GRAF)->ShowWindow(SW_HIDE);

}

void Dlg::OnDohodPoDnyam()

{

CString str_query;

str_query="SELECT Заказы.Datazak, Sum(Услуги.Stoimost) AS [Sum-Stoimost] FROM Сотрудники INNER JOIN (Услуги INNER JOIN Заказы ON Услуги.IDy = Заказы.IDy) ON Сотрудники.IDsotr = Заказы.IDsotr GROUP BY Заказы.Datazak ORDER BY Заказы.Datazak";


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

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