95561

Разработка программного обеспечения для упрощения управления предприятием по обслуживанию туристов

Курсовая

Информатика, кибернетика и программирование

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

Русский

2015-09-24

1.33 MB

0 чел.

Содержание

[1] Содержание

[2]
Введение

[3] ОСНОВНАЯ ЧАСТЬ

[3.1] Выбор технологии, среды и языка программирования

[3.2] Анализ процесса обработки информации

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

[3.3.1] Проектирование структуры программного обеспечения

[3.3.2] Разработка функциональной схемы

[3.3.3] Разработка модульной структуры программного обеспечения

[3.3.4] Спецификации программных модулей

[3.4] Проектирование интерфейса пользователя

[3.4.1] Построение графа диалога

[3.4.2] Разработка форм ввода-вывода информации

[3.5] Выбор стратегии тестирования, разработка тестов, программа и методика испытаний

[3.5.1] Объект испытаний

[3.5.2] Цель испытаний

[3.5.3] Требования к программному обеспечению

[3.5.4] Требования к программной документации

[3.5.5] Состав и порядок испытаний

[3.5.6] Методы испытаний

[3.5.7] Результаты проведения испытаний

[4]
Заключение

[5]
Список литературы

[6]
ПРИЛОЖЕНИЕ 1. Техническое задание

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

[7]
ПРИЛОЖЕНИЕ 2. Руководство пользователя


Введение

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

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

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

Фирма-предприятие, состоит из трех подразделений:

  •  Европейские туры,
  •  Азиатские туры,
  •  Америка.

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

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

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

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


  1.  ОСНОВНАЯ ЧАСТЬ
    1.  Выбор технологии, среды и языка программирования

За последние 25 лет появились сотни языков программирования разных видов, которые сменяли друг друга на определённых этапах развития технологий. По мере того, как развивался Интернет, началась популяризация языков программирования, которые ориентируются на создание сайтов и веб-приложений.[11]

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

Неизменными остаются лишь принципы программирования. Современные языки программирования можно разбить на 3 группы:

  •  процедурные,
  •  функциональные,
  •  логические.

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

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

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

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

Большинство современных процедурных языков программирования развивается в направлении объектно-ориентированного программирования.

Переменные и функции при объектно-ориентированном подходе группируются в объекты и классы. Благодаря этому достигается более высокий уровень структуризации и абстракции программы. Одни объекты могут порождаться от других объектов. В таких языках вводят следующие понятия: наследование, полиморфизм, позднее связывание и другие.[11]

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

  •  Java,
  •  PHP,
  •  C/C++,
  •  Python,
  •  Visual Basic,
  •  Delphi.

Java – это объектно-ориентированный язык программирования, который был разработан в 1995 году компанией Sun Microsystems.

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

К минусам языка Java относят то, что при исполнении байт-кода снижается производительность алгоритмов и программ. За последнее время было разработано ряд улучшений, которые частично решили эту проблему.

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

Данный язык программирования приобрёл свою популярность за счёт простоты и лёгкости кода. С его помощью можно решить 90% задач во время создания сайтов. PHP активно развивается и, на данный момент, находится на 5 месте по популярности, среди других языков программирования.

Синтаксис PHP похож на язык C, а некоторые элементы были взяты из Perl.

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

С/С++ – процедурный язык программирования, который был разработан в 1970х годах. Он создавался для использования в ОС UNIX. В то время данный язык портировали на большинство известных операционных систем, тем самым сделав самым популярным языком программирования. С помощью него создают как системное программное обеспечение, так и прикладные программы. Язык Cи также используют для обучения, хотя он не предусматривался для новичков. Основные плюсы этого языка – минимализм, обширный набор функций и лаконичность.

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

Язык С++ по сути является расширением функционала С, с использованием объектно-ориентированного подхода.

Python – высокоуровневый язык программирования, в котором акцент сделан на читаемость кода и производительность разработчика. Его создание было начато ещё в 1980х. Синтаксис этого языка минималистичен, зато в стандартную библиотеку включено множество полезных функций.

Обновления Python выходят раз в два с половиной года. Он портирован во все известные платформы и ОС. Синтаксис языка Питон очень чёткий и последовательный, благодаря чему код легко читается.

Как и у большинства интерпретируемых языков, у Python скорость выполнения программ относительно небольшая. Но, в данном случае, это компенсируется сокращением времени разработки самой программы. Если сравнивать программу на Python с такой же на Java или C++, то она будет в 2-4 раза компактнее.

Visual Basic – это средство разработки ПО, созданное корпорацией Майкрософт.  Оно включает в себя среду разработки и язык программирования. Многое было унаследовано с Basic. Язык был выпущен под Windows в 1991 году.

Плюсы, которые можно выделить в языке Visual Basic: быстрое создание приложения для Windows с графическим интерфейсом; лёгкий синтаксис, который позволяет быстро освоить язык; предусмотрена защита от ошибок, связанных с доступом к памяти и применением указателей.

Недостатки: поддерживаются операционные системы Windows или MAC OS X; можно наследовать интерфейс, но не реализацию объектов; чтобы работать с программой, нужна установка msvbvmXX.dll; сравнительно низкая скорость работы.

Delphi – система программирования основанная на расширении языка Pascal – объектном языке – Object Pascal.[5]

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

Система программирования Delphi версии 7 предоставляет наиболее широкие возможности для программирования приложений ОС Windows.

Преимущества Delphi по сравнению с аналогичными программными продуктами:

  •  быстрота разработки приложения;
  •  высокая производительность разработанного приложения;
  •  низкие требования разработанного приложения к ресурсам компьютера;
  •  наращиваемость за счет встраивания новых компонент и инструментов в среду Delphi;
  •  возможность разработки новых компонентов и инструментов собственными средствами Delphi (существующие компоненты и инструменты доступны в исходных кодах);
  •  удачная проработка иерархии объектов.

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

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

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

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

По длительности жизненного цикла программные изделия можно разделить на два класса: с малым и большим временем жизни. Этим классам программ соответствуют гибкий (мягкий) подход к их созданию и использованию и жесткий промыш­ленный подход регламентированного проектирования и эксплуа­тации программных изделий. В научных организациях и вузах, например, преобладают разработки программ первого класса, а в проектных и промышленных организациях — второго.

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


Рисунок 1.1.1. Программные изделия с малой длительностью эксплуатации

Программные изделия с большой длительностью эксплуатации создаются для регулярной обработки информации и управления. Структура таких программ сложная. Их размеры могут изменяться в широких пределах (1...1000 тыс. команд), однако все они обладают свойствами познаваемости и возможности модифи­кации в процессе длительного сопровождения и использования различными специалистами. Программные изделия этого класса допускают тиражирование, они сопровождаются документацией как промышленные изделия и представляют собой отчуждаемые от разработчика программные продукты. См. рис. 1.1.2.


Рисунок 1.1.2. Программные изделия с большой длительностью эксплуатации

Очевидно, что для проектирования данного программного обеспечения необходимо использовать модель разработки программ с большой длительностью эксплуатации. Т.к. проектируемая программа будет использоваться на предприятии на постоянной основе в качестве одного из основных вспомогательных средств.[5]

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

Фирма Microsoft зарекомендовала себя как один из ведущих производителей программного обеспечения, которое можно использовать как на небольших предприятиях, так и в крупных корпорациях и холдингах. MS Access, это программное обеспечение, которое обеспечивает полноценную систему управления базами данных, при этом обеспечивающая доступную настройку и надежную организацию доступа к данным.[4]

  1.  Анализ процесса обработки информации

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

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

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

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

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

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

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

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

  1.  Проектирование структуры программного обеспечения

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

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

Рассмотрим структуру разрабатываемого программного обеспечения на рис. 1.4.1.1.


Рисунок 1.4.1.1. Структурная схема, разрабатываемого программного обеспечения

При разработке программы были выделены три подсистемы:

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

Функциональная схема программного обеспечения представлена на рис. 1.4.2.1.


Рисунок 1.4.2.1. Функциональная схема, разрабатываемого программного обеспечения

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

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

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

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

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

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

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

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

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


Рисунок 1.4.3.1. Диаграмма Константайна

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

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

  1.  Спецификации программных модулей

В пункте работы 1.4.3, на рис. 1.4.3.1 изображена структурная карта Константайна, описывающая 14 взаимосвязанных модулей. Рассмотрим их спецификации:

  1.  Модуль входа в систему

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

Входные данные: имя пользователя и пароль.

Выходные данные: флаг отвечающий за результат авторизации.

  1.  Модуль контроля ввода

Предназначен для проверки заполнения всех полей и корректности данных.

Входные данные: данные для контроля.

Выходные данные: сообщение об ошибке или подтверждение правильности.

  1.  Модуль запроса базы данных

Предназначен для проверки введенных данных на соответствие данных в базе данных.

Входные данные: значения для отправки в базу данных.

Выходные данные: ответ базы данных.

  1.  Модуль работы с базой данных

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

Входные данные: сообщение для базы данных, на языке SQL.

Выходные данные: результат выполнения команд или ошибка.

  1.  Модуль чтения данных

Предназначен для получения данных из базы данных.

Входные данные: запрос на языке SQL.

Выходные данные: ответ базы данных.

  1.  Модуль добавления записей

Предназначен для добавления новых записей в таблицы базы данных.

Входные данные: запрос на языке SQL.

Выходные данные: ответ базы данных.

  1.  Модуль обновления записей

Предназначен для частичного обновления данных в базе данных.

Входные данные: запрос на языке SQL.

Выходные данные: ответ базы данных.

  1.  Модуль удаления записей

Предназначен для удаления информации из базы данных.

Входные данные: запрос на языке SQL.

Выходные данные: ответ базы данных.

  1.  Модуль графического интерфейса

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

  1.  Модуль обработки клиентов

Предназначен для редактирования данных о клиетах.

Входные данные: информация о клиентах.

Выходные данные: отображение данных о клиентах.

  1.  Модуль обработки заказов

Предназначен для редактирования данных о заказах

Входные данные: информация о клиентах.

Выходные данные: данные о заказчике и списке услуг в рамках заявки.

  1.  Модуль обработки работников

Предназначен для редактировании информации о работниках.

Входные данные: информация о рабочих.

Выходные данные: список работников.

  1.  Модуль обработки расписания

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

Входные данные: информация о графике работы.

Выходные данные: график работы на определенную дату.

  1.  Модуль обработки прайса услуг

Предназначен для редактирования списка услуг и их расценок.

Входные данные: информация об услугах.

Выходные данные: список услуг и расценок, с разделением на зоны обслуживания.

  1.  Проектирование интерфейса пользователя

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

Графический интерфейс пользователя, графический пользовательский интерфейс — разновидность пользовательского интерфейса, в котором элементы интерфейса (окна, кнопки, значки, списки и т. п.), представленные пользователю на дисплее, исполнены в виде графических изображений.

Графический интерфейс пользователя является частью пользовательского интерфейса и определяет взаимодействие с пользователем на уровне визуализированной информации. Используя данный тип интерфейса, пользователь, имеет произвольный доступ ко всем видимым экранным объектам с помощью устройств ввода — клавиатуры, мыши, джойстика и т. п. Чаще всего элементы интерфейса реализованы на основе метафор и отображают их назначение и свойства, что облегчает понимание и освоение программ неподготовленными пользователями.[6]

  1.  Построение графа диалога

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

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

С математической точки зрения граф диалога — ориентированный взвешенный граф.

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

Граф диалога для проектируемого программного обеспечения изображён на рис.1.5.1.1.


Рисунок 1.5.1.1. Граф диалога разрабатываемого программного обеспечения

  1.  Разработка форм ввода-вывода информации

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

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

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

Для вывода табличных данных используем компонент TStringGrid.

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

Для доступа к базе данных используем компоненты TAdoConnection и TAdoQuery. Эти компоненты позволяют получать доступ к любой базе данных, для которой установлены драйвера BDE в операционной системе. Таким образом, полученная программа не привязывается к конкретной базе данных, и при необходимости без серьезных изменений, может быть адаптирована для использования например клиент-серверной базы данных MS SQL.

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

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

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

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

  1.  Объект испытаний

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

  1.  Цель испытаний

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

  1.  Требования к программному обеспечению

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

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

  1.  Требования к программной документации

При проведении испытаний должны быть доступны следующие документы:

  •  расчетно-пояснительная записка;
  •  техническое задание (приложение 1);
  •  руководство пользователя (приложение 2);
  •  текст программы (приложение 3).
    1.  Состав и порядок испытаний

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

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

  1.  Методы испытаний

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

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

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

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

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

При тестировании, в первую очередь, необходимо проверить соответствие основных функций, которые описаны в техническом задании (Приложение 1).

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

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

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

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

  1.  Результаты проведения испытаний

Тестирование модулей программы приведено в таблице 1.6.7.1.

Таблица 1.6.7.1

Тестирование модулей программы

Название модуля

Результаты тестирования

Итог

Менеджер входа

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

Тестирование успешно

Выбор действия

При нажатии на каждую из управляющих кнопок, открывается соответствующая форма. При нажатии кнопки «Завершить сеанс», происходит возврат в менеджер входа.

Тестирование успешно

Редактор клиентов

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

Тестирование успешно

Редактор заявок

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

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

Тестирование успешно

Таблица 1.6.7.1 (Продолжение)

Редактор услуг

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

Тестирование успешно

Редактор работников

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

Тестирование успешно

Редактор расписания

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

Тестирование успешно

Редактор зон обслуживания.

Модуль отображает зоны обслуживания, используемые на предприятии. Модуль успешно обеспечивает добавление, переименование и удаление зон обслуживания.

Тестирование успешно


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

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

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

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


Таблица 1.6.7.1.

Результаты тестовых испытаний

Дата

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

Наименование теста

Результат

29.06.2014

Разработчик

Проверка на наличие простейших ошибок в коде

Ошибки не обнаружены

01.07.2014

Разработчик

Проверка входа в систему

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

02.07.2014

Разработчик

Проверка модулей просмотра и редактирования записей

Добавление, изменение и удаление записей работает корректно. Обработка некорректных данных функционирует. Тест выполнен успешно

03.07.2014

Разработчик

Тестирование печати отчетов

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


Заключение

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

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

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

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

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


Список литературы

  1.  Дубейковский В.И. Эффективное моделирование с CA ERwin Process Modeler – М.: Диалог-МИФИ, 2011. – 384с.
  2.  Кузнецов С.М. Базы данных. Модели и языки – М.: Бином-Пресс, 2008. – 720с.
  3.  Маклаков С.В. Моделирование бизнес-процессов с BPwin 4.0 – М.: Диалог-МИФИ, 2010. – 224с.
  4.  Рубин А.В. и др. Самоучитель Access 2007 – М.: Наука и техника, 2012. – 400с.
  5.  Хомоненко А.П. и др. Delphi 7 – С-П.: БХВ-Петербург, 2010. – 1120с.
  6.  http://ru.wikipedia.org/wiki/Графический_интерфейс_пользователя
  7.  http://itbuh.ru/zhiznennyj-cikl-sistemy/strukturnye-karty-konstantajna/
  8.  http://ru.wikipedia.org/wiki/ER-модель_данных
  9.  http://ru.wikipedia.org/wiki/DFD
  10.  http://ru.wikipedia.org/wiki/IDEF0
  11.  http://smalllis.narod.ru/statya1/jazik.htm


ПРИЛОЖЕНИЕ 1. Техническое задание

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

Российский государственный социальный университет

Филиал в г. Анапа Краснодарского края

Утверждаю

заф. каф.

«____»_____________2014 г.

Техническое задание на курсовую работу

Моделирование работы туристического агенства

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

Группа

Принял преподаватель

                                                  Отметка о зачете

Анапа, 2014 г.

1. Введение

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

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

2. Основание для разработки

Основанием для разработки является задание на курсовую работу.

3. Назначение разработки

Задачей является закрепление материала, изученного в процессе изучения дисциплины "Объектно-ориентированное программирование".

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

       4. Требования к программе

    а) Требования к функциональным характеристикам

Иерархия родственных типов состоит из класса-интерфейса и 2 производных классов, что моделирует предметную область «Туризм».

В программе создаются объекты классов.

К функциям программы относятся:

- загрузка данных из файла БД;

- просмотр информации о БД;

- добавление данных в БД;

- поиск данных;

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

На выходе имеем информацию, выведенную на экран.

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

b)Условия эксплуатации

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

c) Требования к составу и параметрам технических средств.

Система предназначена для работы на IBM-совместимых персональных компьютерах с ОС Windows 98 / 2000 / XP / Vista / 7

Минимальная конфигурация:

- тип процессора Pentium III / IV;

- объем ОЗУ –  32 Мб и более;

- объем свободного места на жестком диске – 40 Мб.

Для работы программы требуются внешние устройства – монитор, клавиатура, мышь.

е) Требования к информационной и программной совместимости.

Исходный код программы должен быть откомпилирован на Apache. Программа будет работать под управлением операционной системы семейства Windows (Windows 98/ME/2000/XP/Vista/7). Дополнительного программного обеспечения для функционирования не требуется.

5. Требования к программной документации

Программная документация будет содержать:

  •  расчетно-пояснительную записку;
  •  текст программы;
  •  руководство пользователя.

Оформляется на листах формата А4 по действующим стандартам (ЕСПД).

  6. Технико-экономические показатели

Не предъявляются.

7. Стадии и этапы разработки.

Таблица 1. П1. Этапы разработки

Этапы разработки

Плановая дата

Фактическая дата

Объектно-ориентированный анализ предметной области

Проектирование необходимых динамических структур

Разработка и реализация алгоритмов

Разработка интерфейса программы

Отладка и тестирование

Составление программной документации

8. Порядок контроля и приемки.

Основная процедура контроля и приема работы будет происходить путем защиты курсовой работы в виде презентации.


ПРИЛОЖЕНИЕ 2. Руководство пользователя

Общие сведения

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

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

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

В силу ограничений программного обеспечения, поддерживаются операционные системы Windows версий выпущенных после 2002 года. В частности XP, Vista, 7, 8.1.

Установка программы

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

Запуск программы

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

Если после запуска отобразилось окно как на рис.1, то запуск выполнен успешно.


Рисунок 1. Окно входа в систему

Использование программы

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

После успешного входа в систему, отображается окно выбора редактора(рис.2.)


Рисунок 2. Окно выбора редактора


Рисунок 3. Редактор заявок

Используя интерфейс окна выбора редактора, можно перейти в один из редакторов приложения. Например в список заявок(рис.3.)

В каждом редакторе, есть отображаемая информация и кнопки управления. Которые позволяют добавлять, изменять и удалять записи. Так же присутствует функция печати отчета. Форма добавления или изменения данных (рис.4) состоит из полей ввода и кнопок, позволяющих либо подтвердить изменения, либо отменить. Некоторые компоненты могут быть заблокированы в зависимости от обстоятельств. Например если заказ выполнен, он больше не может быть изменен(см. рис.4).


Рисунок 4. Просмотр заявки

На каждой форме есть кнопка возврата на предыдущую форму. Так же для возврата с отменой можно использовать клавишу Esc на клавиатуре.

Завершение работы с программой осуществляется с помощью выхода на форму входа в систему и нажатием кнопки «Завершение работы»(см. рис.1).
ПРИЛОЖЕНИЕ 3. ТЕКСТ ПРОГРАММЫ

unit UnitBase;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, ExtCtrls, DB, ADODB, QuickRpt, QRCtrls;

type

 TFormBase = class(TForm)

   TimerAutoLogin: TTimer;

   ADOConnection1: TADOConnection;

   queryTemp: TADOQuery;

   procedure TimerAutoLoginTimer(Sender: TObject);

   procedure FormShow(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormBase: TFormBase;

implementation

uses UnitMain;

{$R *.dfm}

procedure TFormBase.TimerAutoLoginTimer(Sender: TObject);

begin

 TTimer(Sender).Enabled:=false;

 Hide;

 FormMain.btnLogout.Click;

end;

procedure TFormBase.FormShow(Sender: TObject);

begin

 ADOConnection1.Connected:=false;

 TimerAutoLogin.Enabled:=true;//TimerAutoLogin.Tag=0;

end;

end.

unit UnitClientAddEdit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormClientAddEdit = class(TForm)

   btnConfirm: TButton;

   btnCancel: TButton;

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Label6: TLabel;

   Label7: TLabel;

   Edit1: TEdit;

   Edit2: TEdit;

   Edit3: TEdit;

   Edit4: TEdit;

   Edit5: TEdit;

   Edit6: TEdit;

   Edit7: TEdit;

   procedure FormShow(Sender: TObject);

   procedure btnConfirmClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormClientAddEdit: TFormClientAddEdit;

implementation

uses UnitBase, DB;

{$R *.dfm}

procedure TFormClientAddEdit.FormShow(Sender: TObject);

var

 e:array[0..6] of TEdit;

 j:integer;

begin

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 e[3]:=Edit4;

 e[4]:=Edit5;

 e[5]:=Edit6;

 e[6]:=Edit7;

 if Tag=0 then begin

   Caption:='Добавление нового клиента';

   btnConfirm.Caption:='Добавить';

   for j:=0 to Length(e)-1 do begin

     e[j].Text:='';

   end;

 end

 else begin

   Caption:='Редактирование данных клиента';

   btnConfirm.Caption:='Изменить';

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='SELECT * FROM Clients WHERE cid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     for j:=0 to Length(e)-1 do begin

       e[j].Text:=FormBase.queryTemp.Fields[j+1].AsString;

     end;

   end

   else begin

     ModalResult:=mrCancel;

   end;

   FormBase.queryTemp.Active:=false;

 end;

end;

procedure TFormClientAddEdit.btnConfirmClick(Sender: TObject);

var

 e:array[0..6] of TEdit;

 l:array[0..6] of TLabel;

 j:integer;

 ok:boolean;

 fieldnames,fieldvalues:String;

begin

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 e[3]:=Edit4;

 e[4]:=Edit5;

 e[5]:=Edit6;

 e[6]:=Edit7;

 l[0]:=Label1;

 l[1]:=Label2;

 l[2]:=Label3;

 l[3]:=Label4;

 l[4]:=Label5;

 l[5]:=Label6;

 l[6]:=Label7;

 ok:=true;

 for j:=0 to Length(e)-1 do begin

   e[j].Text:=Trim(e[j].Text);

   if e[j].Text='' then begin

     ShowMessage('Поле '+l[j].Caption+' не заполнено.');

     ok:=false;

     break;

   end;

 end;

 if ok then begin

   if Tag=0 then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Clients';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='';

     for j:=0 to Length(e)-1 do begin

       fieldvalues:=fieldvalues+',"'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Clients('+fieldnames+

       ') VALUES('+fieldvalues+', 0)';

     FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Clients';

     FormBase.queryTemp.Active:=true;

     fieldvalues:='';

     for j:=0 to Length(e)-1 do begin

       fieldvalues:=fieldvalues+','+FormBase.queryTemp.Fields[j+1].FieldName

         +'="'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE Clients SET '

       +fieldvalues+' WHERE cid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

   end;

   ModalResult:=mrOk;

 end;

end;

end.

unit UnitClientListFilter;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormClientListFilter = class(TForm)

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Edit1: TEdit;

   Edit2: TEdit;

   Edit3: TEdit;

   Edit4: TEdit;

   Edit5: TEdit;

   btnConfirm: TButton;

   btnCancel: TButton;

   btnReset: TButton;

   procedure btnResetClick(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure btnConfirmClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormClientListFilter: TFormClientListFilter;

implementation

{$R *.dfm}

procedure TFormClientListFilter.btnResetClick(Sender: TObject);

begin

 Edit1.Text:='';

 Edit2.Text:='';

 Edit3.Text:='';

 Edit4.Text:='';

 Edit5.Text:='';

end;

procedure TFormClientListFilter.FormCreate(Sender: TObject);

begin

 btnReset.Click;

end;

procedure TFormClientListFilter.btnConfirmClick(Sender: TObject);

begin

 Edit1.Text:=Trim(Edit1.Text);

 Edit2.Text:=Trim(Edit2.Text);

 Edit3.Text:=Trim(Edit3.Text);

 Edit4.Text:=Trim(Edit4.Text);

 Edit5.Text:=Trim(Edit5.Text);

end;

end.

unit UnitClientList;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Grids, StdCtrls;

type

 TFormClientList = class(TForm)

   StringGrid1: TStringGrid;

   btnAddClient: TButton;

   btnEditClient: TButton;

   btnDelClient: TButton;

   btnClose: TButton;

   btnFiter: TButton;

   btnFilterReset: TButton;

   btnSelectClient: TButton;

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure btnAddClientClick(Sender: TObject);

   procedure btnEditClientClick(Sender: TObject);

   procedure btnDelClientClick(Sender: TObject);

   procedure btnFiterClick(Sender: TObject);

   procedure btnFilterResetClick(Sender: TObject);

 private

   { Private declarations }

 public

   filter:string;

   { Public declarations }

 end;

var

 FormClientList: TFormClientList;

implementation

uses UnitBase, DB, UnitClientAddEdit, UnitClientListFilter;

{$R *.dfm}

procedure TFormClientList.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=9;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='ИД';

 StringGrid1.Cells[1,0]:='Фамилия';

 StringGrid1.Cells[2,0]:='Имя';

 StringGrid1.Cells[3,0]:='Отчество';

 StringGrid1.Cells[4,0]:='Телефон';

 StringGrid1.Cells[5,0]:='Марка';

 StringGrid1.Cells[6,0]:='Модель';

 StringGrid1.Cells[7,0]:='Гос.Номер';

 StringGrid1.Cells[8,0]:='Заказов';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.04);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.18);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.18);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.18);

 StringGrid1.ColWidths[4]:=Round((StringGrid1.ClientWidth-25)*0.08);

 StringGrid1.ColWidths[5]:=Round((StringGrid1.ClientWidth-25)*0.08);

 StringGrid1.ColWidths[6]:=Round((StringGrid1.ClientWidth-25)*0.08);

 StringGrid1.ColWidths[7]:=Round((StringGrid1.ClientWidth-25)*0.08);

 StringGrid1.ColWidths[8]:=Round((StringGrid1.ClientWidth-25)*0.1);

end;

procedure TFormClientList.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

begin

 FormResize(Self);

 btnFilterReset.Enabled:=filter<>'';

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:='SELECT * FROM Clients';

 if filter<>'' then begin

   FormBase.queryTemp.SQL.Add('WHERE '+filter);

 end;

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

end;

procedure TFormClientList.btnAddClientClick(Sender: TObject);

begin

 Hide;

 FormClientAddEdit.Tag:=0;

 FormClientAddEdit.ShowModal;

 Show;

end;

procedure TFormClientList.btnEditClientClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   Hide;

   FormClientAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

   FormClientAddEdit.ShowModal;

   Show;

 end;

end;

procedure TFormClientList.btnDelClientClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'') then begin

   if MessageDlg('Клиент '

     +StringGrid1.Cells[1,sel]+' '

     +StringGrid1.Cells[2,sel]+' '

     +StringGrid1.Cells[3,sel]+' будет удален. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM Clients WHERE cid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       FormShow(Self);

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

procedure TFormClientList.btnFiterClick(Sender: TObject);

begin

 if FormClientListFilter.ShowModal=mrOk then begin

   filter:='';

   if FormClientListFilter.Edit1.Text<>'' then begin

     filter:=filter+' cfam LIKE "%'+FormClientListFilter.Edit1.Text+'%"';

   end;

   if FormClientListFilter.Edit2.Text<>'' then begin

     if filter<>'' then begin

       filter:=filter+' AND'

     end;

     filter:=filter+' cimya LIKE "%'+FormClientListFilter.Edit2.Text+'%"';

   end;

   if FormClientListFilter.Edit3.Text<>'' then begin

     if filter<>'' then begin

       filter:=filter+' AND'

     end;

     filter:=filter+' cotch LIKE "%'+FormClientListFilter.Edit3.Text+'%"';

   end;

   if FormClientListFilter.Edit4.Text<>'' then begin

     if filter<>'' then begin

       filter:=filter+' AND'

     end;

     filter:=filter+' ctel LIKE "%'+FormClientListFilter.Edit4.Text+'%"';

   end;

   if FormClientListFilter.Edit5.Text<>'' then begin

     if filter<>'' then begin

       filter:=filter+' AND'

     end;

     filter:=filter+' cnomer LIKE "%'+FormClientListFilter.Edit5.Text+'%"';

   end;

 end;

 FormShow(Self);

end;

procedure TFormClientList.btnFilterResetClick(Sender: TObject);

begin

 filter:='';

 FormShow(Self);

end;

end.

unit UnitContractAddEdit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ComCtrls, Grids, QuickRpt, QRCtrls, ExtCtrls;

type

 TFormContractAddEdit = class(TForm)

   Label1: TLabel;

   lblClient: TLabel;

   Label2: TLabel;

   btnClientSelect: TButton;

   DateTimePicker1: TDateTimePicker;

   Label3: TLabel;

   StringGrid1: TStringGrid;

   Label4: TLabel;

   Label5: TLabel;

   Label6: TLabel;

   lblSum: TLabel;

   lblDiscount: TLabel;

   lblCost: TLabel;

   btnUslAdd: TButton;

   btnUslEdit: TButton;

   btnUslDelete: TButton;

   btnCancel: TButton;

   btnSave: TButton;

   CheckBox1: TCheckBox;

   QuickRep1: TQuickRep;

   DetailBand1: TQRBand;

   QRLabel2: TQRLabel;

   QRLabel3: TQRLabel;

   QRLabel4: TQRLabel;

   TitleBand1: TQRBand;

   QRLabel1: TQRLabel;

   ColumnHeaderBand1: TQRBand;

   QRLabel5: TQRLabel;

   QRLabel6: TQRLabel;

   QRLabel7: TQRLabel;

   SummaryBand1: TQRBand;

   QRLabel8: TQRLabel;

   QRLabel9: TQRLabel;

   QRLabel10: TQRLabel;

   QRLabel11: TQRLabel;

   QRLabel12: TQRLabel;

   QRLabel13: TQRLabel;

   procedure FormShow(Sender: TObject);

   procedure FormResize(Sender: TObject);

   procedure btnSaveClick(Sender: TObject);

   procedure FormCreate(Sender: TObject);

   procedure FormDestroy(Sender: TObject);

   procedure btnCancelClick(Sender: TObject);

   procedure btnClientSelectClick(Sender: TObject);

   procedure btnUslAddClick(Sender: TObject);

   procedure btnUslEditClick(Sender: TObject);

   procedure btnUslDeleteClick(Sender: TObject);

   procedure QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);

 private

   { Private declarations }

 public

   usl:TStringList;

   usljid:TStringList;

   procedure updateusl;

   { Public declarations }

 end;

var

 FormContractAddEdit: TFormContractAddEdit;

implementation

uses UnitBase, DB, UnitClientList, UnitPriceList, UnitContractUslAddEdit;

{$R *.dfm}

procedure TFormContractAddEdit.updateusl;

var

 i,j:integer;

 id:string;

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 for j:=0 to StringGrid1.ColCount-1 do begin

   StringGrid1.Cells[j,StringGrid1.RowCount-1]:='';

 end;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT jid, pusl, zzona, jvremya, pcena FROM Jobs,Price,WorkZones '+

   'WHERE jpriceid=pid AND pzonaid=zid AND jcontractid='+

   IntToStr(Tag)+' ORDER BY jvremya';

 FormBase.queryTemp.Active:=true;

 if not FormBase.queryTemp.IsEmpty then begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     StringGrid1.Cells[3,StringGrid1.RowCount-1]:=

       FormatFloat('00',(FormBase.queryTemp.Fields[3].AsInteger-1) div 2 + 9)+':'+

       FormatFloat('00',30 * ((FormBase.queryTemp.Fields[3].AsInteger-1) mod 2));

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

 lblSum.Tag:=0;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[4,i]<>'' then begin

     lblSum.Tag:=lblSum.Tag+StrToInt(StringGrid1.Cells[4,i]);

   end;

 end;

 lblSum.Caption:=IntToStr(lblSum.Tag);

 if lblDiscount.Tag>0 then begin

   lblDiscount.Caption:=IntToStr(lblSum.Tag*5 div 100);

 end;

 lblCost.Caption:=IntToStr(lblSum.Tag-StrToInt(lblDiscount.Caption));

 DateTimePicker1.Enabled:=StringGrid1.Cells[0,1]='';

end;

procedure TFormContractAddEdit.FormShow(Sender: TObject);

var

 j:integer;

begin

 QuickRep1.Hide;

 FormResize(Self);

 StringGrid1.RowCount:=2;

 for j:=0 to StringGrid1.ColCount-1 do begin

   StringGrid1.Cells[j,StringGrid1.RowCount-1]:='';

 end;

 usl.Clear;

 usljid.Clear;

 if Tag=0 then begin

   Caption:='Создание заявки';

   lblClient.Hide;

   btnClientSelect.Show;

   DateTimePicker1.Date:=Now;

   CheckBox1.Checked:=false;

   lblSum.Caption:='0';

   lblDiscount.Caption:='0';

   lblDiscount.Tag:=0;

   lblCost.Caption:='0';

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'DELETE FROM Contracts WHERE kid=0';

   FormBase.queryTemp.ExecSQL;

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'INSERT INTO Contracts(kid) VALUES(0)';

   FormBase.queryTemp.ExecSQL;

 end

 else begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT jid,jpriceid,jvremya FROM Jobs WHERE jcontractid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     while not FormBase.queryTemp.Eof do begin

       usljid.Add(FormBase.queryTemp.Fields[0].AsString);

       usl.AddObject(FormBase.queryTemp.Fields[1].AsString,TObject(FormBase.queryTemp.Fields[2].AsInteger));

       FormBase.queryTemp.Next;

     end;

   end;

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT kid, cfam+" "+cimya+" "+cotch, kdata, ksumma, kvypoln, kskidka, czakazkol, cid'+

     ' FROM Contracts,Clients WHERE kclientid=cid AND kid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     Caption:='Изменение заявки №'+FormBase.queryTemp.Fields[0].AsString;

     lblClient.Caption:=FormBase.queryTemp.Fields[1].AsString;

     lblClient.Tag:=FormBase.queryTemp.Fields[7].AsInteger;

     lblClient.Show;

     btnClientSelect.Hide;

     DateTimePicker1.Date:=FormBase.queryTemp.Fields[2].AsDateTime;

     lblSum.Caption:=FormBase.queryTemp.Fields[3].AsString;

     if FormBase.queryTemp.Fields[6].AsInteger>1 then begin;

       lblDiscount.Caption:=FormBase.queryTemp.Fields[5].AsString;

       lblDiscount.Tag:=1;

     end

     else begin

       lblDiscount.Caption:='0';

       lblDiscount.Tag:=0;

     end;

     lblCost.Caption:=IntToStr(StrToInt(lblSum.Caption)-StrToInt(lblDiscount.Caption));

     CheckBox1.Checked:=FormBase.queryTemp.Fields[4].AsInteger<>0;

     CheckBox1.Tag:=FormBase.queryTemp.Fields[4].AsInteger;

   end

   else begin

     ModalResult:=mrCancel;

   end;

   FormBase.queryTemp.Active:=false;

 end;

 CheckBox1.Enabled:=not CheckBox1.Checked;

 btnUslAdd.Enabled:=CheckBox1.Enabled;

 btnUslEdit.Enabled:=CheckBox1.Enabled;

 btnUslDelete.Enabled:=CheckBox1.Enabled;

 DateTimePicker1.Enabled:=CheckBox1.Enabled;

 btnSave.Enabled:=CheckBox1.Enabled;

 updateusl;

end;

procedure TFormContractAddEdit.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=5;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='Код';

 StringGrid1.Cells[1,0]:='Наименование';

 StringGrid1.Cells[2,0]:='Зона';

 StringGrid1.Cells[3,0]:='Время';

 StringGrid1.Cells[4,0]:='Стоимость';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.06);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.52);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.14);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.14);

 StringGrid1.ColWidths[4]:=Round((StringGrid1.ClientWidth-25)*0.14);

end;

procedure TFormContractAddEdit.btnSaveClick(Sender: TObject);

var

 j:integer;

 fieldnames,fieldvalues:String;

begin

 if not lblClient.Visible then begin

   ShowMessage('Поле '+Label1.Caption+' не заполнено.');

 end

 else begin

   if Tag=0 then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Contracts';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='"'+IntToStr(lblClient.Tag)+'","'+

       DateToStr(DateTimePicker1.Date)+'","'+lblSum.Caption+'",';

     if CheckBox1.Checked then begin

       fieldvalues:=fieldvalues+'"1",';

     end

     else begin

       fieldvalues:=fieldvalues+'"0",';

     end;

     fieldvalues:=fieldvalues+'"'+lblDiscount.Caption+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Contracts('+fieldnames+

       ') VALUES('+fieldvalues+')';

     FormBase.queryTemp.ExecSQL;

     FormBase.queryTemp.SQL.Text:='SELECT @@IDENTITY';

     FormBase.queryTemp.Active:=true;

     fieldvalues:='"'+FormBase.queryTemp.Fields[0].AsString+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Jobs';

     FormBase.queryTemp.Active:=true;

     fieldnames:=FormBase.queryTemp.Fields[1].FieldName;

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE Jobs SET '+fieldnames+

       '='+fieldvalues+' WHERE jcontractid=0';

     FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Contracts';

     FormBase.queryTemp.Active:=true;

     fieldvalues:=

       FormBase.queryTemp.Fields[2].FieldName+'="'+DateToStr(DateTimePicker1.Date)+'",'+

       FormBase.queryTemp.Fields[3].FieldName+'="'+lblSum.Caption+'",';

     if CheckBox1.Checked then begin

       fieldvalues:=fieldvalues+FormBase.queryTemp.Fields[4].FieldName+'="1",';

     end

     else begin

       fieldvalues:=fieldvalues+FormBase.queryTemp.Fields[4].FieldName+'="0",';

     end;

     fieldvalues:=fieldvalues+

       FormBase.queryTemp.Fields[5].FieldName+'="'+lblDiscount.Caption+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE Contracts SET '

       +fieldvalues+' WHERE kid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

   end;

   if CheckBox1.Checked xor (CheckBox1.Tag=1) then begin

     FormBase.queryTemp.Active:=false;

     if CheckBox1.Checked then begin

       FormBase.queryTemp.SQL.Text:=

         'UPDATE Clients SET czakazkol=czakazkol+1 WHERE cid='+IntToStr(lblClient.Tag);

     end

     else begin

       FormBase.queryTemp.SQL.Text:=

         'UPDATE Clients SET czakazkol=czakazkol-1 WHERE cid='+IntToStr(lblClient.Tag);

     end;

     FormBase.queryTemp.ExecSQL;

   end;

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'DELETE FROM Contracts WHERE kid=0';

   FormBase.queryTemp.ExecSQL;

   ModalResult:=mrOk;

 end;

end;

procedure TFormContractAddEdit.FormCreate(Sender: TObject);

begin

 usl:=TStringList.Create;

 usljid:=TStringList.Create;

end;

procedure TFormContractAddEdit.FormDestroy(Sender: TObject);

begin

 usl.Free;

 usljid.Free;

end;

procedure TFormContractAddEdit.btnCancelClick(Sender: TObject);

var

 j:integer;

 fieldnames,fieldvalues:String;

begin

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:='DELETE FROM Jobs WHERE jcontractid='+IntToStr(Tag);

 FormBase.queryTemp.ExecSQL;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Jobs';

 FormBase.queryTemp.Active:=true;

 fieldnames:='';

 for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

   fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

 end;

 Delete(fieldnames,1,1);

 FormBase.queryTemp.Active:=false;

 for j:=0 to usl.Count-1 do begin

   fieldvalues:='"'+usljid[j]+'","'+IntToStr(Tag)+'","'+usl[j]+'","'+IntToStr(Integer(usl.Objects[j]))+'"';

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='INSERT INTO Jobs('+fieldnames+

       ') VALUES('+fieldvalues+')';

   FormBase.queryTemp.ExecSQL;

 end;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'DELETE FROM Contracts WHERE kid=0';

 FormBase.queryTemp.ExecSQL;

end;

procedure TFormContractAddEdit.btnClientSelectClick(Sender: TObject);

begin

 FormClientList.btnSelectClient.Visible:=true;

 if (FormClientList.ShowModal=mrYes)and(FormClientList.StringGrid1.Cells[0,FormClientList.StringGrid1.Selection.Top]<>'') then begin

   lblClient.Caption:=

     FormClientList.StringGrid1.Cells[1,FormClientList.StringGrid1.Selection.Top]+' '+

     FormClientList.StringGrid1.Cells[2,FormClientList.StringGrid1.Selection.Top]+' '+

     FormClientList.StringGrid1.Cells[3,FormClientList.StringGrid1.Selection.Top];

   lblClient.Tag:=

     StrToInt(FormClientList.StringGrid1.Cells[0,FormClientList.StringGrid1.Selection.Top]);

   lblClient.Show;

   btnClientSelect.Hide;

   if StrToInt(FormClientList.StringGrid1.Cells[8,FormClientList.StringGrid1.Selection.Top])>=1 then begin

     lblDiscount.Tag:=1;

   end

   else begin

     lblDiscount.Tag:=0

   end;

   updateusl;

 end;

end;

procedure TFormContractAddEdit.btnUslAddClick(Sender: TObject);

begin

 FormContractUslAddEdit.Tag:=0;

 FormContractUslAddEdit.ShowModal;

 updateusl;

end;

procedure TFormContractAddEdit.btnUslEditClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   FormContractUslAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

   FormContractUslAddEdit.ShowModal;

   updateusl;

 end;

end;

procedure TFormContractAddEdit.btnUslDeleteClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'') then begin

   if MessageDlg('Услуга "'+StringGrid1.Cells[1,sel]+' в '

     +StringGrid1.Cells[3,sel]+'" будет исключена. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM Jobs WHERE jid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       updateusl;

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

procedure TFormContractAddEdit.QuickRep1NeedData(Sender: TObject;

 var MoreData: Boolean);

begin

 MoreData:=false;

 if StringGrid1.Tag<StringGrid1.RowCount then begin

   MoreData:=true;

   QRLabel2.Caption:=StringGrid1.Cells[1,StringGrid1.Tag];

   QRLabel3.Caption:=StringGrid1.Cells[3,StringGrid1.Tag];

   QRLabel4.Caption:=StringGrid1.Cells[4,StringGrid1.Tag];

   StringGrid1.Tag:=StringGrid1.Tag+1;

 end;

end;

end.

unit UnitContractList;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Grids, StdCtrls;

type

 TFormContractList = class(TForm)

   StringGrid1: TStringGrid;

   btnAddContract: TButton;

   btnEditContract: TButton;

   btnDelContract: TButton;

   btnClose: TButton;

   btnPrint: TButton;

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure btnAddContractClick(Sender: TObject);

   procedure btnEditContractClick(Sender: TObject);

   procedure btnDelContractClick(Sender: TObject);

   procedure btnPrintClick(Sender: TObject);

 private

   { Private declarations }

 public

   filter:string;

   { Public declarations }

 end;

var

 FormContractList: TFormContractList;

implementation

uses UnitBase, DB, UnitContractAddEdit;

{$R *.dfm}

procedure TFormContractList.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=5;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='№';

 StringGrid1.Cells[1,0]:='Клиент';

 StringGrid1.Cells[2,0]:='Дата';

 StringGrid1.Cells[3,0]:='Стоимость';

 StringGrid1.Cells[4,0]:='Выполнение';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.06);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.52);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.14);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.14);

 StringGrid1.ColWidths[4]:=Round((StringGrid1.ClientWidth-25)*0.14);

end;

procedure TFormContractList.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

begin

 FormResize(Self);

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT kid,cfam+" "+cimya+" "+cotch,kdata,ksumma-kskidka,kvypoln '+

   'FROM Contracts,Clients WHERE kclientid=cid';

 if filter<>'' then begin

   FormBase.queryTemp.SQL.Add('WHERE '+filter);

 end;

 FormBase.queryTemp.SQL.Add('ORDER BY kdata');

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-2 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     if FormBase.queryTemp.Fields[FormBase.queryTemp.FieldCount-1].AsString='0' then begin

       StringGrid1.Cells[StringGrid1.ColCount-1,StringGrid1.RowCount-1]:='Нет'

     end

     else begin

       StringGrid1.Cells[StringGrid1.ColCount-1,StringGrid1.RowCount-1]:='Да'

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

end;

procedure TFormContractList.btnAddContractClick(Sender: TObject);

begin

 Hide;

 FormContractAddEdit.Tag:=0;

 FormContractAddEdit.ShowModal;

 Show;

end;

procedure TFormContractList.btnEditContractClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   Hide;

   FormContractAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

   FormContractAddEdit.ShowModal;

   Show;

 end;

end;

procedure TFormContractList.btnDelContractClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'') then begin

   if MessageDlg('Заявка №'

     +StringGrid1.Cells[0,sel]+' от '

     +StringGrid1.Cells[2,sel]+' будет удалена. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM Contracts WHERE kid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       FormShow(Self);

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

procedure TFormContractList.btnPrintClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   if StringGrid1.Cells[StringGrid1.ColCount-1,StringGrid1.Selection.Top]<>'Да' then begin

     ShowMessage('Печать возможна только после выполнения заявки');

   end

   else begin

     FormContractAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

     FormContractAddEdit.OnShow(FormContractAddEdit);

     FormContractAddEdit.QRLabel1.Caption:='Акт выполненных работ от '+

       DateToStr(FormContractAddEdit.DateTimePicker1.Date)+

       ' об оказании услуг клиенту '+FormContractAddEdit.lblClient.Caption;

     FormContractAddEdit.QRLabel5.Caption:='Услуга';

     FormContractAddEdit.QRLabel6.Caption:='Время';

     FormContractAddEdit.QRLabel7.Caption:='Стоимость(руб.)';

     FormContractAddEdit.QRLabel8.Caption:='Сумма:';

     FormContractAddEdit.QRLabel9.Caption:='Скидка:';

     FormContractAddEdit.QRLabel10.Caption:='Итого:';

     FormContractAddEdit.QRLabel11.Caption:=FormContractAddEdit.lblSum.Caption+' руб.';

     FormContractAddEdit.QRLabel12.Caption:=FormContractAddEdit.lblDiscount.Caption+' руб.';

     FormContractAddEdit.QRLabel13.Caption:=FormContractAddEdit.lblCost.Caption+' руб.';

     FormContractAddEdit.StringGrid1.Tag:=1;

     FormContractAddEdit.QuickRep1.PreviewModal;

   end;

 end;

end;

end.

unit UnitContractUslAddEdit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormContractUslAddEdit = class(TForm)

   ComboBox1: TComboBox;

   ComboBox2: TComboBox;

   Label1: TLabel;

   Label2: TLabel;

   btnConfirm: TButton;

   btnCancel: TButton;

   procedure FormShow(Sender: TObject);

   procedure btnConfirmClick(Sender: TObject);

   procedure ComboBox1Change(Sender: TObject);

   procedure btnCancelClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormContractUslAddEdit: TFormContractUslAddEdit;

implementation

uses UnitBase, UnitContractAddEdit, Math, DB;

{$R *.dfm}

procedure TFormContractUslAddEdit.FormShow(Sender: TObject);

var

 i:integer;

begin

 ComboBox1.Clear;

 ComboBox2.Clear;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT * '+

   'FROM Price ORDER BY pzonaid';

 FormBase.queryTemp.Active:=true;

 ComboBox1.Clear;

 if not FormBase.queryTemp.IsEmpty then begin

   while not FormBase.queryTemp.Eof do begin

     ComboBox1.AddItem(

       FormBase.queryTemp.Fields[1].AsString + ' (' + FormBase.queryTemp.Fields[3].AsString+' руб.)',

       TObject(FormBase.queryTemp.Fields[0].AsInteger));

     FormBase.queryTemp.Next;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 if Tag=0 then begin

   Caption:='Вставка услуги в заявку';

 end

 else begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT * FROM Jobs WHERE jid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   ComboBox1.Tag:=FormBase.queryTemp.Fields[2].AsInteger;

   ComboBox2.Tag:=FormBase.queryTemp.Fields[3].AsInteger;

   if not FormBase.queryTemp.IsEmpty then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:=

       'DELETE FROM Jobs WHERE jid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

     Caption:='Изменение услуги в заявке';

     for i:=0 to ComboBox1.Items.Count-1 do begin

       if Integer(ComboBox1.Items.Objects[i])=ComboBox1.Tag then begin

         ComboBox1.ItemIndex:=i;

         break;

       end;

     end;

     ComboBox1Change(ComboBox1);

     for i:=0 to ComboBox2.Items.Count-1 do begin

       if Integer(ComboBox2.Items.Objects[i])>ComboBox2.Tag then begin

         ComboBox2.ItemIndex:=i-1;

         break;

       end;

     end;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     ModalResult:=mrCancel;

   end;

 end;

end;

procedure TFormContractUslAddEdit.btnConfirmClick(Sender: TObject);

var

 j:integer;

 ok:boolean;

 fieldnames,fieldvalues:String;

begin

 ok:=true;

 if ComboBox1.ItemIndex=-1 then begin

   ShowMessage('Поле '+Label1.Caption+' не заполнено.');

   ok:=false;

 end;

 if ok and (ComboBox2.ItemIndex=-1) then begin

   ShowMessage('Поле '+Label2.Caption+' не заполнено.');

   ok:=false;

 end;

 if ok then begin

   if Tag=0 then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Jobs';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='"'+IntToStr(FormContractAddEdit.Tag)+'","'+

       IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))+'","'+

       IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Jobs('+fieldnames+

       ') VALUES('+fieldvalues+')';

     FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Jobs';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='"'+IntToStr(Tag)+'","'+

       IntToStr(FormContractAddEdit.Tag)+'","'+

       IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))+'","'+

       IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Jobs('+fieldnames+

       ') VALUES('+fieldvalues+')';

     FormBase.queryTemp.ExecSQL;

   end;

   ModalResult:=mrOk;

 end;

end;

procedure TFormContractUslAddEdit.ComboBox1Change(Sender: TObject);

var

 j:integer;

 zid:String;

 jtime:TList;

begin

 ComboBox2.Clear;

 if ComboBox1.ItemIndex>-1 then begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT pzonaid FROM Price WHERE pid='+

     IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]));

   FormBase.queryTemp.Active:=true;

   zid:=FormBase.queryTemp.Fields[0].AsString;

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT jvremya FROM Jobs,Price,Contracts '+

     'WHERE jpriceid=pid AND jcontractid=kid AND pzonaid='+zid+

     ' AND kdata='+IntToStr(Trunc(FormContractAddEdit.DateTimePicker1.Date));

   FormBase.queryTemp.Active:=true;

   jtime:=TList.Create;

   if not FormBase.queryTemp.IsEmpty then begin

     while not FormBase.queryTemp.Eof do begin

       jtime.Add(Pointer(FormBase.queryTemp.Fields[0].AsInteger));

       FormBase.queryTemp.Next;

     end;

   end;

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT jvremya FROM Jobs WHERE jcontractid='+IntToStr(FormContractAddEdit.Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     while not FormBase.queryTemp.Eof do begin

       jtime.Add(Pointer(FormBase.queryTemp.Fields[0].AsInteger));

       FormBase.queryTemp.Next;

     end;

   end;

   FormBase.queryTemp.Active:=false;

   for j:=0 to 23 do begin

     if jtime.IndexOf(Pointer(j+1))=-1 then begin

       Combobox2.AddItem(FormatFloat('00',j div 2 + 9)+':'+FormatFloat('00',30 * (j mod 2)),TObject(j+1));

     end;

   end;

   jtime.Free;

 end;

 If (ComboBox2.Items.Count>0) then begin

   ComboBox2.ItemIndex:=0;

 end;

end;

procedure TFormContractUslAddEdit.btnCancelClick(Sender: TObject);

begin

 if Tag>0 then begin

   FormBase.queryTemp.Active:=False;

   FormBase.queryTemp.SQL.Text:=

     'INSERT INTO Jobs(jid,jcontractid,jpriceid,jvremya) VALUES("'+

     IntToStr(Tag)+'","'+

     IntToStr(FormContractAddEdit.Tag)+'","'+

     IntToStr(ComboBox1.Tag)+'","'+

     IntToStr(ComboBox2.Tag)+'")';

   FormBase.queryTemp.ExecSQL;

 end;

end;

end.

unit UnitLogin;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormLogin = class(TForm)

   btnOk: TButton;

   btnCancel: TButton;

   Label1: TLabel;

   Label2: TLabel;

   edtUser: TEdit;

   edtPassword: TEdit;

   procedure btnOkClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormLogin: TFormLogin;

implementation

uses UnitBase, UnitMain;

{$R *.dfm}

procedure TFormLogin.btnOkClick(Sender: TObject);

begin

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:='SELECT * FROM Workers WHERE wlogin="'+edtUser.Text

   +'" AND StrComp(wpassword,"'+edtPassword.Text+'",0)=0';

 FormBase.queryTemp.Active:=true;

 if (edtUser.Text<>'') and not FormBase.queryTemp.IsEmpty then begin

   FormMain.Caption:='Пользователь: '+FormBase.queryTemp.Fields[1].AsString+' '

   +FormBase.queryTemp.Fields[2].AsString+' '+FormBase.queryTemp.Fields[3].AsString;

   ModalResult:=mrOk;

 end

 else begin

   ShowMessage('Неудачная попытка входа в систему');

 end;

 FormBase.queryTemp.Active:=false;

end;

end.

unit UnitMain;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormMain = class(TForm)

   btnLogout: TButton;

   btnClients: TButton;

   btnDogovors: TButton;

   btnWorkers: TButton;

   btnPrice: TButton;

   btnTimeTable: TButton;

   btnWorkZone: TButton;

   procedure btnLogoutClick(Sender: TObject);

   procedure btnClientsClick(Sender: TObject);

   procedure btnDogovorsClick(Sender: TObject);

   procedure btnWorkZoneClick(Sender: TObject);

   procedure btnPriceClick(Sender: TObject);

   procedure btnWorkersClick(Sender: TObject);

   procedure btnTimeTableClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormMain: TFormMain;

implementation

uses UnitLogin, UnitBase, UnitClientList, UnitContractList, UnitWorkZone,

 UnitPriceList, UnitWorkerList, UnitTimeTable;

{$R *.dfm}

procedure TFormMain.btnLogoutClick(Sender: TObject);

begin

 Hide;

 if FormLogin.ShowModal=mrOk then begin

   Show;

 end

 else begin

   //Close;

   FormBase.Close;

 end;

end;

procedure TFormMain.btnClientsClick(Sender: TObject);

begin

 Hide;

 FormClientList.filter:='';

 FormClientList.btnSelectClient.Visible:=false;

 FormClientList.ShowModal;

 Show;

end;

procedure TFormMain.btnDogovorsClick(Sender: TObject);

begin

 Hide;

 FormContractList.ShowModal;

 Show;

end;

procedure TFormMain.btnWorkZoneClick(Sender: TObject);

begin

 Hide;

 FormWorkZone.ShowModal;

 Show;

end;

procedure TFormMain.btnPriceClick(Sender: TObject);

begin

 Hide;

 FormPriceList.ShowModal;

 Show;

end;

procedure TFormMain.btnWorkersClick(Sender: TObject);

begin

 Hide;

 FormWorkerList.ShowModal;

 Show;

end;

procedure TFormMain.btnTimeTableClick(Sender: TObject);

begin

 Hide;

 FormTimeTable.MonthCalendar1.Date:=Now;

 FormTimeTable.ShowModal;

 Show;

end;

end.

unit UnitPriceAddEdit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormPriceAddEdit = class(TForm)

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   btnConfirm: TButton;

   btnCancel: TButton;

   Edit1: TEdit;

   Edit3: TEdit;

   ComboBox1: TComboBox;

   Edit2: TEdit;

   procedure FormShow(Sender: TObject);

   procedure ComboBox1Change(Sender: TObject);

   procedure btnConfirmClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormPriceAddEdit: TFormPriceAddEdit;

implementation

uses UnitBase, DB;

{$R *.dfm}

procedure TFormPriceAddEdit.FormShow(Sender: TObject);

var

 e:array[0..2] of TEdit;

 j:integer;

begin

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT * '+

   'FROM WorkZones';

 FormBase.queryTemp.Active:=true;

 ComboBox1.Clear;

 if not FormBase.queryTemp.IsEmpty then begin

   while not FormBase.queryTemp.Eof do begin

     ComboBox1.AddItem(

       FormBase.queryTemp.Fields[1].AsString,

       TObject(FormBase.queryTemp.Fields[0].AsInteger));

     FormBase.queryTemp.Next;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 if Tag=0 then begin

   Caption:='Добавление новой услуги';

   btnConfirm.Caption:='Добавить';

   for j:=0 to Length(e)-1 do begin

     e[j].Text:='';

   end;

 end

 else begin

   Caption:='Редактирование параметров услуги';

   btnConfirm.Caption:='Изменить';

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='SELECT * FROM Price WHERE pid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     for j:=0 to Length(e)-1 do begin

       e[j].Text:=FormBase.queryTemp.Fields[j+1].AsString;

     end;

     for j:=0 to ComboBox1.Items.Count-1 do begin

       if Integer(ComboBox1.Items.Objects[j])=FormBase.queryTemp.FieldByName('pzonaid').AsInteger then begin

         ComboBox1.ItemIndex:=j;

         break;

       end;

     end;

   end

   else begin

     ModalResult:=mrCancel;

   end;

   FormBase.queryTemp.Active:=false;

 end;

end;

procedure TFormPriceAddEdit.ComboBox1Change(Sender: TObject);

begin

 if ComboBox1.ItemIndex>-1 then begin

   Edit2.Text:=IntToStr(Integer(TCombobox(Sender).Items.Objects[ComboBox1.ItemIndex]));

 end

 else begin

   Edit2.Text:='';

 end;

end;

procedure TFormPriceAddEdit.btnConfirmClick(Sender: TObject);

var

 e:array[0..2] of TEdit;

 l:array[0..2] of TLabel;

 j:integer;

 ok:boolean;

 fieldnames,fieldvalues:String;

 c,k:integer;

begin

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 l[0]:=Label1;

 l[1]:=Label2;

 l[2]:=Label3;

 ok:=true;

 for j:=0 to Length(e)-1 do begin

   e[j].Text:=Trim(e[j].Text);

   if e[j].Text='' then begin

     ShowMessage('Поле '+l[j].Caption+' не заполнено.');

     ok:=false;

     break;

   end;

 end;

 Val(e[2].Text,k,c);

 if ok and((k<0)or(c<>0))then begin

   ShowMessage('Поле '+l[2].Caption+' заполнено с ошибкой.');

   ok:=false;

 end;

 if ok then begin

   if Tag=0 then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Price';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='';

     for j:=0 to Length(e)-1 do begin

       fieldvalues:=fieldvalues+',"'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Price('+fieldnames+

       ') VALUES('+fieldvalues+')';

     FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Price';

     FormBase.queryTemp.Active:=true;

     fieldvalues:='';

     for j:=0 to Length(e)-1 do begin

       fieldvalues:=fieldvalues+','+FormBase.queryTemp.Fields[j+1].FieldName

         +'="'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE Price SET '

       +fieldvalues+' WHERE pid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

   end;

   ModalResult:=mrOk;

 end;

end;

end.

unit UnitPriceList;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Grids;

type

 TFormPriceList = class(TForm)

   StringGrid1: TStringGrid;

   btnAddService: TButton;

   btnEditService: TButton;

   btnDelService: TButton;

   btnClose: TButton;

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure btnAddServiceClick(Sender: TObject);

   procedure btnEditServiceClick(Sender: TObject);

   procedure btnDelServiceClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormPriceList: TFormPriceList;

implementation

uses UnitBase, UnitPriceAddEdit;

{$R *.dfm}

procedure TFormPriceList.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=4;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='Код';

 StringGrid1.Cells[1,0]:='Наименование';

 StringGrid1.Cells[2,0]:='Зона обсл.';

 StringGrid1.Cells[3,0]:='Стоимость(руб.)';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.05);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.4);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.4);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.15);

end;

procedure TFormPriceList.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

begin

 FormResize(Self);

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT pid,pusl,zzona,pcena FROM Price,WorkZones WHERE pzonaid=zid ORDER BY pzonaid';

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

end;

procedure TFormPriceList.btnAddServiceClick(Sender: TObject);

begin

 Hide;

 FormPriceAddEdit.Tag:=0;

 FormPriceAddEdit.ShowModal;

 Show;

end;

procedure TFormPriceList.btnEditServiceClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   Hide;

   FormPriceAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

   FormPriceAddEdit.ShowModal;

   Show;

 end;

end;

procedure TFormPriceList.btnDelServiceClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'') then begin

   if MessageDlg('Услуга '

     +StringGrid1.Cells[1,sel]+' будет удалена. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM Price WHERE pid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       FormShow(Self);

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

end.

unit UnitTimeTable;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, ComCtrls, Grids, QuickRpt, QRCtrls, ExtCtrls;

type

 TFormTimeTable = class(TForm)

   StringGrid1: TStringGrid;

   MonthCalendar1: TMonthCalendar;

   Button1: TButton;

   ComboBox1: TComboBox;

   ComboBox2: TComboBox;

   Button2: TButton;

   Button3: TButton;

   Label1: TLabel;

   Label2: TLabel;

   btnClose: TButton;

   Button4: TButton;

   Button5: TButton;

   QuickRep1: TQuickRep;

   DetailBand1: TQRBand;

   QRLabel2: TQRLabel;

   QRLabel3: TQRLabel;

   QRLabel4: TQRLabel;

   TitleBand1: TQRBand;

   QRLabel1: TQRLabel;

   ColumnHeaderBand1: TQRBand;

   QRLabel5: TQRLabel;

   QRLabel6: TQRLabel;

   QRLabel7: TQRLabel;

   QRLabel8: TQRLabel;

   QRLabel9: TQRLabel;

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure MonthCalendar1Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   procedure Button1Click(Sender: TObject);

   procedure Button5Click(Sender: TObject);

   procedure Button4Click(Sender: TObject);

   procedure QuickRep1NeedData(Sender: TObject; var MoreData: Boolean);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormTimeTable: TFormTimeTable;

implementation

uses UnitBase, DB, DateUtils;

{$R *.dfm}

procedure TFormTimeTable.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=4;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='Код';

 StringGrid1.Cells[1,0]:='Работник';

 StringGrid1.Cells[2,0]:='Зона обсл.';

 StringGrid1.Cells[3,0]:='Смена';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.05);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.40);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.40);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.15);

end;

procedure TFormTimeTable.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

 w,z:integer;

begin

 QuickRep1.Hide;

 FormResize(Self);

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT tid,wfam+" "+wimya+" "+wotch,zzona,tsmena '+

   'FROM TimeTable,WorkZones,Workers WHERE '+

   'tworkerid=wid AND tzonaid=zid AND tdata='+IntToStr(Trunc(MonthCalendar1.Date));

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

 z:=ComboBox1.ItemIndex;

 w:=ComboBox2.ItemIndex;

 ComboBox1.Clear;

 ComboBox2.Clear;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT zid,zzona FROM WorkZones';

 FormBase.queryTemp.Active:=true;

 if not FormBase.queryTemp.IsEmpty then begin

   while not FormBase.queryTemp.Eof do begin

     ComboBox1.AddItem(

       FormBase.queryTemp.Fields[1].AsString,

       TObject(FormBase.queryTemp.Fields[0].AsInteger)

       );

     FormBase.queryTemp.Next;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT wid,wfam+" "+wimya+" "+wotch FROM Workers WHERE wid>1';

 FormBase.queryTemp.Active:=true;

 if not FormBase.queryTemp.IsEmpty then begin

   while not FormBase.queryTemp.Eof do begin

     ComboBox2.AddItem(

       FormBase.queryTemp.Fields[1].AsString,

       TObject(FormBase.queryTemp.Fields[0].AsInteger)

       );

     FormBase.queryTemp.Next;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 if (z>=0)and(z<ComboBox1.Items.Count)then begin

   ComboBox1.ItemIndex:=z;

 end

 else if (ComboBox1.Items.Count>0) then begin

   ComboBox1.ItemIndex:=0;

 end;

 if (w>=0)and(w<ComboBox2.Items.Count)then begin

   ComboBox2.ItemIndex:=w;

 end

 else if (ComboBox2.Items.Count>0) then begin

   ComboBox2.ItemIndex:=0;

 end;

end;

procedure TFormTimeTable.MonthCalendar1Click(Sender: TObject);

begin

 FormShow(Self);

end;

procedure TFormTimeTable.Button2Click(Sender: TObject);

var

 j:integer;

 fieldnames,fieldvalues:String;

begin

 if (ComboBox1.ItemIndex>=0) and (ComboBox2.ItemIndex>=0) then begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT tid FROM TimeTable WHERE'+

     ' tzonaid='+IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))+

     ' AND tsmena='+IntToStr(TButton(Sender).Tag)+

     ' AND tdata='+IntToStr(Trunc(MonthCalendar1.Date));

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     Tag:=FormBase.queryTemp.Fields[0].AsInteger;

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM TimeTable';

     FormBase.queryTemp.Active:=true;

     fieldvalues:=

       FormBase.queryTemp.Fields[1].FieldName+

       '="'+IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+'",'+

       FormBase.queryTemp.Fields[3].FieldName+'="'+IntToStr(TButton(Sender).Tag)+'",'+

       FormBase.queryTemp.Fields[4].FieldName+

       '="'+IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE TimeTable SET '

       +fieldvalues+' WHERE tid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM TimeTable';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:=

       '"'+IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+'",'+

       '"'+DateToStr(MonthCalendar1.Date)+'",'+

       '"'+IntToStr(TButton(Sender).Tag)+'",'+

       '"'+IntToStr(Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]))+'"';

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO TimeTable('+fieldnames+

       ') VALUES('+fieldvalues+')';

     FormBase.queryTemp.ExecSQL;

   end;

   FormShow(Self);

 end;

end;

procedure TFormTimeTable.Button1Click(Sender: TObject);

var

 i:integer;

begin

 if (ComboBox1.Items.Count>0) and (ComboBox2.Items.Count>0) then begin

   ComboBox2.ItemIndex:=0;

   for i:=0 to ComboBox1.Items.Count-1 do begin

     ComboBox1.ItemIndex:=i;

     Button2.Click;

     if ComboBox2.ItemIndex<ComboBox2.Items.Count then begin

       ComboBox2.ItemIndex:=ComboBox2.ItemIndex+1;

     end;

     Button3.Click;

     if ComboBox2.ItemIndex<ComboBox2.Items.Count then begin

       ComboBox2.ItemIndex:=ComboBox2.ItemIndex+1;

     end;

   end;

 end;

end;

procedure TFormTimeTable.Button5Click(Sender: TObject);

var

 day1,day2,mon,yea:word;

 sum:integer;

begin

 if ComboBox2.ItemIndex>=0 then begin

   DecodeDate(MonthCalendar1.Date,yea,mon,day1);

   day1:=1;

   day2:=DaysInAMonth(yea,mon);

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT SUM(pcena)'+

     ' FROM Price, Contracts, Jobs, TimeTable'+

     ' WHERE jcontractid=kid AND jpriceid=pid AND int((jvremya-1) / 12)+1=tsmena'+

     ' AND tdata=kdata AND kvypoln=1 AND pzonaid=tzonaid'+

     ' AND tworkerid= '+IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+

     ' AND kdata >= '+IntToStr(Trunc(EncodeDate(yea,mon,day1)))+

     ' AND kdata <= '+IntToStr(Trunc(EncodeDate(yea,mon,day2)));

   FormBase.queryTemp.Active:=true;

   sum:=FormBase.queryTemp.Fields[0].AsInteger * 10 div 100;

   FormBase.queryTemp.Active:=false;

   ShowMessage('Премия для работника '+ ComboBox2.Items[ComboBox2.ItemIndex]+

   ' составляет '+IntToStr(sum)+' руб');

 end;

end;

procedure TFormTimeTable.Button4Click(Sender: TObject);

begin

//

 if ComboBox2.ItemIndex>=0 then begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:=

     'SELECT pusl, zzona, jvremya, cmark+" "+cmodel+" "+cnomer'+

     ' FROM Price, Contracts, Jobs, TimeTable, WorkZones, Clients'+

     ' WHERE jcontractid=kid AND jpriceid=pid AND int((jvremya-1) / 12)+1=tsmena'+

     ' AND tdata=kdata AND kvypoln=0 AND pzonaid=tzonaid AND pzonaid=zid AND kclientid=cid'+

     ' AND tworkerid='+IntToStr(Integer(ComboBox2.Items.Objects[ComboBox2.ItemIndex]))+

     ' AND tdata='+IntToStr(Trunc(MonthCalendar1.Date))+

     ' ORDER BY jvremya';

   FormBase.queryTemp.Active:=true;

   if FormBase.queryTemp.IsEmpty then begin

     ShowMessage('У работника '+ComboBox2.Items[ComboBox2.ItemIndex]+

       ' нет заданий на дату '+DateToStr(MonthCalendar1.Date));

   end

   else begin

     QRLabel1.Caption:='Расписание заданий, для работника '+ComboBox2.Items[ComboBox2.ItemIndex]

     +' на дату '+DateToStr(MonthCalendar1.Date);

     QRLabel5.Caption:='Время';

     QRLabel6.Caption:='Услуга';

     QRLabel7.Caption:='Автомобиль';

     QRLabel8.Caption:='Зона обслуживания';

     QuickRep1.PreviewModal;

   end;

   //sum:=FormBase.queryTemp.Fields[0].AsInteger * 10 div 100;

   FormBase.queryTemp.Active:=false;

 end;

end;

procedure TFormTimeTable.QuickRep1NeedData(Sender: TObject;

 var MoreData: Boolean);

begin

 QRLabel2.Caption:=

   FormatFloat('00',FormBase.queryTemp.Fields[2].AsInteger div 2 + 9)+':'+

   FormatFloat('00',30 * (FormBase.queryTemp.Fields[2].AsInteger mod 2));

 QRLabel3.Caption:=FormBase.queryTemp.Fields[0].AsString;

 QRLabel4.Caption:=FormBase.queryTemp.Fields[3].AsString;

 QRLabel9.Caption:=FormBase.queryTemp.Fields[1].AsString;

 MoreData:=not FormBase.queryTemp.Eof;

 FormBase.queryTemp.Next;

end;

end.

unit UnitWorkerAddEdit;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls;

type

 TFormWorkerAddEdit = class(TForm)

   Label1: TLabel;

   Label3: TLabel;

   Label4: TLabel;

   Label5: TLabel;

   Label6: TLabel;

   Label7: TLabel;

   btnConfirm: TButton;

   btnCancel: TButton;

   Edit1: TEdit;

   Edit2: TEdit;

   Edit3: TEdit;

   Edit4: TEdit;

   Edit5: TEdit;

   Edit6: TEdit;

   Edit7: TEdit;

   Label2: TLabel;

   Edit8: TEdit;

   Label8: TLabel;

   procedure FormShow(Sender: TObject);

   procedure btnConfirmClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormWorkerAddEdit: TFormWorkerAddEdit;

implementation

uses UnitBase;

{$R *.dfm}

procedure TFormWorkerAddEdit.FormShow(Sender: TObject);

var

 e:array[0..7] of TEdit;

 l:array[0..7] of TLabel;

 j:integer;

begin

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 e[3]:=Edit4;

 e[4]:=Edit5;

 e[5]:=Edit6;

 e[6]:=Edit7;

 e[7]:=Edit8;

 l[0]:=Label1;

 l[1]:=Label2;

 l[2]:=Label3;

 l[3]:=Label4;

 l[4]:=Label5;

 l[5]:=Label6;

 l[6]:=Label7;

 l[7]:=Label8;

 if Tag<>1 then begin

   for j:=5 to 7 do begin

     e[j].Enabled:=false;

     l[j].Enabled:=false;

   end;

 end

 else begin

   for j:=5 to 7 do begin

     e[j].Enabled:=true;

     l[j].Enabled:=true;

   end;

 end;

 if Tag=0 then begin

   Caption:='Добавление нового работника';

   btnConfirm.Caption:='Добавить';

   for j:=0 to Length(e)-1 do begin

     e[j].Text:='';

   end;

 end

 else begin

   Caption:='Редактирование данных работника';

   btnConfirm.Caption:='Изменить';

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='SELECT * FROM Workers WHERE wid='+IntToStr(Tag);

   FormBase.queryTemp.Active:=true;

   if not FormBase.queryTemp.IsEmpty then begin

     for j:=0 to Length(e)-2 do begin

       e[j].Text:=FormBase.queryTemp.Fields[j+1].AsString;

     end;

     e[Length(e)-1].Text:=e[Length(e)-2].Text;

   end

   else begin

     ModalResult:=mrCancel;

   end;

   FormBase.queryTemp.Active:=false;

 end;

end;

procedure TFormWorkerAddEdit.btnConfirmClick(Sender: TObject);

var

 e:array[0..7] of TEdit;

 l:array[0..7] of TLabel;

 j:integer;

 ok:boolean;

 fieldnames,fieldvalues:String;

 k,c:integer;

begin

 e[0]:=Edit1;

 e[1]:=Edit2;

 e[2]:=Edit3;

 e[3]:=Edit4;

 e[4]:=Edit5;

 e[5]:=Edit6;

 e[6]:=Edit7;

 e[7]:=Edit8;

 l[0]:=Label1;

 l[1]:=Label2;

 l[2]:=Label3;

 l[3]:=Label4;

 l[4]:=Label5;

 l[5]:=Label6;

 l[6]:=Label7;

 l[7]:=Label8;

 ok:=true;

 for j:=0 to Length(e)-1 do begin

   e[j].Text:=Trim(e[j].Text);

   if (e[j].Text='')and e[j].Enabled then begin

     ShowMessage('Поле '+l[j].Caption+' не заполнено.');

     ok:=false;

     break;

   end;

 end;

 val(e[4].Text,k,c);

 if ok and ((c<>0)or(k<0)) then begin

   ShowMessage('Поле '+l[4].Caption+' заполнено с ошибкой.');

   ok:=false;

 end;

 if ok and (e[6].Text<>e[7].Text) then begin

   ShowMessage('Поля '+l[6].Caption+' и '+l[7].Caption+' не совпадают.');

   ok:=false;

 end;

 if ok then begin

   if Tag=0 then begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Workers';

     FormBase.queryTemp.Active:=true;

     fieldnames:='';

     for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

       fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

     end;

     Delete(fieldnames,1,1);

     fieldvalues:='';

     for j:=0 to Length(e)-2 do begin

       fieldvalues:=fieldvalues+',"'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='INSERT INTO Workers('+fieldnames+

       ') VALUES('+fieldvalues+')';

       FormBase.queryTemp.ExecSQL;

   end

   else begin

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM Workers';

     FormBase.queryTemp.Active:=true;

     fieldvalues:='';

     for j:=0 to Length(e)-2 do begin

       fieldvalues:=fieldvalues+','+FormBase.queryTemp.Fields[j+1].FieldName

         +'="'+e[j].Text+'"';

     end;

     Delete(fieldvalues,1,1);

     FormBase.queryTemp.Active:=false;

     FormBase.queryTemp.SQL.Text:='UPDATE Workers SET '

       +fieldvalues+' WHERE wid='+IntToStr(Tag);

     FormBase.queryTemp.ExecSQL;

   end;

   ModalResult:=mrOk;

 end;

end;

end.

unit UnitWorkerList;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, Grids, StdCtrls;

type

 TFormWorkerList = class(TForm)

   btnClose: TButton;

   StringGrid1: TStringGrid;

   btnDelWorker: TButton;

   btnEditWorker: TButton;

   btnAddCWorker: TButton;

   procedure btnAddCWorkerClick(Sender: TObject);

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure btnEditWorkerClick(Sender: TObject);

   procedure btnDelWorkerClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormWorkerList: TFormWorkerList;

implementation

uses UnitWorkerAddEdit, UnitBase;

{$R *.dfm}

procedure TFormWorkerList.btnAddCWorkerClick(Sender: TObject);

begin

 Hide;

 FormWorkerAddEdit.Tag:=0;

 FormWorkerAddEdit.ShowModal;

 Show;

end;

procedure TFormWorkerList.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=7;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='ИД';

 StringGrid1.Cells[1,0]:='Фамилия';

 StringGrid1.Cells[2,0]:='Имя';

 StringGrid1.Cells[3,0]:='Отчество';

 StringGrid1.Cells[4,0]:='Должность';

 StringGrid1.Cells[5,0]:='Ставка';

 StringGrid1.Cells[6,0]:='Пользователь';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.04);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.2);

 StringGrid1.ColWidths[2]:=Round((StringGrid1.ClientWidth-25)*0.2);

 StringGrid1.ColWidths[3]:=Round((StringGrid1.ClientWidth-25)*0.2);

 StringGrid1.ColWidths[4]:=Round((StringGrid1.ClientWidth-25)*0.12);

 StringGrid1.ColWidths[5]:=Round((StringGrid1.ClientWidth-25)*0.12);

 StringGrid1.ColWidths[6]:=Round((StringGrid1.ClientWidth-25)*0.12);

end;

procedure TFormWorkerList.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

begin

 FormResize(Self);

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:='SELECT * FROM Workers';

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

end;

procedure TFormWorkerList.btnEditWorkerClick(Sender: TObject);

begin

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   Hide;

   FormWorkerAddEdit.Tag:=StrToInt(StringGrid1.Cells[0,StringGrid1.Selection.Top]);

   FormWorkerAddEdit.ShowModal;

   Show;

 end;

end;

procedure TFormWorkerList.btnDelWorkerClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'')and(StringGrid1.Cells[0,sel]<>'1') then begin

   if MessageDlg('Работник '

     +StringGrid1.Cells[1,sel]+' '

     +StringGrid1.Cells[2,sel]+' '

     +StringGrid1.Cells[3,sel]+' будет удален. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM Workers WHERE wid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       FormShow(Self);

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

end.

unit UnitWorkZone;

interface

uses

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

 Dialogs, StdCtrls, Grids;

type

 TFormWorkZone = class(TForm)

   StringGrid1: TStringGrid;

   btnAddWorkZone: TButton;

   btnRenameWorkZone: TButton;

   btnDelWorkZone: TButton;

   Edit1: TEdit;

   Label1: TLabel;

   btnClose: TButton;

   procedure FormResize(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure btnAddWorkZoneClick(Sender: TObject);

   procedure btnDelWorkZoneClick(Sender: TObject);

   procedure btnRenameWorkZoneClick(Sender: TObject);

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 FormWorkZone: TFormWorkZone;

implementation

uses UnitBase;

{$R *.dfm}

procedure TFormWorkZone.FormResize(Sender: TObject);

begin

 StringGrid1.Width:=ClientWidth-2*StringGrid1.Left;

 StringGrid1.Height:=ClientHeight-StringGrid1.Top-StringGrid1.Left;

 if StringGrid1.RowCount<2 then begin

   StringGrid1.RowCount:=2;

 end;

 StringGrid1.ColCount:=2;

 StringGrid1.FixedRows:=1;

 StringGrid1.FixedCols:=1;

 StringGrid1.Cells[0,0]:='Код';

 StringGrid1.Cells[1,0]:='Название';

 StringGrid1.ColWidths[0]:=Round((StringGrid1.ClientWidth-25)*0.2);

 StringGrid1.ColWidths[1]:=Round((StringGrid1.ClientWidth-25)*0.8);

end;

procedure TFormWorkZone.FormShow(Sender: TObject);

var

 i,j:integer;

 id:string;

begin

 Edit1.Text:='';

 FormResize(Self);

 if StringGrid1.Cells[0,StringGrid1.Selection.Top]<>'' then begin

   id:=StringGrid1.Cells[0,StringGrid1.Selection.Top];

 end;

 StringGrid1.RowCount:=2;

 FormBase.queryTemp.Active:=false;

 FormBase.queryTemp.SQL.Text:=

   'SELECT * '+

   'FROM WorkZones';

 FormBase.queryTemp.Active:=true;

 if FormBase.queryTemp.IsEmpty then begin

   for j:=0 to StringGrid1.ColCount-1 do begin

     StringGrid1.Cells[j,1]:='';

   end;

 end

 else begin

   while not FormBase.queryTemp.Eof do begin

     for j:=0 to FormBase.queryTemp.FieldCount-1 do begin

       StringGrid1.Cells[j,StringGrid1.RowCount-1]:=

         FormBase.queryTemp.Fields[j].AsString;

     end;

     FormBase.queryTemp.Next;

     if not FormBase.queryTemp.Eof then begin

       StringGrid1.RowCount:=StringGrid1.RowCount+1;

     end;

   end;

 end;

 FormBase.queryTemp.Active:=false;

 for i:=1 to StringGrid1.RowCount-1 do begin

   if StringGrid1.Cells[0,i]=id then begin

     StringGrid1.Selection:=

       TGridRect(Rect(1,i,StringGrid1.ColCount-1,i));

     break;

   end;

 end;

end;

procedure TFormWorkZone.btnAddWorkZoneClick(Sender: TObject);

var

 e:array[0..0] of TEdit;

 l:array[0..0] of TLabel;

 j:integer;

 ok:boolean;

 fieldnames,fieldvalues:String;

begin

 e[0]:=Edit1;

 l[0]:=Label1;

 ok:=true;

 for j:=0 to Length(e)-1 do begin

   e[j].Text:=Trim(e[j].Text);

   if e[j].Text='' then begin

     ShowMessage('Поле '+l[j].Caption+' не заполнено.');

     ok:=false;

     break;

   end;

 end;

 if ok then begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM WorkZones';

   FormBase.queryTemp.Active:=true;

   fieldnames:='';

   for j:=1 to FormBase.queryTemp.FieldCount-1 do begin

     fieldnames:=fieldnames+','+FormBase.queryTemp.Fields[j].FieldName;

   end;

   Delete(fieldnames,1,1);

   fieldvalues:='';

   for j:=0 to Length(e)-1 do begin

     fieldvalues:=fieldvalues+',"'+e[j].Text+'"';

   end;

   Delete(fieldvalues,1,1);

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='INSERT INTO WorkZones('+fieldnames+

     ') VALUES('+fieldvalues+')';

   FormBase.queryTemp.ExecSQL;

   FormShow(Self);

 end;

end;

procedure TFormWorkZone.btnDelWorkZoneClick(Sender: TObject);

var

 sel:integer;

begin

 sel:=StringGrid1.Selection.Top;

 if (StringGrid1.Cells[0,sel]<>'') then begin

   if MessageDlg('Зона обслуживания "'

     +StringGrid1.Cells[1,sel]+'" будет удалена. Продолжить?',

     mtConfirmation,[mbYes,mbNo],0)=mrYes then begin

       FormBase.queryTemp.Active:=false;

       FormBase.queryTemp.SQL.Text:='DELETE FROM WorkZones WHERE zid='+StringGrid1.Cells[0,sel];

       FormBase.queryTemp.ExecSQL;

       FormShow(Self);

       sel:=sel-1;

       if sel>0 then begin

         StringGrid1.Selection:=

           TGridRect(Rect(1,sel,StringGrid1.ColCount-1,sel));

       end;

   end;

 end;

end;

procedure TFormWorkZone.btnRenameWorkZoneClick(Sender: TObject);

var

 e:array[0..0] of TEdit;

 l:array[0..0] of TLabel;

 j:integer;

 ok:boolean;

 fieldvalues:String;

begin

 e[0]:=Edit1;

 l[0]:=Label1;

 ok:=true;

 for j:=0 to Length(e)-1 do begin

   e[j].Text:=Trim(e[j].Text);

   if e[j].Text='' then begin

     ShowMessage('Поле '+l[j].Caption+' не заполнено.');

     ok:=false;

     break;

   end;

 end;

 if ok then begin

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='SELECT TOP 1 * FROM WorkZones';

   FormBase.queryTemp.Active:=true;

   fieldvalues:='';

   for j:=0 to Length(e)-1 do begin

     fieldvalues:=fieldvalues+','+FormBase.queryTemp.Fields[j+1].FieldName

       +'="'+e[j].Text+'"';

   end;

   Delete(fieldvalues,1,1);

   FormBase.queryTemp.Active:=false;

   FormBase.queryTemp.SQL.Text:='UPDATE WorkZones SET '

     +fieldvalues+' WHERE zid='+StringGrid1.Cells[0,StringGrid1.Selection.Top];

   FormBase.queryTemp.ExecSQL;

   FormShow(Self);

 end;

end;

end.

PAGE   \* MERGEFORMAT90


 

А также другие работы, которые могут Вас заинтересовать

1397. Маркетинговое исследование Компании the Сoca-Сola company 286.03 KB
  Получившийся напиток был запатентован как лекарственное средство «от любых нервных расстройств» и начал продаваться через автомат в крупнейшей городской аптеке Джекоба в Атланте. Интересно, что производство «Кока-Колы» в первый год было убыточным, но постепенно популярность «Кока-Колы»
1398. Технологии разработки Windows–приложений в системе Microsoft Visual C++ 2005. Использование Windows Forms 544.17 KB
  Общие сведения о Windows Forms. Программный код приложения, созданного на основе Windows Forms. Создание обработчиков событий. Добавление новой формы в проект. Получение навыков разработки Windows–приложений в системе Microsoft Visual C++ 2005 (VC++) с использованием классов Windows Forms из библиотек.
1399. Разработка приложений на основе Windows Forms с использованием кнопочных элементов управления и графических объектов 656.3 KB
  Получить навыки разработки на основе классов Windows Forms приложений, реализующих пользовательский интерфейс с помощью кнопок и графических объектов. Построение графиков в клиентской области. Алгоритм построения графика функции.
1400. Разработка приложений с применением элементов управления Windows Forms, обеспечивающих взаимодействие с пользователем 438.98 KB
  Ознакомление с возможностями элементов управления Windows Forms и получить навыки разработки приложений, реализующих пользовательский интерфейс с применением этих элементов. Компонент GroupBox (группа элементов управления). Элементы управления с поддержкой редактирования текста. Формирование элемента меню MenuItem.
1401. Исследование особенностей назначения пенсии за выслугу лет федеральным государственным гражданским служащим 134 KB
  Назначения пенсии за выслугу лет федеральным государственным гражданским служащим в Российской Федерации. Правовой статус федерального государственного гражданского служащего по российскому законодательству. Порядок рассмотрения заявления о назначении пенсии за выслугу лет федеральным государственным гражданским служащим
1402. Календарне планування. 673.5 KB
  Календарне планування – використання мережевої моделі для визначення моментів початку і кінця операцій програми. Виявляються критичні операції, які впливають на тривалість програми, і некритичні операції, які мають резерви часу. Резерви часу можна використати для оптимізації потреб в ресурсах.
1403. Перехідні процеси. Загальна характеристика. Закони комутації. 481.5 KB
  Перехідні процеси відбуваються лише у колах, до складу яких входять реактивні елементи.
1404. Разработка приложений в системе C++ Builder 2007 методами визуального программирования 641.48 KB
  Получить навыки работы с системой C++Builder 2007, научиться разрабатывать простейшие приложения средствами системы C++Builder для выполнения в операционной системе Windows, ознакомиться с некоторыми визуальными компонентами системы C++Builder, предназначенными для программирования пользовательского интерфейса.
1405. Программирование пользовательского интерфейса с использованием меню и стандартных диалоговых окон 240.3 KB
  Компоненты главного и контекстного меню. Компоненты стандартных диалоговых окон открытия и сохранения файлов. Компонент стандартного диалогового окна для выбора цвета. Компонент стандартного диалогового окна для выбора шрифта. Компонент стандартного диалогового окна для установки параметров принтера. Компонент стандартного диалогового окна для настройки параметров вывода документа на принтера. Компоненты стандартных диалоговых окон поиска и замены текста.