Главная Рефераты по сексологии Рефераты по информатике программированию Рефераты по биологии Рефераты по экономике Рефераты по москвоведению Рефераты по экологии Краткое содержание произведений Рефераты по физкультуре и спорту Топики по английскому языку Рефераты по математике Рефераты по музыке Остальные рефераты Рефераты по авиации и космонавтике Рефераты по административному праву Рефераты по безопасности жизнедеятельности Рефераты по арбитражному процессу Рефераты по архитектуре Рефераты по астрономии Рефераты по банковскому делу Рефераты по биржевому делу Рефераты по ботанике и сельскому хозяйству Рефераты по бухгалтерскому учету и аудиту Рефераты по валютным отношениям Рефераты по ветеринарии Рефераты для военной кафедры Рефераты по географии Рефераты по геодезии Рефераты по геологии Рефераты по геополитике Рефераты по государству и праву Рефераты по гражданскому праву и процессу Рефераты по делопроизводству Рефераты по кредитованию Рефераты по естествознанию Рефераты по истории техники Рефераты по журналистике Рефераты по зоологии Рефераты по инвестициям Рефераты по информатике Исторические личности Рефераты по кибернетике Рефераты по коммуникации и связи |
Дипломная работа: Разработка программного обеспечения по автоматизации учебного процесса в колледжеДипломная работа: Разработка программного обеспечения по автоматизации учебного процесса в колледжеФедеральное агентство по образованию федеральное Государственное образовательное учреждение среднего профессионального образования Бежецкий промышленно-экономический колледж Задание на дипломное проектированиепо специальности: «Программное обеспечение вычислительной техники и автоматизированных систем» Студента группы: П – 411________________________Ф.И.О. Тема работы:__ Разработка программного обеспечения по автоматизации учебного процесса в колледже _Дата выдачи задания: « » 2008г. Срок выполнения: « » 2008г. Задание составил преподаватель: ___________ Рассмотрено и одобрено на заседании методической комиссии «Математика, информатика и вычислительная техника» Протокол № ___ от «___» __________ 2008г. Председатель комиссии: _________ И.А. Кувина 2008 1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. 1.1. Анализ требований, предъявляемых к организации учебного процесса в ССУЗах, и способов решения поставленной задачи. 1.2. Обоснование и теоретический анализ выбранного способа решения задачи. Описание предметной области и модели исследуемого объекта. 1.3. Описание процесса разработки программного обеспечения по автоматизации учебного процесса в колледже и готового программного продукта. 1.4. Описание результатов исследования созданного программного обеспечения по автоматизации учебного процесса в колледже. 1.5. Составление программной и эксплуатационной документации. Описание и оценка полученных результатов. 2. ПРАКТИЧЕСКАЯ ЧАСТЬ. 2.1. Разработка программного обеспечения для организации учебного процесса в колледже, в котором необходимо: - Спроектировать логическую модель базы данных - Спроектировать физическую модель базы данных - Организовать ввод оценки за каждый месяц по каждой специальности, группе, студенту, предмету - Предусмотреть возможность корректировки данных - Организовать возможность подведения итогов успеваемости по каждой группе, специальности и в целом по колледжу (процентное содержание успеваемости и качественной успеваемости) - Предусмотреть возможность сравнения итоговых данных с итогами предыдущего месяца - Обеспечить формирование списков неуспевающих и успевающих на оценку «отлично» - Обеспечить формирование отчета (см приложение) СОДЕРЖАНИЕ Введение 1 Постановка задачи 2 Описание предметной области 2.1 Работа с базами данных в Delphi 2.2 Компоненты доступа к данным в среде Delphi 2.3 Компоненты для работы с данными 2.4 Способы доступа к данным 2.5 Язык запросов SQL 3 База данных в Microsoft Access 3.1 Этапы проектирования баз данных 4 Этапы разработка программного продукта 5 Описание результатов исследований 6 Программная и эксплуатационная документация Заключение Cписок использованной литературы ВВЕДЕНИЕ В настоящее время обработка и хранение информации не является чисто умозрительной задачей. Потеря информации или ее несвоевременное получение могут обернуться потерей денег. Именно этим обстоятельством можно объяснить столь бурный рост компьютерной техники и стремительное развитие электронных таблиц и систем управления базами данных (СУБД) в нашей стране и за рубежом. Для оперативного, гибкого и эффективного управления предприятиями, фирмами и организациями различных форм собственности, телекоммуникационными средствами гражданского и военного назначения, информационно – вычислительными, экологическими, радиолокационными системами широко внедряются системы автоматизированного управления, ядром которых являются базы данных (БД). При большом объеме информации и сложности, производимых с ней операций проблема эффективности средств организации хранения, доступа и обработки данных приобретет особое значение. Учитывая важность и значимость баз данных в современной жизни, весьма серьезные требования предъявляются к квалификации специалистов, создающих приложения на их основе. Приложение баз данных, как следует уже из его названия, предназначено для взаимодействия с некоторым источником данных — базой данных (БД). Взаимодействие подразумевает получение данных, их представление в определенном формате для просмотра пользователем, редактирование в соответствии с реализованными в программе бизнес- алгоритмами и возврат обработанных данных обратно в базу данных. В качестве источника данных могут выступать как собственно базы данных, так и обычные файлы текстовые, электронные таблицы и т. д. Базы данных обслуживаются специальными программами — системами управления базами данных (СУБД), которые делятся на локальные, преимущественно однопользовательские, предназначенные для настольных приложений, и серверные — сетевые (часто удаленные), многопользовательские, функционирующие на выделенных компьютерах — серверах. Механизм внутреннего представления данных является ядром приложения баз данных. Он обеспечивает хранение полученных данных в приложении и предоставляет их по запросу других частей приложения. Пользовательский интерфейс обеспечивает просмотр и редактирование данных, а также управление данными и приложением в целом. Бизнес-логика приложения представляет собой набор реализованных в программе алгоритмов обработки данных. Между приложением и собственно базой данных находится специальное программное обеспечение (ПО), связывающее программу и источник данных и управляющее процессом обмена данными. Это ПО может быть реализовано самыми разнообразными способами, в зависимости от объема базы данных, решаемых системой задач, числа пользователей, способами соединения приложения и базы данных. 1 ПОСТАНОВКА ЗАДАЧИ Программа «Учет успеваемости» предназначена для облегчения работы по учету успеваемости студентов, которая на данный момент ведется вручную. Данная программа должна осуществлять контроль за оценками. Подводить итоги, сравнивать показатели, выводить итоги в электронную таблицу Excel. Программа должна позволять корректировку введенных данных. Колледжу для работы с программой необходимо ввести студентов из имеющихся табелей и корректировать данные для правильного вывода отчета. Программа должна быть простой и понятной для пользователя в эксплуатации и обслуживании. 2 ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ Данная программа необходима для колледжа, так как с ее помощью можно следить за успеваемостью студентов. данная программа будет написана на языке программирования Delphi, с использованием базы данных, созданных а MS ACSESS. Язык программирования Delphi - это комбинация нескольких важнейших технологий: - Высокопроизводительный компилятор в машинный код; - Объектно-ориентированная модель компонент; - Визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов; -Масштабируемые средства для построения баз данных.[2] Компилятор, встроенный в Delphi, обеспечивает высокую производительность, необходимую для построения приложений в архитектуре “клиент-сервер”. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, Delphi обеспечивает быструю разработку без необходимости писать вставки на С или ручного написания кода (хотя это возможно). В процессе построения приложения разработчик выбирает из палитры компонент готовые компоненты как художник, делающий крупные мазки кистью. Еще до компиляции он видит результаты своей работы - после подключения к источнику данных их можно видеть отображенными на форме, можно перемещаться по данным, представлять их в том или ином виде. В этом смысле проектирование в Delphi мало чем отличается от проектирования в интерпретирующей среде, однако после выполнения компиляции мы получаем код, который исполняется в 10-20 раз быстрее, чем то же самое, сделанное при помощи интерпретатора. В Delphi компиляция производится непосредственно в родной машинный код, в то время как существуют компиляторы, превращающие программу в так называемый p-код, который затем интерпретируется виртуальной p-машиной. Это не может не сказаться на фактическом быстродействии готового приложения.[2] Основной упор в модели Delphi делается на максимальном реиспользовании кода. Это позволяет разработчикам строить приложения весьма быстро из заранее подготовленных объектов, а также дает им возможность создавать свои собственные объекты для среды Delphi. Никаких ограничений по типам объектов, которые могут создавать разработчики, не существует. Все в Delphi написано на нем же, поэтому разработчики имеют доступ к тем же объектам и инструментам, которые использовались для создания среды разработки. В результате нет никакой разницы между объектами, поставляемыми Borland или третьими фирмами, и объектами, которые можно создать. В стандартную поставку Delphi входят основные объекты, которые образуют удачно подобранную иерархию из 270 базовых классов. Но если возникнет необходимость в решении какой-то специфической проблемы на Delphi, стоит просмотреть список свободно распространяемых или коммерческих компонент, разработанных третьими фирмами, количество этих фирм в настоящее время превышает число 250. Во многом это объясняется тем, что традиционно в среде Windows было достаточно сложно реализовывать пользовательский интерфейс. Событийная модель в Windows всегда была сложна для понимания и отладки. Но именно разработка интерфейса в Delphi является самой простой задачей для программиста. Среда Delphi включает в себя полный набор визуальных инструментов для скоростной разработки приложений (RAD - rapid application development), поддерживающей разработку пользовательского интерфейса и подключение к корпоративным базам данных. VCL - библиотека визуальных компонент, включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами, управление DDE и OLE. Единственное, что можно поставить в вину Delphi, это то, что готовых компонент, поставляемых Borland, могло бы быть и больше. Однако, разработки других фирм, а также свободно распространяемые программистами freeware-компоненты уже восполнили этот недостаток.[2] Соответствующий стандарт компонент назывался VBX. И этот стандарт так же поддерживается в Delphi. Однако, визуальные компоненты в Delphi обладают большей гибкостью. В Delphi визуальные компоненты пишутся на объектном паскале, на том же паскале, на котором пишется алгоритмическая часть приложения. И визуальные компоненты Delphi получаются открытыми для надстройки и переписывания. Объекты БД в Delphi основаны на SQL и включают в себя полную мощь Borland Database Engine. В состав Delphi также включен Borland SQL Link, поэтому доступ к СУБД Oracle, Sybase, Informix и InterBase происходит с высокой эффективностью. Кроме того, Delphi включает в себя локальный сервер Interbase для того, чтобы можно было разработать расширяемые на любые внешние SQL-сервера приложения в офлайновом режиме. Разработчик в среде Delphi, проектирующий информационную систему для локальной машины (к примеру, небольшую систему учета медицинских карточек для одного компьютера), может использовать для хранения информации файлы формата .dbf (как в dBase или Clipper) или .db (Paradox). Если же он будет использовать локальный InterBase for Windows 4.0 (это локальный SQL-сервер, входящий в поставку), то его приложение безо всяких изменений будет работать и в составе большой системы с архитектурой клиент-сервер. Одно и то же приложение можно использовать как для локального, так и для более серьезного клиент-серверного вариантов.[10] Выпущены две версии Delphi - одна (Delphi Client-Server) адресована для разработчиков приложений в архитектуре “клиент-сервер”, а другая (Delphi for Windows) предназначена для остальных программистов. Приложения, разработанные при помощи Delphi, можно использовать без выплаты royalty-процентов и без оплаты runtime- лицензий. Она адресована корпоративным разработчикам, желающим разрабатывать высокопроизводительные приложения для рабочих групп и корпоративного применения. Клиент-серверная версия включает в себя следующие особенности: - SQL Links: специально написанные драйвера для доступа к Oracle, Sybase, Informix, InterBase; - Локальный сервер InterBase: SQL-сервер для Windows. СУБД для разработки в корпоративных приложений на компьютере, не подключенном к локальной сети; - ReportSmith Client/server Edition: генератор отчетов для SQL-серверов; - Team Development Support: предоставляет версионный контроль при помощи PVCS компании Intersolve (приобретается отдельно) или при помощи других программных продуктов версионного контроля; - Visual Query Builder - это средство визуального построения SQL-запросов; - лицензия на право распространения приложений в архитектуре клиент-сервер, изготовленных при помощи Delphi; - исходные тексты всех визуальных компонент. Delphi for Windows представляет из себя подмножество Delphi Client-Server и предназначен для разработчиков высокопроизводительных персональных приложений, работающих с локальными СУБД типа dBase и Paradox.Delphi Desktop Edition предлагает такую же среду для быстрой разработки и первоклассный компилятор как и клиент-серверная версия (Client/Server Edition). Эта среда позволяет разработчику быстро изготавливать персональные приложения, работающие с персональными СУБД типа dBase и Paradox. Delphi позволяет также создавать разработчику DLL, которая может быть вызвана из Paradox, dBase, C++ или каких-нибудь других готовых программ: - компилятор Object Pascal (этот язык является расширением языка Borland Pascal 7.0); - генератор отчетов ReportSmith 2.5; - среда визуального построителя приложений; - библиотека визуальных компонент; - Локальный сервер InterBase. В продукт, выпущенный компанией Borland для Delphi в RAD Pack for Delphi входит набор полезных дополнений, которые помогут разработчику при освоении и использовании Delphi. Это учебник по объектному паскалю, интерактивный отладчик самой последней версии, Borland Visual Solutions Pack (набор VBX для реализации редакторов, электронных таблиц, коммуникационные VBX, VBX с деловой графикой и т.п.), Resource WorkShop для работы с ресурсами Borland Pascal 7.0, а также эксперт для преобразования ресурсов BP 7.0 в формы Delphi. В первую очередь Delphi предназначен для профессионалов-разработчиков корпоративных информационных систем. Некоторые продукты, предназначенные для скоростной разработки приложений (RAD - rapid application development) прекрасно работают при изготовлении достаточно простых приложений, однако, разработчик сталкивается с непредвиденными сложностями, когда пытается сделать что-то действительно сложное.[10] Delphi предназначен не только для программистов-профессионалов. Руководители предприятий, планирующие выделение средств на приобретение программных продуктов, должны быть уверены в том, что планируемые инвестиции окупятся. Программист на паскале способен практически сразу профессионально освоить Delphi. Специалисту, ранее использовавшему другие программные продукты, придется труднее, однако самое первое работающее приложение он сможет написать в течение первого же часа работы на Delphi. Открытая технология Delphi является мощным гарантом того, что инвестиции, сделанные в Delphi, будут сохранены в течение многих лет.[3] Локальный сервер InterBase - это инструмент предназначен только для автономной отладки приложений. В действительности он представляет из себя сокращенный вариант обработчика SQL-запросов InterBase, в который не включены некоторые возможности настоящего сервера InterBase. Отсутствие этих возможностей с лихвой компенсируется преимуществом автономной отладки программ. Team Development Support - средство поддержки разработки проекта в группе. Позволяет существенно облегчить управление крупными проектами. Это сделано в виде возможности подключения такого продукта как Intersolve PVCS 5.1 непосредственно к среде Delphi. Высокопроизводительный компилятор в машинный код - в отличие от большинства Паскаль - компиляторов, транслирующих в p-код, в Delphi программный текст компилируется непосредственно в машинный код, в результате чего Delphi- приложения исполняются в 10-20 раз быстрее (особенно приложения, использующие математические функции). Готовое приложение может быть изготовлено либо в виде исполняемого модуля, либо в виде динамической библиотеки, которую можно использовать в приложениях, написанных на других языках программирования. Благодаря такой архитектуре приложения, изготовленные при помощи Delphi, работают надежно и устойчиво. Delphi поддерживает использование уже существующих объектов, включая DLL, написанные на С и С++, OLE сервера, VBX, объекты, созданные при помощи Delphi. Delphi имеет полностью объектную ориентацию, разработчики могут создавать свои повторно используемые объекты для того, чтобы уменьшить затраты на разработку. Delphi предлагает разработчикам - как в составе команды, так и индивидуальным - открытую архитектуру, позволяющую добавлять компоненты, где бы они ни были изготовлены, и оперировать этими вновь введенными компонентами в визуальном построителе. Разработчики могут добавлять CASE-инструменты, кодовые генераторы, а также авторские help’ы, доступные через меню Delphi. Two-way tools - однозначное соответствие между визуальным проектированием и классическим написанием текста программы. Это означает, что разработчик всегда может видеть код, соответствующий тому, что он построил при помощи визуальных инструментов и наоборот. Визуальный построитель интерфейсов (Visual User-interface builder) дает возможность быстро создавать клиент-серверные приложения визуально, просто выбирая компоненты из соответствующей палитры. Библиотека объектов включает в себя стандартные объекты построения пользовательского интерфейса, объекты управления данными, графические объекты, объекты мультимедиа, диалоги и объекты управления файлами, управление DDE и OLE. Delphi использует структурный объектно-ориентированный язык (Object Pascal), который сочетает с выразительную мощь и простоту программирования, характерную для языков 4GL, и эффективность языка 3GL. Программисты немедленно могут начать производить работающие приложения, и им не придется для этого изучать особенности программирования событий в Windows. Delphi полностью поддерживает передовые программные концепции включая инкапсуляцию, наследование, полиморфизм и управление событиями.[3] Это очень важная особенность для разработчиков в среде Windows, поскольку в уже существующие Windows-приложения программист может интегрировать то, что разработает при помощи Delphi.[2] 2.1 Работа с базами данных в Delphi Общая характеристика технологии ADO В Delphi имеется ряд компонентов, которые предназначены только для работы с MS Access, эти компоненты находятся в ADO. Чтобы обрабатывать некоторую структуру данных для неё должна быть написана программа, поставщик этих данных в соответствии с системными требованиями, такая программа называется OLE DB Provider. Такие поставщики сегодня реализованы для разных структур данных и разных СУБД. С помощью технологии OLE DB можно однотипным образом обрабатывать сложную и специфическую информацию. Однако работа с OLE DB достаточно сложна, поэтому фирма Microsoft разработала новую технологию ADO, представляющая собой набор простых компонентов. Если планируется создать новое приложение, ориентированную на работу с данными и независящая не от конкретной СУБД и не от способа хранения информации, то лучше использовать технологию ADO.[5] Технология Microsoft ActiveX Data Objects (ADO) обеспечивает универсальный доступ к источникам данных из приложений БД. Такую возможность предоставляют функции набора интерфейсов, созданные на основе общей модели объектов СОМ и описанные в спецификации OLE DB. Технология ADO и интерфейсы OLE DB обеспечивают для приложений единый способ доступа к источникам данных различных типов (Рис. 1). Например, приложение, использующее ADO, может применять одинаково сложные операции и к данным, хранящимся на корпоративном сервере SQL, и к электронным таблицам, и локальным СУБД. Запрос SQL, направленный любому источнику данных через ADO, будет выполнен.[5] За серверы БД беспокоиться не стоит, обработка запросов SQL — это их основная обязанностью. OLE DB представляет собой набор специализированных объектов СОМ, стандартные функции обработки данных, и специализированные функции конкретных источников данных и интерфейсов, обеспечивающих передачу данных между объектами. Согласно терминологии ADO, любой источник данных (база данных, электронная таблица, файл) называется хранилищем данных, с которым при помощи провайдера данных взаимодействует приложение. Минимальный набор компонентов приложения может включать объект соединения, объект набора данных, объект процессора запросов. Технология ADO в целом включает в себя не только сами объекты OLE DB, но и механизмы, обеспечивающие взаимодействие объектов с данными и приложениями. На этом уровне важнейшую роль играют провайдеры ADO, координирующие работу приложений с хранилищами данных различных типов. Провайдеры ADO обеспечивают соединение приложения, использующего данные через ADO, с источником данных (сервером SQL, локальной СУБД и файловой системой. Для каждого типа хранилища данных должен существовать провайдер ADO. Провайдер «знает» о местоположении хранилища данных и его содержании, умеет обращаться к данным с запросами и интерпретировать возвращаемую служебную информацию и результаты запросов с целью их передачи приложению.[5] Механизм доступа к данным через ADO и многочисленные объекты, и интерфейсы реализованы в VCL Delphi в виде набора компонентов, расположенных на странице ADO. Все необходимые интерфейсы, обеспечивающие работу компонентов, объявлены и описаны в файлах OleDB.pas и ADODB.pas. Такая архитектура позволяет сделать набор объектов и интерфейсов открытым и расширяемым. Набор объектов и соответствующий провайдер может быть создан для любого хранилища данных без внесения изменений в исходную структуру ADO. Так как технология ADO основана на стандартных интерфейсах СОМ, которые являются системным механизмом Windows, это сокращает общий объем работающего программного кода и позволяет распространять приложения БД без вспомогательных программ и библиотек. Компоненты ADO. На закладке ADO расположены компоненты: а) Компоненты соединения: - ADOConnection; - ADOCommand; б) Стандартные компоненты: - ADODataSet - универсальный набор данных; - ADOTable - таблица БД; - ADOQuery - запрос SQL; - ADOStoredProc - хранимая процедура. На странице ADO Палитры компонентов Delphi, кроме компонентов соединения есть стандартные компоненты, обозначающие набор данных и адаптированные для работы с хранилищем данных ADO. Компонент ADOConnection вобрал возможности перечислителя, источника данных и сессии с возможностями обслуживания транзакций. Текстовые команды ADO реализованы в компоненте ADOCommand. Наборы рядов можно получить при помощи компонентов ADOTable, ADOQuery, AOostoredProc. Каждый из них реализует способ доступа к конкретному типу представления данных в хранилище. Применительно к компонентам Delphi, совокупность возвращаемых из хранилища данных строк будем называть набором записей. Набор свойств и методов компонентов ADO обеспечивает реализацию всех необходимых приложению БД функций. Способы использования компонентов ADO немногим отличаются от стандартных компонентов VCL доступа к данным. Однако при необходимости разработчик может использовать все возможности интерфейсов ADO, обращаясь к ним через соответствующие объекты ADO. Ссылки на объекты имеются в компонентах.[10] Настройка соединения база данных с ADO. Перед созданием соединения необходимо определить его параметры. Для этого, как уже говорилось, предназначено свойство ConnectionString. Набор параметров изменяется в зависимости от типа используемого провайдера и может настраиваться как вручную, так и с помощью редактора. Для того чтобы вызывать редактор соединений, необходимо дважды щелкнуть на компоненте TADOConnection. В результате будет активировано диалоговое окно, показанное на рис. 2. В этом окне можно настроить соединение, используя поле Use Connection String, или загрузить параметры соединения из файла в разделе Use Data Link File. Параметры соединения хранятся в файлах UDL, представляющих собой обычные текстовые файлы, содержащие параметры соединения. Для того чтобы настроить соединение сданным провайдером, необходимо нажать на кнопку Build. Появится окно, в котором будет опубликован список доступных провайдеров. На вкладке Provider можно выбрать подходящий провайдер данных OLE DB для конкретного источника данных. В списке провайдеров также присутствуют провайдеры, предназначенные для доступа к конкретным службам операционной системы. На вкладке Connection необходимо указать путь к базе данных или сервер. Вкладка Advanced предназначена для указания режима доступа, аналогично свойству Mode. Вкладка АН предназначена для более «тонкой» настройки специфичных свойств провайдера. Для дальнейшей работы нужно выбрать провайдер Microsoft Jet 4.0 OLE DB Provider. Затем нужно перейти на вкладку Connection. В появившемся окне необходимо указать путь к базе данных. В поле Select or enter a database name нужно указать путь к демонстрационной базе dbdemos.mdb. После указания пути к базе данных и задания остальных необходимых параметров нужно проверить созданное соединение при помощи кнопки Test Connection. Если параметры соединения указаны верно, появится сообщение Test connection succeeded. После закрытия этого окна в строке соединения будет отображена информация, с помощью которой провайдер сможет получить доступ к данным. Компонент TADOQuery TADOQuery позволяет выполнять SQL-запросы при работе с данными через ADO. Соединение с хранилищем данных осуществляется стандартным методом. Текст запроса содержится в свойстве SQL. Параметры запроса содержатся в свойстве Parameters. В случае, если компонент возвращает набор данных, его следует открывать методом Open или присвоить свойству Active значение True. Если запрос не должен возвращать набор данных (операторы INSERT, UPDATE, DELETE и CREATE TABLE), то запрос следует выполнять вызовом метода ExecSQL. Метод возвращает число обработанных запросом записей. Свойство RowsAffected содержит число записей, которые затронул последний выполнявшийся запрос. Компонент TADOTable используется для доступа к хранилищам данных ADO и представления информации из них в табличном виде. Компонент предоставляет прямой доступ к каждой записи и ее полям, наследуя свойства и методы класса TCustomADODataSet. Компонент связывается с базой данных через свойства Connection или ConnectionString. Имя таблицы указывается в свойстве TableName. Свойство TableDirect указывает, каким образом набор данных связывается с хранилищем данных. Так как не все провайдеры поддерживают прямое соединение с набором данных, то в некоторых случаях для связи с хранилищем данных приходится использовать SQL-операторы. При установке свойству значения True компонент использует фоновые SQL-запросы для доступа к данным. Используя свойство Readonly, можно установить ограничение «только для чтения» на данную таблицу, запретив, таким образом, возможность изменять данные. В свойстве MasterSource указывается компонент TDataSource, используемый для создания отношения ссылочной целостности Master-Detail. Метод GetlndexNames возвращает список индексов, доступных компоненту в качестве списка. Компонент TDataSource - этот компонент связывается с набором данных. Эта связь осуществляется через свойство DataSet, которое содержит информацию о текущем состоянии набора данных. У этого компонента существует набор свойств и методов, которые облегчают работу с ним. Свойство AutoEdit автоматически переводит набор данных в состояние редактирования, если имеет значение True, когда связанный элемент ввода получает фокус. Метод Edit переводит связанный набор данных в состояние редактирования. Метод-обработчик OnDataChange вызывается при редактировании данных в связанном визуальном компоненте. Метод-обработчик события OnUpdateData вызывается перед тем, как измененные данные будут сохранены в наборе данных. Обработчик вызывается перед выполнением метода Post. Метод-обработчик события OnStateChange вызывается, когда изменяется состояние связанного набора данных. Набор данных - массив записей, полученный приложением по собственному запросу, называется набором данных. Набор данных как объект ведет свое начало от класса TDataSet и наследует его свойства.[10] 2.2 Компоненты доступа к данным в среде Delphi Особенности компонентов доступа к данным. Компоненты доступа к данным являются невизуальными компонентами. Таблицы БД располагаются на диске и являются физическими объектами. Для операций с данными, содержащимися в таблицах, используются наборы данных. В терминах системы Delphi набор данных представляет собой совокупность записей, взятых из одной или нескольких таблиц БД. Записи, входящие в набор данных, отбираются по определенным правилам, при этом в частных случаях набор данных может включать в себя все записи из связанной с ним таблицы или не содержать ни одной записи. Набор данных является логической таблицей, с которой можно работать при выполнении приложения. Взаимодействие таблицы и набора данных напоминает взаимодействие физического файла и файловой переменной.[5] В Delphi для работы с наборами данных служат компоненты DBTable и ADOTable, DBQuery и ADOQuery, DataAccess, DataControl, DecisionQuery и StoredProc. Компонент StoredProc используется для вызова хранимых процедур при организации взаимодействия с удаленными БД, а компонент UpDateSQL обеспечивает работу с кэшированными изменениями в записях. Компонент DecisionQuery применяется при построении систем принятия решений. Наиболее универсальными и, соответственно, часто используемыми являются компоненты Table и Query, задающие наборы данных.[5] Компонент доступа к данным DataSet. Базовые возможности доступа к БД обеспечивает класс DataSet, представляющий наборы данных в виде совокупности строк и столбцов (записей и полей). Этот класс предоставляет основные средства навигации и редактирования наборов данных. Компонент DataSet предназначен для представления набора данных из хранилища данных ADO. Он прост в использовании, имея только несколько собственных свойств и методов. Это единственный компонент ADO, инкапсулирующий набор данных, для которого опубликованы свойства, позволяющие управлять командой ADO. В результате компонент представляет собой гибкий инструмент, который позволяет (в зависимости от типа команды и ее текста) получать данные из таблиц, запросов SQL, хранимых процедур, файлов и т. д.[5] Компоненты доступа к данным Table и Query. Компоненты Table и Query являются производными от класса ADODataSet потомка класса DataSet. Они демонстрируют схожие с базовыми классами характеристики и поведение, но каждый них имеет и свои особенности. Компонент АDOTаblе обеспечивает использование в приложениях Delphi таблиц БД, подключенных через провайдеры OLE DB. По своим функциональным возможностям и применению он подобен стандартному табличному компоненту. В основе компонента лежит использование команды ADO, но ее свойства настроены заранее и изменению не подлежат. Другие свойства и методы компонента обеспечивают применение индексов. Так как не все провайдеры ADO обеспечивают прямое использование таблиц БД, то для доступа к ним может понадобиться запрос SQL. Компонент Table представляет собой набор данных, который в некоторый момент времени может быть связан только с одной таблицей БД. Этот набор данных формируется на базе навигационного способа доступа к данным, поэтому компонент Table рекомендуется использовать для локальных БД, таких как dBase и Paradox. При работе с удаленными БД следует использовать компонент Query. Связь между таблицей и компонентом Table устанавливается через его свойства TableName, которое задает имя таблицы. При задании значения свойства TableName указывается имя файла и расширение имя файла. На этапе разработки приложения имена всех таблиц доступны в раскрывающемся списке Инспектора объектов. В этот список попадают таблицы, файлы которых расположены в каталоге, указанном в свойстве TableName. Компонент ADOQuery обеспечивает применение запросов SQL при работе с данными через ADO. По своей функциональности он подобен стандартному компоненту запроса. Компонент Query представляет собой набор данных, записи которого формируются в результате выполнения SQL-запроса и основаны на реляционном способе доступа к данным. При работе с удаленными БД рекомендуется использовать набор данных Query. При работе с удаленными базами данных следует обращаться к средствам языка SQL. Это относится и к таким операциям, как перемещение по набору данных или вставка в него записей. Если же для компонента Query используются методы типа Next и Insert, то вместо реляционного способа доступа к данным будет применён навигационный. В результате набора данных Query будет мало чем отличаться от набора данных Table. В отличие от компонента Table. Набор данных Query может включать в себя записи более чем одной таблицы БД. Текст запроса, на основании которого в набор данных отбираются записи, содержится в свойстве SQL типа Strings. Запрос включает в себя команды на языке SQL и выполняется при открытии набора данных. Запрос SQL иногда называется SQL-программой. SQL-запрос можно формировать и изменять динамически, внося изменения в его текст непосредственно при выполнении приложения.[5]
2.3 Компоненты для работы с данными
Понятие и особенности визуальных компонентов в среде Delphi. Визуальные компоненты для работы с данными расположены на странице DataControls Палитры компонентов и предназначены для построения интерфейсной части приложения. Они используются для навигации по набору данных, а также для отображения и редактирования записей. Часто эти компоненты называются элементами, чувствительные к данным.[5] Одни визуальные компоненты для работы с данными предназначены для выполнения операций с полями отдельной записи, они отображают и позволяют редактировать значение поля текущей записи. К таким компонентам относятся, например, однострочный редактор Edit и графический обзор Image. Другие компоненты служат для отображения и редактирования сразу нескольких записей. Примерами таких компонентов являются сетки DBGrid и DBCtrlGrid, выводящие записи набора данных в табличном виде. Визуальные компоненты для работы с данными похожи на соответствующие компоненты страниц Standard и Additional и отличаются, в основном, тем, что ориентированны на работу с БД и имеют дополнительные свойства DataSource и Datafield. Первое из них указывает на источник данных, а второе - на поле набора данных, с которым связан визуальный компонент. Например, Edit отображает строковое значение, позволяя пользователю изменять его. Для всех визуальных компонентов, предназначенных для отображения и редактирования значений полей, при изменении пользователем их содержимого набор данных автоматически переводится в режим редактирования. Произведённые с помощью этих компонентов изменения автоматически сохраняются в связанных с ними полях при наступлении определённых событий. При программном изменении содержимого эти визуальных компонентов набор данных автоматически в режим редактирования не переводится. Для этой цели в коде должен предварительно вызываться метод Edit набора. Чтобы сохранить изменения в поле (полях) текущей записи, мы должны также предусмотреть соответствующие действия, например, вызов метода Post или переход к другой записи набора данных.[5] Общая характеристика визуальных компонентов. В библиотеке визуальных компонентов для всех компонентов, в том числе и предназначенных для работы с данными, базовым является классу Control. Он обеспечивает основные функциональные атрибуты такие, как положение и размеры элемента, его заголовок, цвет и другие параметры. Класс Control включает в себя общие для визуальных компонентов свойства, события и методы. В целом визуальные компоненты можно разделить на две группы: оконные и неоконные. Оконный элемент управления представляет собой специализированное окно, предназначенное для решения конкретной задачи. К таким элементам относятся, например, поля редактирования, командные кнопки, полосы прокрутки. Такие компоненты, как Edit, DBEdit, Memo или DBMemo при получении фокуса ввода отображают в своей области курсор редактирования. Компоненты, не связанные с редактированием информации, получение фокуса ввода обычно отображают с помощью с помощью пунктирного черного прямоугольника. К неоконным элементам управления базовым является класс GraphiControl, производимый непосредственно от класса Control. Неоконные элементы управления на могут получать фокус ввода. Их достоинством является менее расходования ресурсов. Свойства и события визуальных компонентов для работы с данными. Свойства позволяют управлять внешним видом и поведением компонентов при проектировании и при выполнении приложения. Обычно установка значений большинства свойств компонентов выполняется на этапе проектирования с помощью инспектора объектов. Свойство Name указывает на имя компонента, которое используется для управления компонентов во время выполнения приложения. Каждый новый компонент, помещаемый на форму, получает имя по умолчанию, автоматически образуемое путем добавления к названию компонента его номера в порядке помещения на форму. На этапе разработки приложения мы можем изменять имя компонента на более осмысленное и соответствующее назначению компонента. Свойство Aling определяет способ выравнивания компонента на самой форме, на которой оно находится. Выравнивание используется в случае, когда требуется, чтобы какой-либо интерфейсный элемент занимал определённое положение. Свойство Caption содержит строку для надписи заголовка компонента. Отдельные символы в заголовке могут быть подчеркнуты, они означают комбинации клавиш быстрого доступа. Свойство Color определяет цвет фона. Часто удобно задавать цвета с помощью констант. Отображаемые цвет зависит от параметров видеокарты и монитора, в первую очередь от установленного цветного разрешения. Визуальные компоненты способны генерировать и обрабатывать достаточно большое число событий различных видов. К наиболее общим группам событий можно отнести следующие действия: - Выбор управляющего элемента; - Перемещение указателя мыши; - Нажатие клавиш клавиатуры; - Получение и потеря управляющим элементом фокуса ввода; - Перемещение объектов методом drag-and-drop. Существуют и более сложные события, требующие передачи дополнительных параметров, например событие, связанное с перемещением указателя мыши, передаёт координаты указателя. 2.4 Способы доступа к данным Сущность навигационного способа доступа к данным. Навигационный способ доступа заключается в обработки каждой записи набора данных. Достоинством этого способа является простота кодирования операции, а основной недостаток состоит в том, что приложение получает все записи набора независимо от того, сколько их на самом деле требуется обработать. Это приводит к большой нагрузке на сеть, особенно при интенсивном обмене данными. Поэтому применение навигационного способа доступа обычно ограничивается локальными БД. При навигационном способе доступа операции выполняются с отдельными записями. Каждый набор данных имеет указатель текущей записи, то есть записи, с полями которой могут быть выполнены такие операции, как редактирование или удаление. Компоненты Table и Query позволяют управлять положением этого указателя.[5] Навигационный способ доступа даёт возможность осуществлять следующие операции: - сортировка записей; - навигация по набору данных; - редактирование записей; - вставка и удаление записей; - фильтрация записей; - поиск записей. Редактирование, вставка и удаление записей. Редактирование записей заключается в изменении значений их полей. Редактирована, может быть только текущая запись, поэтому перед действиями, связанными с редактированием, обычно выполняются операции по поиску и перемещению на требуемую запись. После того. Как указатель текущей записи установлен на нужную запись, и набор данных находится в режиме просмотра, для редактирования записи следует: - перевести набор данных в редактирование; - изменить значение полей записи; - подтвердить изменения или отказаться от них. Метод Insert переводит набор данных в режим вставки и добавляет к нему новую пустую запись. Для добавления записи нужно: - перевести набор данных в режим записи; - задать значение полей новой записи; - подтвердить изменения или отказаться от них. Удаление текущей записи выполняет метод Delete, который работает только с модифицируемым набором данных. В случае успешного удаления записи текущей становится следующая запись, если же удалялась последняя запись, то курсор перемещается на предыдущую запись, которая после удаления становится последней. В отличие от некоторых СУБД, в Delphi удаляемая запись действительно удаляется из набора данных. Сортировка записей и навигация по набору данных. Порядок расположения записей может быть неопределённым. По умолчанию записи не отсортированы или сортируются. С отсортированными наборами записей работать более удобно. Сортировка заключается в упорядочивании записей по определённому полю в порядке возрастания или убывания содержащихся в нём значений. Сортировку можно выполнять и по нескольким полям.[5] При сортировки по двум полям записи сначала упорядочиваются по значениям первого поля, а затем группы записей с одинаковым значением первого поля сортируются по второму полю. Сортировка наборов данных Table и Query выполняется различными способами. Сортировка наборов данных Table выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей. Таким образом, сортировка возможна по полям, для которых создан индекс. Для сортировки по нескольким полям нужно создавать индекс, включающий эти поля. Направление сортировки определяется параметром ixDescending текущего индекса, по умолчанию он выключен, и упорядочивание выполняется в порядке возрастания значений. Если для индекса признак ixDescending включен, то сортировка выполняется в порядке убывания значений. Поля, по которым сортируются записи, устанавливаются через свойств IndexName. Перемещение по набору данных заключается в управлении указателем текущей записи. Этот указатель определяет запись, с которой будут выполняться такие операции, как редактирование или удаление. Перед перемещение указателя текущей записи набор данных автоматически переводится в режим просмотра. Если текущая запись находилась в режимах редактирования или вставки, то перед перемещением указателя сделанные в записи изменения вступают в силу, для чего набор данных автоматически вызывает метод CheckBrowseMode. Для перемещения указателя текущей записи в наборе данных используются методы: - Процедура First установка на первую строку; - Процедура Next установка на следующую строку; - Процедура Last установка на последнюю строку; - Процедура Prior установка на предыдущую строку. При перемещении по записям набора данных связанные с ним визуальные компоненты отображают изменения данных, причем смена отображения может происходить достаточно быстро. Побочным эффектом выполнения ряда операций с наборами данных является изменение положения указателя текущей записи. Часто этот эффект ненадёжен, так как после выполнения такой операции указатель находится не в том месте, где был до начала операции. При этом приходится снова отыскивать нужную запись и ставить на нее указатель, что неудобно даже при небольшом количестве записей. Фильтрация записей. Фильтрация – это задание ограничений для записей, отбираемых в набор данных. Набор данных представляет собой записи, набранные из одной или нескольких таблиц. Состав записей в наборе данных в данный момент времени зависит от установленных ограничений, в том числе и от фильтров. Система Delphi дает возможность осуществлять фильтрацию записей: - по выражению; - по диапазону. По умолчанию фильтрация записей не ведётся, и набор данных Table содержит все записи связанной с ним таблицы БД, а в набор данных Query включаются все записи, удовлетворяющие SQL-запросу, содержащемуся в свойстве SQL. Фильтрация похожа на SQL–запросы, но является менее мощным средством. По сравнению с SQL–запросами фильтрация менее эффективна, так как ограничивается количество записей, видимых в наборе. При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей. Достоинством фильтрации по выражению является то, что она применима к любым полям, в том числе и неиндексированным. В связи с тем, что в процессе отбора просматриваются все записи таблицы, фильтрация по выражению эффективна при небольшом количестве записей. Для задания выражения фильтра представляет собой конструкцию, в состав которой могут входить следующие элементы: - имена полей таблицы; - литералы; - операции сравнения; - арифметические операции; - логические операции; - круглые и квадратные скобки. Если имя поля содержит пробелы, то его заключают в квадратные скобки. Литерал представляет собой значение, чаще всего - число, строка или символ. Имена переменных в выражении фильтра использовать нельзя. Если в выражении фильтра требуется включить значение переменной или свойства какого-либо компонента, то это значение должно быть преобразовано в строковый тип. Операции сравнения представляют собой обычные отношения <,>,=,<=,>=,<>. Арифметическими являются операции +, -,* и /. В качестве логических операций можно использовать AND, OR и NOT. Круглые скобки применяются для изменения порядка выполнения арифметических и логических операций. Набор данных Table допускается два способа задания условии фильтрации: су помощью выражения фильтра Filter и в обработчике события OnFilterRecord. В случае набора данных Query для записей можно использовать: SQL-запрос, обработчик событияOnFilterRecord, выражения фильтра. При фильтрации по диапазону в набор данных включаются записи, значения полей которых попадают в заданный диапазон, т.е. условием фильтрации является выражение вида «значение>нижняя граница AND значение < верхней границы». Такая фильтрация применяется к наборам данных Table. Достоинство фильтрации по диапазону является высокая скорость обработки записей. В отличие от фильтрации по выражению, когда последовательно просматриваются все записи таблицы, фильтрация по диапазону ведётся индексно-последовательным методом, поэтому этот способ фильтрации применим только для индексированных полей. Индекс поля, диапазон которого задан как текущий с помощью свойства IndexName или IndexFieldName. Если текущий индекс не установлен, то по умолчанию используется главный индекс. Для включения и выключения фильтрации по диапазону применяются методы ApplyRange и CancelRange. Первый из них активизирует фильтрацию, а другой - деактивизирует. Предварительно для индексного поля или полей, по которому выполняется фильтрация, следует задать диапазон допустимых значений. Когда одна из границ диапазона не задана, то диапазон открыт, то есть нижняя граница становится равной минимально возможному, а верхняя граница максимально возможному значению этого поля. Поиск записей. Поиск записи, удовлетворяющей определённым условиям, означает переход на эту записи. Поиск во многом похож на фильтрацию, так как в процессе поиска также выполняется проверка полей записей на некоторые условия. Отличие заключается в том, что в результате поиска количество записей в наборе данных не изменяется. При организации поиска записей важное значение имеет наличие индекса для полей, по которым ведётся поиск. Индексирование значительно повышает скорость обработки данных, кроме того, ряд методов может работать только с индексированными полями. Для поиска записей по полям служат методы Locate и Lookup, причем поля могут быть не индексированными. Функция Locate ищет запись с заданными значениями полей. Если удовлетворяющие условиям поиска записи существует, то указатель текущей записи устанавливается на первую из них. Если запись найдена, функция возвращает значение True, в противном случае значение False. Обычно при разработки приложения пользователю предоставляется возможность влиять на процесс поиска су помощью управляющих элементов, расположенных на форме. При этом действия пользователя по управлению поиском в наборе данных мало, чем отличаются от аналогичных действий при выполнении фильтрации. Функция Lookup так же осуществляет поиску записи, удовлетворяющей определённым условиям, но, в отличие от метода Locate, не перемещает указатель текущей записи, а считывает информацию из полей записи. Еще одно отличие между двумя методами заключается в том, что метод Lookup осуществляет поиск на точное соответствие значений для поиска и значений в полях записей с учетом регистра букв. Для набора данных Table имеются методы, позволяющие вести поиск записей только по индексным полям. Перед вызовом любого из этих методов следует установить в качестве текущего индекс, построенный по используемым для поиска полям. Методы поиска можно разделить на две группы, в первой группе методы, предназначенные для поиска на точное соответствие, а другую образуют методы, допускающие только частичное совпадение заданных для поиска значений и значений полей записей. Если заданным условиям поиска соответствует несколько записей, то указатель текущей записи устанавливается на первую из них. Порядок сортировки и, соответственно, порядок расположения записей в наборе даны, определяется текущим индексом, по которому и ведется поиск.[5] 2.5 Язык запросов SQL SQL символизирует собой Структурированный Язык Запросов. Это - язык, который дает возможность создавать и работать в реляционных базах данных, являющихся наборами связанной информации, сохраняемой в таблицах. Информационное пространство становится более унифицированным. Это привело к необходимости создания стандартного языка, который мог бы использоваться в большом количестве различных видов компьютерных сред. Стандартный язык позволит пользователям, знающим один набор команд, использовать их для создания, нахождения, изменения и передачи информации - независимо от того, работают ли они на персональном компьютере, сетевой рабочей станции, или на универсальной ЭВМ. В нашем все более и более взаимосвязанном компьютерном мире, пользователь снабженный таким языком, имеет огромное преимущество в использовании и обобщении информации из ряда источников с помощью большого количества способов. Элегантность и независимость от специфики компьютерных технологий, а также его поддержка лидерами промышленности в области технологии реляционных баз данных, сделало SQL (и, вероятно, в течение обозримого будущего оставит его) основным стандартным языком.[2] Язык SQL предназначен для манипулирования данными в реляционных базах данных, определения структуры баз данных и для управления правами доступа к данным в многопользовательской среде. Поэтому, в язык SQL в качестве составных частей входят: - язык манипулирования данными (Data Manipulation Language, DML) - язык определения данных (Data Definition Language, DDL) - язык управления данными (Data Control Language, DCL). Это не отдельные языки, а различные команды одного языка. Такое деление проведено только лишь с точки зрения различного функционального назначения этих команд. Язык манипулирования данными используется, как это следует из его названия, для манипулирования данными в таблицах баз данных. Он состоит из 4 основных команд: SELECT (выбрать) INSERT (вставить) UPDATE (обновить) DELETE(удалить) Язык определения данных используется для создания и изменения структуры базы данных и ее составных частей - таблиц, индексов, представлений (виртуальных таблиц), а также триггеров и сохраненных процедур. Основными его командами являются: CREATE DATABASE (создать базу данных) CREATE TABLE (создать таблицу) CREATE VIEW (создать виртуальную таблицу) CREATE INDEX (создать индекс) CREATE TRIGGER (создать триггер) CREATE PROCEDURE (создать сохраненную процедуру) ALTER DATABASE (модифицировать базу данных) ALTER TABLE (модифицировать таблицу) ALTER VIEW (модифицировать виртуальную таблицу) ALTER INDEX (модифицировать индекс) ALTER TRIGGER (модифицировать триггер) ALTER PROCEDURE (модифицировать сохраненную процедуру) DROP DATABASE (удалить базу данных) DROP TABLE (удалить таблицу) DROP VIEW (удалить виртуальную таблицу) DROP INDEX (удалить индекс) DROP TRIGGER (удалить триггер) DROP PROCEDURE (удалить сохраненную процедуру) Язык управления данными используется для управления правами доступа к данным и выполнением процедур в многопользовательской среде. Более точно его можно назвать “язык управления доступом”. Он состоит из двух основных команд: GRANT (дать права) REVOKE (забрать права) С точки зрения прикладного интерфейса существуют две разновидности команд SQL: - интерактивный SQL - встроенный SQL. Интерактивный SQL используется в специальных утилитах (типа WISQL или DBD), позволяющих в интерактивном режиме вводить запросы с использованием команд SQL, посылать их для выполнения на сервер и получать результаты в предназначенном для этого окне. Встроенный SQL используется в прикладных программах, позволяя им посылать запросы к серверу и обрабатывать полученные результаты, в том числе комбинируя set-ориентированный и record-ориентированный подходы. Наиболее важной командой языка манипулирования данными является команда SELECT. Операция выборки позволяет получить все строки (записи) либо часть строк одной таблицы. К логическим операторам относятся известные операторы AND, OR, NOT, позволяющие выполнять различные логические действия: логическое умножение (AND, “пересечение условий”), логическое сложение (OR, “объединение условий”), логическое отрицание (NOT, отрицание условий”). В наших примерах мы уже применяли оператор AND. Использование этих операторов позволяет гибко “настроить” условия отбора записей. Оператор AND означает, что общий предикат будет истинным только тогда, когда условия, связанные по “AND”, будут истинны. Оператор OR означает, что общий предикат будет истинным, когда хотя бы одно из условий, связанных по OR”, будет истинным. Оператор NOT означает, что общий предикат будет истинным, когда условие, перед которым стоит этот оператор, будет ложным. В одном предикате логические операторы выполняются в следующем порядке: сначала выполняется оператор NOT, затем - AND и только после этого - оператор OR. Для изменения порядка выполнения операторов разрешается использовать скобки. Изменение порядка выводимых строк (ORDER BY) Порядок выводимых строк может быть изменен с помощью опционального (дополнительного) предложения ORDER BY в конце SQL-запроса. Это предложение имеет вид: ORDER BY <порядок строк> [ASC | DESC] Порядок строк может задаваться одним из двух способов: - именами столбцов; - номерами столбцов. Способ упорядочивания определяется дополнительными зарезервированными словами ASC и DESC. Способом по умолчанию - если ничего не указано - является упорядочивание “по возрастанию (ASC). Если же указано слово “DESC”, то упорядочивание будет производиться “по убыванию”.[2] 3 БАЗА ДАННЫХ В MICROSOFT ACCESS С помощью электронных таблиц со списками студентов их посещаемостью и успеваемостью была создана база данных в MS ACSESS. Приложение Microsoft Access является мощной и высокопроизводительной 32-разрядной системой управления реляционной базой данных (далее СУБД). База данных – это совокупность структурированных и взаимосвязанных данных и методов, обеспечивающих добавление выборку и отображение данных. Реляционная база данных. Практически все СУБД позволяют добавлять новые данные в таблицы. С этой точки зрения СУБД не отличаются от программ электронных таблиц (Excel), которые могут эмулировать некоторые функции баз данных.[11] Существует три принципиальных отличия между СУБД и программами электронных таблиц: 1) СУБД разрабатываются с целью обеспечения эффективной обработки больших объёмов информации, намного больших, чем те, с которыми справляются электронные таблицы; 2) СУБД может легко связывать две таблицы так, что для пользователя они будут представляться одной таблицей. Реализовать такую возможность в электронных таблицах практически невозможно; 3) СУБД минимизируют общий объём базы данных. Для этого таблицы, содержащие повторяющиеся данные, разбиваются на несколько связанных таблиц. Access – мощное приложение Windows. При этом производительность СУБД органично сочетаются со всеми удобствами и преимуществами Windows. Как реляционная СУБД Access обеспечивает доступ ко всем типам данных и позволяет одновременно использовать несколько таблиц базы данных. Можно использовать таблицы, созданные в среде Paradox или dBase. Access специально спроектирован для создания многопользовательских приложений, где файлы базы данных являются разделяемыми ресурсами в сети. В Access реализована надёжная система защиты от несанкционированного доступа к файлам. База данных храниться в одном файле, но профессиональные пользователи предпочитают разделять базу данных на два файла: в одном хранятся объекты данных (таблицы, запросы), в другом объекты приложения (формы, отчёты, макросы, модули). В последних версиях Access представлен новый формат файла (MDE) –библиотеки, с помощью которого можно создавать приложения, не включая VBA-код.[11] Основные функции: 1) Организация данных. Создание таблиц и управление ими; 2) Связывание таблиц и обеспечение доступа к данным. Access позволяет связывать таблицы по совпадающим значениям полей, с целью последующего соединения нескольких таблиц в одну; 3) Добавление и изменение данных. Эта функция требует разработки и реализации представленных данных, отличных от табличных (формы); 4) Представление данных. Access позволяет создавать различные отчёты на основе данных таблиц и других объектов базы данных; 5) Макросы. Использование макросов позволяет автоматизировать повторяющиеся операции. В последних версиях Access макросы используют для совместимости; 6) Модули. Модули представляют собой процедуру или функцию, написанные на Access VBA (диалект Visual Basic Application). Эти процедуры можно использовать для сложных вычислений. Процедуры на Access VBA превышают возможности стандартных макросов; 7) Защита базы данных. Эти средства позволяют организовать работу приложения в многопользовательской среде и предотвратить несанкционированный доступ к базам данных; 8) Средства печати. С помощью этой функции Access позволяет распечатать практически всё, что можно увидеть в базе данных; Access так же позволяет создавать дистрибутивные диски для распространения готового приложения (с помощью Office Developer Edition Tools). Распространение подразумевает поставку всех необходимых файлов на каком-либо носителе. Пакет ODE Tools включает мастер установки, автоматизирующий создание средств распространения и программы установки. Он так же позволяет выполнение приложения на компьютерах, на которых не установлен Access. Элементы базы данных: 1) Таблицы. В базе данных информация хранится в виде двумерных таблиц. Можно так же импортировать и связывать таблицы из других СУБД или систем управления электронными таблицами. Одновременно могут быть открыты 1024 таблицы; 2) Запросы. При помощи запросов можно произвести выборку данных по какому-нибудь критерию из разных таблиц. В запрос можно включать до 255 полей; 3) Формы. Формы позволяют отображать данные из таблиц и запросов в более удобном для восприятия виде. С помощью форм можно добавлять и изменять данные, содержащиеся в таблицах. В формы позволяют включать модули; 4) Отчёты. Отчёты предназначены для печати данных, содержащихся в таблицах и запросах, в красиво оформленном виде. Отчёты так же позволяют включать модули; 5) Макросы 6) Модули. Модули содержат VBA-код, используемый для написания процедур обработки событий таких, как, например, нажатия кнопки в форме или отчёте, для создания функций настройки, для автоматического выполнения операций над объектами базы данных и программного управления операциями, т.е. добавление VBA-кода позволяет создать полную базу данных с настраиваемыми меню, панелями инструментов и другими возможностями. Модули снимают с пользователя приложения необходимость помнить последовательность выбора объектов базы данных для выполнения того или иного действия и повышают эффективность работы; В состав Access входит множество мастеров, построителей и надстроек, которые позволяют упростить процесс создания объектов базы данных. Таблицы 1) Создание таблицы в режиме Мастера таблиц. Процесс создания объекта базы данных при помощи мастера делится на несколько шагов, на каждом из которых можно установить требуемые характеристики создаваемого объекта. Мастер таблиц позволяет создать новую таблицу на основе 33 образцов таблиц делового применения и 20 образцов таблиц личного применения (для английской версии Access соответственно 77 и 44). Многие таблицы базы данных созданы на основе образцов Мастера таблиц. Использование Мастера таблиц служит отличным примером, позволяющим понять общую процедуру работы с мастерами Access. Создание таблиц на основе образцов Мастера таблиц имеет ограниченные возможности в настоящих приложениях. В большинстве случаев для создания таблиц используется импорт или связывание данных с другими базами данных или электронными таблицами. 2) Создание таблицы в режиме Конструктора таблиц. Если импортировать или связать данные нельзя, то чаще всего таблицы создаются в режиме конструктора, который позволяет определить требуемую структуру таблицы. В режиме конструктора таблиц можно увидеть названия, типы данных, описания назначения, а также некоторые дополнительные свойства полей таблицы. То, что появляется в верхней части окна таблицы, открытой в режиме конструктора, называется бланком структуры таблицы или просто бланком таблицы. В нижней части окна таблицы, открытой в режиме конструктора, выводятся свойства полей таблицы, а также краткое описание активного свойства таблицы. 3) Создание таблицы непосредственно в режиме таблицы. Access дает возможность создания таблиц непосредственно в режиме таблицы. При этом Access создает пустую таблицу на основе таблицы, используемой по умолчанию, со структурой, имеющей 20 полей и 30 пустых записей. После этого можно вводить данные прямо в таблицу. При ее сохранении Access анализирует данные и выбирает тот тип для каждого поля, который больше всего соответствует введенным данным. Создание таблиц в режиме таблицы имеет ограниченное применение. Поля таблицы не имеют содержательных имен, так что почти всегда нужно будет редактировать структуру, чтобы переименовать поля. Кроме того, из примера Access не всегда может правильно определить тип данных. Таблицы, которые созданы в режиме таблицы, не могут включать объекты OLE и мемо-поля. Если есть желание иметь такие поля, вам нужно изменить структуру таблицы. При создании таблицы в режиме таблицы не происходит экономии времени по сравнению с традиционным способом определения полей и установки их свойств в структуре пустой таблицы. При разработке структуры таблицы необходимо указать, какую информацию она должна содержать. После того как определена информация, которая должна быть включена в таблицу, ее следует разбить по полям. Этот процесс включает в себя выбор имени поля, которое в таблице должно быть уникальным. Необходимо включать в имя поля как можно больше информации о его содержимом, но в то же время стараться избегать длинных имен. Обычно при разработке баз данных в различных таблицах могли содержаться поля с одинаковыми именами (чаще всего таблицы связывались по этим полям). Access также позволяет использовать одинаковые имена полей в различных таблицах, но по причине того, что Access использует имена полей при определении условий целостности данных, лучше не допускать повторения имен полей. Перед началом заполнения таблицы нужно определить связи этой таблицы с другими таблицами базы данных, определить ключевое поле и создать индексы. Связь между таблицами устанавливает отношения между совпадающими значениями в ключевых полях — обычно между полями разных таблиц. В большинстве случаев связывают ключевое поле одной таблицы с соответствующим ему полем (часто имеющим то же имя), которое называют полем внешнего ключа во второй таблице. Таблица, содержащая ключевое поле, называется главной, а таблица, содержащая внешний ключ — связанной. Существует четыре вида отношений: - Один к одному. При использовании отношения "один к одному" запись в таблице "А" (главной таблице) может иметь не более одной связанной записи в таблице "В" (связанной таблице) и наоборот. Этот тип связи используют не очень часто, поскольку такие данные могут быть помещены в одну таблицу. Связь с отношением "один к одному" используют для разделения очень широких таблиц или для отделения части таблицы по соображениям защиты. В таблицах связанных отношением "один к одному" ключевые поля должны быть уникальными; - Один ко многим. Связь с отношением "один ко многим" является наиболее часто используемым типом связи между таблицами. В такой связи каждой записи в таблице "А" могут соответствовать несколько записей в таблице "В", а запись в таблице "В" не может иметь более одной; - Многие к одному. При использовании отношения "многие к одному" одной записи в таблице "А" может соответствовать одна запись в таблице “B”, а запись в таблице "В" может иметь более одной соответствующей ей записи в таблице "А". В таблице "А" ключевое поле должно быть уникальным. Связь с отношением "один ко многим" таблиц "А" и "В" можно рассматривать как связь с отношением "многие к одному" таблиц "В" и "А"; - Многие ко многим. При использовании отношения "многие ко многим" одной записи в таблице "А" могут соответствовать несколько записей в таблице "В", а одной записи в таблице "В" несколько записей в таблице "А". В этом случае не требуется уникальности ключевых полей таблиц "А" и "В". Этот вид отношения используется для связывания таблиц, имеющих только внешние ключи. Связанные поля не обязательно должны иметь одинаковые имена, однако, они должны иметь одинаковые типы данных. Кроме того, связываемые поля типа "Числовой" должны иметь одинаковые значения свойства "Размер поля". Исключениями из этого правила являются поля счетчика с последовательной нумерацией, которые могут связываться с числовыми полями размера "Длинное целое". Существует возможность создать связь между текстовыми полями разной длины, но это может вызвать сложности при создании запросов. Автоматическое обеспечение ссылочной целостности данных является важной особенностью Access. Если на связь между таблицами наложены условия ссылочной целостности, то Access не позволяет добавлять в связанную таблицу записи, для которых нет соответствующих записей в главной таблице, и изменять записи в главной таблице таким образом, что после этого в связанной таблице появятся записи, не имеющие главных записей; а также удалять записи в главной таблице, для которых имеются подчиненные записи в связанной таблице. Условия целостности данных определяют систему правил, используемых в Access для поддержания связей между записями в связанных таблицах. Эти правила делают невозможным случайное удаление или изменение связанных данных. После наложения условий целостности данных на операции со связанными таблицами накладываются ограничения. Невозможно ввести в поле внешнего ключа связанной таблицы значение, не содержащееся в ключевом поле главной таблицы. Необходимо так же определить первичный ключ. Если таблица никогда не будет использоваться в качестве главной, то ключ для нее определять не нужно. В главных таблицах обычно содержится информация о реальных объектах, причем с каждым объектом ассоциируется только одна запись. Определение ключа таблицы является простейшим способом предотвращения появления в таблице одинаковых записей. В главной таблице связи должен быть определен первичный ключ. Access считает таблицы, у которых такой ключ не определен, подозрительными. При открытии таких таблиц в режиме конструктора появляется диалоговое окно, сообщающее о том, что ключ таблицы не определен. Ключ можно определить и в связанных таблицах, что поможет избежать появления повторяющихся данных. Ключ таблицы можно задать по значению нескольких полей. Access автоматически индексирует таблицу по значению ключа, но может потребоваться создать дополнительные индексы по значениям других полей. Индексы позволяют ускорить поиск данных в тех полях таблицы, по которым она проиндексирована. Каждая таблица Access может иметь до 32 индексов, 5 из которых могут быть составными (в составной индекс может входить не более 10 полей). Тем не менее, не стоит увлекаться созданием индексов для каждого поля таблицы и всех их комбинаций, поскольку это может существенно замедлить процесс заполнения таблицы (при изменении или добавлении записи автоматически обновляются все индексы). Одним из основных принципов разработки реляционных баз данных является то, что все данные, содержащиеся в поле таблицы, должны иметь один и тот же тип. Для каждого поля таблицы необходимо задать тип данных. По умолчанию используется тип данных «Текстовый». При задании типа данных поля можно также указать размер, формат и другие параметры, влияющие на отображение значения поля и точность числовых данных. Основные типы данных: 1) Текстовый. Текст или числа, не требующие проведения расчётов; 2) МЕМО. Поле этого типа предназначено для хранения небольших текстовых данных (до 64000 символов). Поле этого типа не может быть ключевым или проиндексированным; 3) Числовой. Этот тип данных содержит множество подтипов. От выбора подтипа (размера) зависит точность вычислений; 4) Счётчик. Уникальные, последовательно возрастающие числа, автоматически вводящиеся при добавлении новой записи в таблицу; 5) Логический. Логические значения, а так же поля, которые могут содержать одно из двух возможных значений; 6) Денежный. Денежные значения и числовые данные, используемые в математических вычислениях; 7) Дата/Время. Дата и время хранятся в специальном фиксированном формате; 8) Поле объекта OLE. Включает звукозапись, рисунок и прочие типы данных. Поле этого типа не может быть ключевым или проиндексированным; 9) Гиперсвязь. Содержит адреса Web-страниц. Запросы Запросы являются важным инструментом в любых системах управления базами данных. Они используются для выделения, обновления и добавления новых записей в таблицы. Чаще всего запросы используются для выделения специфических групп записей, чтобы удовлетворить определенному критерию. Кроме того, их можно использовать для получения данных из различных таблиц, обеспечивая единое представление связанных элементов данных. В Access существует четыре типа запросов для различных целей: Запросы на выборку отображают данные из одной или нескольких таблиц в виде таблицы. Перекрестные запросы собирают данные из одной или нескольких таблиц в формате, похожем на формат электронной таблицы. Эти запросы используются для анализа данных и создания диаграмм, основанных на суммарных значениях числовых величин из некоторого множества записей. Запросы на изменение используются для создания новых таблиц из результатов запроса и для внесения изменений в данные существующих таблиц. С их помощью можно добавлять или удалять записи из таблицы и изменять записи согласно выражениям, задаваемым в режиме конструктора запроса. Запросы с параметрами это такие запросы, свойства которых изменяются пользователем при каждом запуске. При запуске запроса с параметром появляется диалоговое окно, в котором нужно ввести условие отбора. Этот тип запроса не является обособленным, т. е. параметр можно добавить к запросу любого типа.[11] 3.1 Этапы проектирования баз данных Этапы проектирования и создания базы данных определяются следующей последовательностью: - построение информационно-логической модели данных предметной области; - определение логической структуры реляционной базы данных; - конструирование таблиц базы данных; - создание схемы данных; - ввод данных в таблицы (создание записей); - разработка необходимых форм, запросов, макросов, модулей, отчетов; - разработка пользовательского интерфейса. В процессе разработки модели данных необходимо выделить информационные объекты, соответствующие требованиям нормализации данных, и определить связи между ними. Эта модель позволяет создать реляционную базу данных без дублирования, в которой обеспечивается однократный ввод данных при первоначальной загрузке и корректировках, а также целостность данных при внесении изменений.[2] При разработке модели данных могут использоваться два подхода. В первом подходе сначала определяются основные задачи, для решения которых строится база, выявляются потребности задач в данных и соответственно определяются состав и структура информационных объектов. При втором подходе сразу устанавливаются типовые объекты предметной области. Наиболее рационально сочетание обоих подходов. Это связано с тем, что на начальном этапе, как правило, нет исчерпывающих сведений обо всех задачах. Использование такой технологии тем более оправдано, что гибкие средства создания реляционных баз данных позволяют на любом этапе разработки внести изменения в базу данных и модифицировать ее структуру без ущерба для введенных ранее данных.[2] Процесс выделения информационных объектов предметной области, отвечающих требованиям нормализации, может производиться на основе интуитивного или формального подхода. Теоретические основы формального подхода были разработаны и полно изложены в монографиях по организации баз данных известного американского ученого Дж. Мартина. При интуитивном подходе легко могут быть выявлены информационные объекты, соответствующие реальным объектам. Однако получаемая при этом информационно-логическая модель, как правило, требует дальнейших преобразований, в частности преобразования многозначных связей между объектами. При таком подходе возможны существенные ошибки, если отсутствует достаточный опыт. Последующая проверка выполнения требований нормализации обычно показывает необходимость уточнения информационных объектов. Рассмотрим формальные правила, которые могут быть использованы для выделения информационных объектов: - на основе описания предметной области выявить документы и их атрибуты, подлежащие хранению в базе данных; -определить функциональные зависимости между атрибутами; - выбрать все зависимые атрибуты и указать для каждого все его ключевые атрибуты, т. е. те, от которых он зависит; - сгруппировать атрибуты, одинаково зависимые от ключевых атрибутов. Полученные группы зависимых атрибутов вместе с их ключевыми атрибутами образуют информационные объекты[2]. При определении логической структуры реляционной базы данных па основе модели каждый информационный объем адекватно отображается реляционной таблицей, а связи между таблицами соответствуют связям между информационными объектами. В процессе создания сначала конструируются таблицы базы данных, соответствующие информационным объектам построенной модели данных. Далее может создаваться схема данных, в которой фиксируются существующие логические связи между таблицами. Эти связи соответствуют связям информационных объектов. В схеме данных могут быть заданы параметры поддержания целостности базы данных, если модель данных была разработана в соответствии с требованиями нормализации. Целостность данных означает, что в БД установлены и корректно поддерживаются взаимосвязи между записями разных таблиц при загрузке, добавлении и удалении записей в связанных таблицах, а также при изменении значений ключевых полей.[2] После формирования схемы данных осуществляется ввод непротиворечивых данных из документов предметной области. На основе созданной базы данных формируются необходимые запросы, формы, макросы, модули, отчеты, производящие требуемую обработку данных базы и их представление. С помощью встроенных средств и инструментов базы данных создается пользовательский интерфейс, позволяющий управлять процессами ввода, хранения, обработки, обновления и представления информации базы данных.[2] 4 ЭТАПЫ РАЗРАБОТКА ПРОГРАММНОГО ПРОДУКТА Данная программа создана для учета успеваемости студентов. Для работы с программой необходимо нужные группы или списки студентов копировать из имеющегося списка, в электронную таблицу «spisok.xls». Списки копируются однажды, после чего могут удаляться напрямую из базы данных «poseshaemost.mdb». После копирования списков или групп необходимо принять данные с помощью кнопки «Сервис - принять данные», в появившемся окне нажать кнопку «Принять данные». Для ввода специальности для выбранной группы нажать на кнопку «справочники- специальности», в появившемся окне ввести группу и код специальности, списки копируются однажды, после чего могут удаляться напрямую из базы данных «poseshaemost.mdb». Для добавления дисциплины для этой группы необходимо нажать на кнопку «справочники- дисциплины», в появившемся окне ввести дисциплины. Дисциплины копируются однажды, после чего могут удаляться напрямую из базы данных «poseshaemost.mdb». Для ввода оценок нужно нажать на кнопку «Данные – Разноска», где выбирается месяц и год обучения, а также дисциплина, специальность и группа. После ввода данных в эти строки следует «Добавить данные по дисциплине», на экране выведется группа, фамилия имя и отчество студентов, а также пустая графа оценок по выбранной дисциплине, которую необходимо заполнить. Корректировка данных производиться при помощи команды «Данные - корректировка», где корректируются месяц и год обучения, а также дисциплина, специальность и группа. В графе отчеты можно подвести итоги по успеванию и качеству знаний по БПЭК. Подвести итоги можно как по группе, так и по специальности и по колледжу в целом за определенный месяц и год обучения. После нажатия кнопки «Вычислить». Выведется успеваемость и качество. Также в графе подведение итогов можно посмотреть списки студентов неуспевающих (у которых есть хотя бы одна оценка «2»), а также успевающих на отлично (средний бал успеваемости которых «5»). После нажатия кнопки «Вывести», выведется список в электронной таблице Excel, неуспевающих студентов, либо успевающих на отлично. В графе «Отчет» за введенный месяц после нажатия кнопки «Пересчитать итоги» и «Отчет» выведется группа, месяц и год, а также количество студентов и процентное соотношение успеваемости общей и качество в электронной таблице Excel. unit Unit12; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, DB, ADODB; type TForm12 = class(TForm) MainMenu1: TMainMenu; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; N8: TMenuItem; N9: TMenuItem; ADOConnection1: TADOConnection; N10: TMenuItem; N11: TMenuItem; N12: TMenuItem; procedure N9Click(Sender: TObject); procedure N11Click(Sender: TObject); procedure N12Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure N2Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form12: TForm12; implementation uses Unit13, Unit15, Unit14, Unit16, Unit17, Unit18; {$R *.dfm} procedure TForm12.N9Click(Sender: TObject); begin Form13.Show; end; procedure TForm12.N11Click(Sender: TObject); begin Form15.Show; end; procedure TForm12.N12Click(Sender: TObject); begin Form14.Show; end; procedure TForm12.FormCreate(Sender: TObject); begin //Form16.Show; end; procedure TForm12.N2Click(Sender: TObject); begin Form16.Show; end; procedure TForm12.N3Click(Sender: TObject); begin Form17.show; end; procedure TForm12.N4Click(Sender: TObject); begin Form18.show; end; end. unit Unit13; interfa ceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Unit12, Forms, Dialogs, ExcelXP, OleServer, Grids, DBGrids, StdCtrls, DB, ADODB; type TForm13 = class(TForm) Label1: TLabel; DBGrid1: TDBGrid; ExcelWorkbook1: TExcelWorkbook; ExcelApplication1: TExcelApplication; ADOQuery1: TADOQuery; DataSource1: TDataSource; Button1: TButton; ADOQuery2: TADOQuery; ADOQuery1gruppa: TWideStringField; ADOQuery1fio: TWideStringField; ADOQuery1Datapr: TWideStringField; ADOQuery1Prim: TWideStringField; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form13: TForm13; implementation {$R *.dfm} procedure TForm13.Button1Click(Sender: TObject); var n: OleVariant; i:integer; //S:String; begin ADOQuery2.ExecSQL; AdoQuery1.Open; n:='d:\55\spisok.xls'; ExcelApplication1.Workbooks.Add(n,0); Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); i:=2; ADOQUERY1.Insert; ExcelApplication1.Visible[0]:=False; While i<2000 do begin; ADOQuery1.FieldByName('gruppa').AsString:=ExcelApplication1.Cells.Item[i,1].Value; ADOQuery1.FieldByName('Fio').AsString:=ExcelApplication1.Cells.Item[i,2].Value; ADOQuery1.FieldByName('Datapr').AsString:=ExcelApplication1.Cells.Item[i,3].Value; ADOQuery1.FieldByName('Prim').AsString:=ExcelApplication1.Cells.Item[i,4].Value; If ADOQuery1.FieldByName('gruppa').AsString='' then begin ADOQUERY1.Delete; i:=2001; end; ADOQUERY1.Insert; i:=i+1; end; ADOQuery1.Open; Showmessage('Прием данных выполнен'); end; end. unit Unit14; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,Unit12, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids; type TForm14 = class(TForm) DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; DataSource1: TDataSource; ADOQuery1: TADOQuery; ADOQuery1Disziplina: TWideStringField; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form14: TForm14; implementation {$R *.dfm} procedure TForm14.FormCreate(Sender: TObject); begin ADOQuery1.Active:=true; end; end. unit Unit15; interface uses Windows, Messages, SysUtils, Variants,Unit12,Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, ExtCtrls, DBCtrls, Grids, DBGrids; type TForm15 = class(TForm) ADOQuery1: TADOQuery; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; DataSource1: TDataSource; ADOQuery1Grupa: TWideStringField; ADOQuery1Spez: TWideStringField; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form15: TForm15; implementation {$R *.dfm} procedure TForm15.FormCreate(Sender: TObject); begin ADOQuery1.Active:=true; end; end. unit Unit16; interface uses Windows, Messages, SysUtils, Variants, Classes,Unit12, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids; type TForm16 = class(TForm) ADOQuery1: TADOQuery; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; DataSource1: TDataSource; ADOQuery1stud: TWideStringField; ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; ComboBox4: TComboBox; ComboBox5: TComboBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button1: TButton; Dobav: TADOQuery; ADOQuery1ozenka: TIntegerField; ADOQuery1koddis: TWideStringField; ADOQuery2: TADOQuery; ADOTable1: TADOTable; ADOTable2: TADOTable; ADOTable1DSDesigner: TAutoIncField; ADOTable1Grupa: TWideStringField; ADOTable1Disziplina: TWideStringField; procedure Button1Click(Sender: TObject); procedure ComboBox4Change(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form16: TForm16; implementation {$R *.dfm} procedure TForm16.Button1Click(Sender: TObject); begin Dobav.SQL.Clear; ADOQuery2.SQL.Clear; ADOQuery2.SQL.Text:='delete from ozenka where(ozenka.kodspez = "'+Combobox4.Text+'"and ozenka.koddis = "'+Combobox3.Text+'"and ozenka.mes = "'+Combobox1.Text+'"and ozenka.god = "'+Combobox2.Text+'" and ozenka.gruppa="'+Combobox5.Text+'")'; ADOQuery2.ExecSQL; Dobav.SQL.Add('Insert Into Ozenka ( gruppa,stud)'); Dobav.SQL.Add('Select gruppa,fio'); Dobav.SQL.Add(' From stud where (gruppa="'+Combobox5.text+'")'); //ShowMessage(Dobav.SQL.Text); //Dobav.SQL.Add('' Dobav.ExecSQL; Dobav.SQL.Clear; Dobav.SQL.Add('UPDATE ozenka SET ozenka.kodspez = "'+Combobox4.Text+'", ozenka.koddis = "'+Combobox3.Text+'", ozenka.mes = "'+Combobox1.Text+'", ozenka.god = "'+Combobox2.Text+'" WHERE (((ozenka.gruppa)="'+Combobox5.Text+'")and(ozenka.koddis is null ));'); Dobav.ExecSQL; ADOQUERY1.SQL.Clear; ADOQUERY1.SQL.Add('Select* from ozenka where(ozenka.kodspez = "'+Combobox4.Text+'"and ozenka.koddis = "'+Combobox3.Text+'"and ozenka.mes = "'+Combobox1.Text+'"and ozenka.god = "'+Combobox2.Text+'" and ozenka.gruppa="'+Combobox5.Text+'")'); //ShowMessage(ADOQUERY1.SQL.Text); ADOQUERY1.Active:=True; end; procedure TForm16.ComboBox4Change(Sender: TObject); begin ADOTable2.Open; ADOTable2.First; ComboBox5.Items.Clear; While not ADOTable2.Eof do begin if ADOTable2.Fieldbyname('Spez').AsString=ComboBox4.Text Then ComboBox5.Items.Add(ADOTable2.fieldbyname('grupa').AsString); ADOTable2.Next; end; ADOTable2.Close; ComboBox5.Sorted:=True; end; procedure TForm16.FormCreate(Sender: TObject); begin ADOTable1.Open; ADOTable1.First; ComboBox3.Items.Clear; While not ADOTable1.Eof do begin ComboBox3.Items.Add(ADOTable1.fieldbyname('disziplina').AsString); //ShowMessage(ADOTable1.fieldbyname('disziplina').AsString); ADOTable1.Next; end; ADOTable1.Close; ComboBox3.Sorted:=True; end; end. unit Unit17; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids; type TForm17 = class(TForm) DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox; ComboBox5: TComboBox; Button1: TButton; ADOQuery1: TADOQuery; ADOQuery1stud: TWideStringField; DataSource1: TDataSource; ADOQuery1ozenka: TIntegerField; ADOQuery1koddis: TWideStringField; ComboBox4: TComboBox; ADOTable1: TADOTable; ADOTable2: TADOTable; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ComboBox4Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form17: TForm17; implementation {$R *.dfm} procedure TForm17.Button1Click(Sender: TObject); begin ADOQUERY1.SQL.Clear; ADOQUERY1.SQL.Add('Select* from ozenka where(ozenka.kodspez = "'+Combobox4.Text+'"and ozenka.koddis = "'+Combobox3.Text+'"and ozenka.mes = "'+Combobox1.Text+'"and ozenka.god = "'+Combobox2.Text+'" and ozenka.gruppa="'+Combobox5.Text+'")'); //ShowMessage(ADOQUERY1.SQL.Text); ADOQUERY1.Active:=True; end; procedure TForm17.FormCreate(Sender: TObject); begin ADOTable1.Open; ADOTable1.First; ComboBox3.Items.Clear; While not ADOTable1.Eof do begin ComboBox3.Items.Add(ADOTable1.fieldbyname('disziplina').AsString); //ShowMessage(ADOTable1.fieldbyname('disziplina').AsString); ADOTable1.Next; end; ADOTable1.Close; ComboBox3.Sorted:=True; end; procedure TForm17.ComboBox4Change(Sender: TObject); begin ADOTable2.Open; ADOTable2.First; ComboBox5.Items.Clear; While not ADOTable2.Eof do begin if ADOTable2.Fieldbyname('Spez').AsString=ComboBox4.Text Then ComboBox5.Items.Add(ADOTable2.fieldbyname('grupa').AsString); ADOTable2.Next; end; ADOTable2.Close; ComboBox5.Sorted:=True; end; end. unit Unit18; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB, Buttons, ExtCtrls, ComCtrls, ExcelXP, OleServer, Grids, DBGrids; type TForm18 = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; TabSheet3: TTabSheet; RadioGroup1: TRadioGroup; BitBtn1: TBitBtn; Label1: TLabel; Label2: TLabel; ComboBox1: TComboBox; ComboBox2: TComboBox; Label4: TLabel; Label5: TLabel; ADOQuery1: TADOQuery; Edit1: TEdit; Edit2: TEdit; Label3: TLabel; Label6: TLabel; Label7: TLabel; ComboBox3: TComboBox; ComboBox6: TComboBox; Label8: TLabel; Label9: TLabel; RadioGroup3: TRadioGroup; ExcelWorkbook1: TExcelWorkbook; ExcelApplication1: TExcelApplication; BitBtn2: TBitBtn; ADOQuery2: TADOQuery; ComboBox7: TComboBox; ComboBox8: TComboBox; Label10: TLabel; Label11: TLabel; BitBtn3: TBitBtn; ADOQuery3: TADOQuery; ADOQuery4: TADOQuery; ADOQuery5: TADOQuery; ADOTable2: TADOTable; ComboBox4: TComboBox; ComboBox5: TComboBox; DataSource1: TDataSource; ADOQuery6: TADOQuery; ADOTable6: TADOTable; Button1: TButton; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure BitBtn3Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ComboBox4Change(Sender: TObject); // procedure ComboBox4Change(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form18: TForm18; implementation {$R *.dfm} procedure TForm18.BitBtn1Click(Sender: TObject); var k1:integer; k2:integer; k3:integer; k4,k:double; begin //по группе If radiogroup1.ItemIndex=0 then begin ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; k4:=Round((k3/k2*100)*100)/100; k:=Round((k1/k2*100)*100)/100; Edit1.Text:=FloatToStr(k4); Edit2.Text:=FloatToStr(k); end; //по специальности If radiogroup1.ItemIndex=1 then begin ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; k4:=Round((k3/k2*100)*100)/100; k:=Round((k1/k2*100)*100)/100; Edit1.Text:=FloatToStr(k4); Edit2.Text:=FloatToStr(k); end; //по колледжу If radiogroup1.ItemIndex=2 then begin ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; k4:=Round((k3/k2*100)*100)/100; k:=Round((k1/k2*100)*100)/100; Edit1.Text:=FloatToStr(k4); Edit2.Text:=FloatToStr(k); end; end; procedure TForm18.BitBtn2Click(Sender: TObject); var n: OleVariant; i:integer; //S:String; begin if radiogroup3.ItemIndex=0 then begin AdoQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT ozenka.ozenka, ozenka.stud, ozenka.gruppa, ozenka.koddis, ozenka.kodspez, ozenka.mes, ozenka.god FROM ozenka WHERE (((ozenka.ozenka)=2))'); ADOQuery1.SQL.Add('and mes="'+ combobox3.Text+'" and god="'+combobox6.Text+'"'); //Showmessage(adoquery1.SQL.Text); ADOQuery1.Open; ADOQuery1.First; n:='d:\55\spisok55.xls'; ExcelApplication1.Workbooks.Add(n,0); Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); i:=3; ExcelApplication1.Cells.Item[1,1].Value:='Cписок неуспевающих'; ExcelApplication1.Cells.Item[1,2].Value:=Combobox3.Text; ExcelApplication1.Cells.Item[1,3].Value:=Combobox6.Text; ExcelApplication1.Visible[0]:=true; While not ADOQuery1.Eof do begin; ExcelApplication1.Cells.Item[i,1].Value:=ADOQuery1.FieldByName('Stud').AsString; ExcelApplication1.Cells.Item[i,2].Value:=ADOQuery1.FieldByName('koddis').AsString; ExcelApplication1.Cells.Item[i,3].Value:=ADOQuery1.FieldByName('ozenka').AsString; ExcelApplication1.Cells.Item[i,4].Value:=ADOQuery1.FieldByName('gruppa').AsString; ADOQUERY1.Next; //ADOQUERY1.Post; i:=i+1; end; end; if radiogroup3.ItemIndex=1 then begin AdoQuery1.Close; ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT ozenka.stud, Avg(ozenka.ozenka) AS [Avg-ozenka], ozenka.mes,ozenka.gruppa, ozenka.god FROM ozenka'); ADOQuery1.SQL.Add('GROUP BY ozenka.stud, ozenka.mes,ozenka.gruppa, ozenka.god'); ADOQuery1.SQL.Add('HAVING (((Avg(ozenka.ozenka))=5));'); //ADOQuery1.SQL.Add('and mes="'+ combobox3.Text+'" and god="'+combobox6.Text+'"'); ADOQuery1.Open; ADOQuery1.First; n:='d:\55\spisok55.xls'; ExcelApplication1.Workbooks.Add(n,0); Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); i:=3; ExcelApplication1.Cells.Item[1,1].Value:='Cписок успевающих на отлично'; ExcelApplication1.Cells.Item[1,2].Value:=Combobox3.Text; ExcelApplication1.Cells.Item[1,3].Value:=Combobox6.Text; ExcelApplication1.Visible[0]:=true; While not ADOQuery1.Eof do begin; ExcelApplication1.Cells.Item[i,1].Value:=ADOQuery1.FieldByName('Stud').AsString; ExcelApplication1.Cells.Item[i,2].Value:='все'; ExcelApplication1.Cells.Item[i,3].Value:='5'; ExcelApplication1.Cells.Item[i,4].Value:=ADOQuery1.FieldByName('gruppa').AsString; ADOQUERY1.Next; //ADOQUERY1.Post; i:=i+1; end; end; end; procedure TForm18.BitBtn3Click(Sender: TObject); var n: OleVariant; i:integer; k1:integer; k2:integer; k3:integer; k4,k:double; begin ADOQuery4.SQL.Text:='drop table ots1'; ADOQuery4.ExecSQL; //ADoQuery.Active:=false; ADoQuery2.Active:=true; ADOQuery2.Edit; ADoQuery2.First; ADoQuery5.Active:=true; ADoQuery5.First; ADOQuery2.insert; ADoQuery3.SQL.Text:='Select* from spez'; ADOQuery3.Active:=true; While not ADoQuery3.Eof do begin ADOQuery2.FieldByName('Gruppa').AsString:=ADOQuery3.FieldByName('Grupa').AsString; ADOQuery2.FieldByName('Spez').AsString:=ADOQuery3.FieldByName('Spez').AsString; ADOQuery2.FieldByName('kolledg').AsString:='koledg'; Combobox1.Text:=Combobox7.Text; Combobox2.Text:=Combobox8.Text; Combobox5.Text:=ADOQuery2.FieldByName('Gruppa').AsString; Combobox4.Text:=ADOQuery2.FieldByName('Spez').AsString; //Combobox1.Text:=Combobox7.Text; //Combobox2.Text:=Combobox8.Text; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god, ozenka.gruppa '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.gruppa)="'+Combobox5.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; //ShowMessage(FloatToStr(k4)); // ShowMessage(FloatToStr(k)); IF K2>0 then begin k4:=Round((k3/k2*100)); k:=Round((k1/k2*100)); //Edit1.Text:=FloatToStr(k4); //Edit2.Text:=FloatToStr(k); ADOQuery2.FieldByName('usp').AsString:=FloatToStr(k4); ADOQuery2.FieldByName('kas').AsString:=FloatToStr(k); ADOQuery2.FieldByName('kol').AsString:=FloatToStr(k2); end; ADOQuery2.Insert; ADOQuery3.Next; end; //по специальностям ADoQuery2.Active:=true; ADOQuery2.Edit; ADoQuery2.First; ADoQuery3.SQL.Text:='Select spez from spez'; ADoQuery3.Active:=true; ADoQuery3.First; ADOQuery2.insert; While not ADoQuery3.Eof do begin //ADOQuery2.FieldByName('Gruppa').AsString:=ADOQuery3.FieldByName('Grupa').AsString; ADOQuery2.FieldByName('Spez').AsString:=ADOQuery3.FieldByName('Spez').AsString; ADOQuery2.FieldByName('kolledg').AsString:='koledg'; Combobox1.Text:=Combobox7.Text; Combobox2.Text:=Combobox8.Text; //Combobox5.Text:=ADOQuery2.FieldByName('Gruppa').AsString; Combobox4.Text:=ADOQuery2.FieldByName('Spez').AsString; //Combobox1.Text:=Combobox7.Text; //Combobox2.Text:=Combobox8.Text; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez'); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god, ozenka.kodspez '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'") AND ((ozenka.kodspez)="'+Combobox4.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; //ShowMessage(FloatToStr(k4)); //ShowMessage(FloatToStr(k)); IF K2>0 then begin k4:=Round((k3/k2*100)); k:=Round((k1/k2*100)); //Edit1.Text:=FloatToStr(k4); //Edit2.Text:=FloatToStr(k); ADOQuery2.FieldByName('usp').AsString:=FloatToStr(k4); ADOQuery2.FieldByName('kas').AsString:=FloatToStr(k); ADOQuery2.FieldByName('kol').AsString:=FloatToStr(k2); end; ADOQuery2.Insert; ADOQuery3.Next; end; //по колледжу ADOQuery2.insert; //ADOQuery2.FieldByName('Gruppa').AsString:=ADOQuery3.FieldByName('Grupa').AsString; //ADOQuery2.FieldByName('Spez').AsString:=ADOQuery3.FieldByName('Spez').AsString; ADOQuery2.FieldByName('kolledg').AsString:='koledg'; Combobox1.Text:=Combobox7.Text; Combobox2.Text:=Combobox8.Text; //Combobox5.Text:=ADOQuery2.FieldByName('Gruppa').AsString; Combobox4.Text:=ADOQuery2.FieldByName('Spez').AsString; //Combobox1.Text:=Combobox7.Text; //Combobox2.Text:=Combobox8.Text; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count1] FROM ozenka where (((ozenka.ozenka)>3))GROUP BY ozenka.mes, ozenka.god'); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k1:=AdoQuery1.fieldbyname('Count1').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count2] FROM ozenka where (((ozenka.ozenka)>0))GROUP BY ozenka.mes, ozenka.god '); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k2:=AdoQuery1.fieldbyname('Count2').AsInteger; ADOQuery1.SQL.Clear; AdoQuery1.SQL.Add('SELECT Count(ozenka.stud) AS [Count3] FROM ozenka where (((ozenka.ozenka)>2))GROUP BY ozenka.mes, ozenka.god'); AdoQuery1.SQL.Add('HAVING (((ozenka.mes)="'+Combobox1.Text+'") AND ((ozenka.god)="'+Combobox2.Text+'"))'); AdoQuery1.Active:=True; k3:=AdoQuery1.fieldbyname('Count3').AsInteger; //ShowMessage(FloatToStr(k4)); //ShowMessage(FloatToStr(k)); IF K2>0 then begin k4:=Round((k3/k2*100)); k:=Round((k1/k2*100)); //Edit1.Text:=FloatToStr(k4); //Edit2.Text:=FloatToStr(k); ADOQuery2.FieldByName('usp').AsString:=FloatToStr(k4); ADOQuery2.FieldByName('kas').AsString:=FloatToStr(k); ADOQuery2.FieldByName('kol').AsString:=FloatToStr(k2); ADOQuery2.Post; end; //S:String; begin //if radiogroup3.ItemIndex=0 then begin AdoQuery6.Close; ADOQuery6.SQL.Clear; ADOQuery6.SQL.Add('SELECT ots.kolledg, ots.spez, ots.gruppa, ots.kol, ots.usp, ots.kas into ots1 FROM ots GROUP BY ots.kolledg, ots.spez, ots.gruppa, ots.kol, ots.usp, ots.kas'); //ORDER BY ots.kolledg DESC , ots.spez DESC , ots.gruppa DESCSELECT ozenka.ozenka, ozenka.stud, ozenka.gruppa, ozenka.koddis, ozenka.kodspez, ozenka.mes, ozenka.god FROM ozenka WHERE (((ozenka.ozenka)=2))'); ADOQuery6.SQL.Add('ORDER BY ots.kolledg DESC , ots.spez DESC , ots.gruppa DESC'); //Showmessage(adoquery1.SQL.Text); ADOQuery6.ExecSQL; {ADOTable6.TableName:='ots1'; ADOTable6.Active:=true; ADOTable6.Active:=false; ADOTable6.Active:=true; //ADOTable6.First; n:='d:\55\usp.xls'; ExcelApplication1.Workbooks.Add(n,0); Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); i:=10; ExcelApplication1.Cells.Item[1,2].Value:=Combobox7.Text; ExcelApplication1.Cells.Item[1,3].Value:=Combobox8.Text; ADOTable6.First; // If ADOTable6.FieldByName('gruppa').AsString<>'' then ExcelApplication1.Cells.Item[i,2].Value:=ADOTable6.FieldByName('gruppa').AsString else // If (ADOQuery6.FieldByName('Spez').AsString<>'') then ExcelApplication1.Cells.Item[i,2].Value:='итого по специальности '+ADOTable6.FieldByName('Spez').AsString; If (ADOTable6.FieldByName('Spez').AsString='') then ExcelApplication1.Cells.Item[i,2].Value:='итого по колледжу ';//+ADOQuery1.FieldByName('Kolledg').AsString; ExcelApplication1.Cells.Item[i,3].Value:=ADOTable6.FieldByName('kol').AsString; ExcelApplication1.Cells.Item[i,4].Value:=ADOTable6.FieldByName('usp').AsString; ExcelApplication1.Cells.Item[i,5].Value:=ADOTable6.FieldByName('kas').AsString; //While not ADOTable6.Eof do begin; ShowMessage('fdgiiii'); k4:= ADOTable6.FieldByName('usp').AsFloat; k:=ADOTable6.FieldByName('kas').AsFloat; ShowMessage(FloatToStr(k4)); If ADOTable6.FieldByName('gruppa').AsString<>'' then ExcelApplication1.Cells.Item[i,2].Value:=ADOTable6.FieldByName('gruppa').AsString else // If (ADOQuery6.FieldByName('Spez').AsString<>'') then ExcelApplication1.Cells.Item[i,2].Value:='итого по специальности '+ADOTable6.FieldByName('Spez').AsString; If (ADOTable6.FieldByName('Spez').AsString='') then ExcelApplication1.Cells.Item[i,2].Value:='итого по колледжу ';//+ADOQuery1.FieldByName('Kolledg').AsString; ExcelApplication1.Cells.Item[i,3].Value:=ADOTable6.FieldByName('kol').AsString; ExcelApplication1.Cells.Item[i,4].Value:=k4; ExcelApplication1.Cells.Item[i,5].Value:=k; ADOTable6.Next; //ADOQUERY1.Post; i:=i+1; end; end; //ExcelApplication1.Visible[0]:=true; } ADOQuery4.SQL.Clear; ADOQuery4.SQL.Text:='delete * from ots'; ADOQuery4.ExecSQL; ADOQuery4.SQL.Text:='drop table ots1'; //ADOQuery4.ExecSQL; //end; end; ShowMessage('Перерасчет данных успешно выполнен можно делать отчет!'); end; procedure TForm18.Button1Click(Sender: TObject); var n:Olevariant; i:Integer; k1:integer; k2:integer; k3:integer; k4,k:double; begin ADOTable6.TableName:='ots1'; ADOTable6.Active:=true; ADOTable6.Active:=false; ADOTable6.Active:=true; //ADOTable6.First; n:='d:\55\usp.xls'; ExcelApplication1.Workbooks.Add(n,0); Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); i:=10; ExcelApplication1.Cells.Item[1,2].Value:=Combobox7.Text; ExcelApplication1.Cells.Item[1,3].Value:=Combobox8.Text; ADOTable6.First; // If ADOTable6.FieldByName('gruppa').AsString<>'' then ExcelApplication1.Cells.Item[i,2].Value:=ADOTable6.FieldByName('gruppa').AsString else // If (ADOQuery6.FieldByName('Spez').AsString<>'') then ExcelApplication1.Cells.Item[i,2].Value:='итого по специальности '+ADOTable6.FieldByName('Spez').AsString; If (ADOTable6.FieldByName('Spez').AsString='') then ExcelApplication1.Cells.Item[i,2].Value:='итого по колледжу ';//+ADOQuery1.FieldByName('Kolledg').AsString; ExcelApplication1.Cells.Item[i,3].Value:=ADOTable6.FieldByName('kol').AsString; ExcelApplication1.Cells.Item[i,6].Value:=ADOTable6.FieldByName('usp').AsString; ExcelApplication1.Cells.Item[i,7].Value:=ADOTable6.FieldByName('kas').AsString; //While not ADOTable6.Eof do begin; ShowMessage(ADOTable6.FieldByName('kas').AsString); k4:= ADOTable6.FieldByName('usp').AsFloat; k:=ADOTable6.FieldByName('kas').AsFloat; //ShowMessage(FloatToStr(k4)); If ADOTable6.FieldByName('gruppa').AsString<>'' then ExcelApplication1.Cells.Item[i,2].Value:=ADOTable6.FieldByName('gruppa').AsString else // If (ADOQuery6.FieldByName('Spez').AsString<>'') then ExcelApplication1.Cells.Item[i,2].Value:='итого по специальности '+ADOTable6.FieldByName('Spez').AsString; If (ADOTable6.FieldByName('Spez').AsString='') then ExcelApplication1.Cells.Item[i,2].Value:='итого по колледжу ';//+ADOQuery1.FieldByName('Kolledg').AsString; ExcelApplication1.Cells.Item[i,3].Value:=ADOTable6.FieldByName('kol').AsString; ExcelApplication1.Cells.Item[i,4].Value:=ADOTable6.FieldByName('usp').AsString; ExcelApplication1.Cells.Item[i,5].Value:=ADOTable6.FieldByName('kas').AsString; ADOTable6.Next; //ADOQUERY1.Post; i:=i+1; end; ExcelApplication1.Visible[0]:=true; end; procedure TForm18.ComboBox4Change(Sender: TObject); begin ADOTable2.Open; ADOTable2.First; ComboBox5.Items.Clear; While not ADOTable2.Eof do begin if ADOTable2.Fieldbyname('Spez').AsString=ComboBox4.Text Then ComboBox5.Items.Add(ADOTable2.fieldbyname('grupa').AsString); ADOTable2.Next; end; ADOTable2.Close; ComboBox5.Sorted:=True; end; end. 5 ОПИСАНИЕ РЕЗУЛЬТАТОВ ИССЛЕДОВАНИЙ В результате разработки программного продукта, была создана программа по учету успеваемости студентов. В данной программе есть возможность вывода итогов в электронную таблицу Excel. Позволяет формировать списки студентов, учащихся на отлично и на неудовлетворительно. В результате формирования списка выводится отчет со списком студентов, учащихся на отлично или на удовлетворительно. Также можно сформировать табель успеваемости за месяц. Также ведется подсчет успеваемости и качества по группе, специальности и колледжа в целом за любой введенный месяц и год обучения. 6 ПРОГРАММНАЯ И ЭКСПЛУАТАЦИОННАЯ ДОКУМЕНТАЦИЯ Ведомость эксплуатационных документов ГОСТ 19.507-79. К эксплуатационных документации относится следующий комплекс документов [ГОСТ 19. 507 – 79 Ведомость эксплутационных документов.]: 1) описание программы (ГОСТ 19.402-78), в котором содержатся сведения о логической структуре и функционировании программного продукта; 2) техническое задание (ГОСТ 19.201-78), определяющее требования, предъявляемые к программному продукту, необходимые стадии и сроки разработки, виды испытаний; 3) руководство оператора (ГОСТ 19.505-79) - сведения, необходимые для обеспечения процедуры общения оператора с ЭВМ в процессе выполнения (работы) программного продукта. Описание программы ГОСТ 19.402-78. 1) Общие сведения. Программный продукт «Учет успеваемости» поможет в контроле за успеваемостью студентов. Использование данного программного продукта позволяет: Организовать ввод оценки за каждый месяц по каждой специальности, группе, студенту, предмету Предусмотреть возможность корректировки данных Организовать возможность подведения итогов успеваемости по каждой группе, специальности и в целом по колледжу (процентное содержание успеваемости и качественной успеваемости) Предусмотреть возможность сравнения итоговых данных с итогами предыдущего месяца Обеспечить формирование списков неуспевающих и успевающих на оценку «отлично» Обеспечить формирование отчета В данном программном продукте использовался язык программирования Delphi, базы данных были созданы с использованы MS ACCESS. 2) Описание логической структуры. В процессе работы над программным продуктом была разработана его структура, которая состоит из нескольких форм. 3) Используемые технические средства: - процессор –Pentium 3; - видеокарта –64 Мб; - оперативная память – не менее 256 Мб; - ОС – Windows XT; - наличие Microsoft Office ACCESS; - CD-ROM. 4) Загрузка. Для запуска программы необходимо разместить папку «55» на диске D, затем запустить EXE – файл «Project1». Техническое задание ГОСТ 19.201 – 78 1) Наименование. Разработка программного обеспечения по автоматизации учебного процесса в колледже «УЧЕТ УСПЕВАЕМОСТИ». 2) Основанием для создания является. Задание на дипломное проектирование.3) Назначение и цель. Программный продукт предназначен для использования а колледже для учета успеваемости. В данный программный продукт должно включаться: - Рабочую программу «УЧЕТ УСПЕВАЕМОСТИ»; - База данных MS ACCESS «poseshaemost.mdb»; 4) Безопасность. Данный программный продукт позволяет вносить изменения. Так как предлагается первая версия программы, содержащая открытый код, которая требует изменений и доработки по мере устранения существующих ошибок и добавления новых функций. Поэтому вопрос о защите содержащейся в пособии информации пока не должен решаться. Руководство оператора ГОСТ 19. 505 – 79 Для запуска программы необходимо открыть папку на диске D, за тем запустить EXE – файл «Project1». После этого следует ввести необходимые данные. Чтобы завершить программу закрыть все ее окна. При возникновении ошибок, сбоев, неполадок в работе с программным продуктом, необходимо обратиться к специалисту в области информационных технологий. Самим пользователям при обнаружении неполадок ничего изменять не рекомендуется, так как программисту будет сложнее обнаружить причину возникновения ошибки. ЗАКЛЮЧЕНИЕ Задачей дипломного проекта являлась разработка программного продукта по учету успеваемости студентов БПЭК. Для реализации этой задачи были выполнены следующие этапы: Спроектирована логическая модель базы данных; Спроектирована физическая модель базы данных; Организован ввод оценки за каждый месяц по каждой специальности, группе, студенту, предмету; Предусмотрена возможность корректировки данных; Организована возможность подведения итогов успеваемости по каждой группе, специальности и в целом по колледжу (процентное содержание успеваемости и качественной успеваемости) Предусмотрена возможность сравнения итоговых данных с итогами предыдущего месяца Обеспечено формирование списков неуспевающих и успевающих на оценку «отлично» Обеспечено формирование отчета В результате была создана программа «Учет успеваемости», которая может быть использована в подобных учебных заведениях. В ходе выполнения дипломной работы был создан программный продукт, дающий возможность вести учет успеваемости. Программа проста и понятна для любого пользователя, для ее использования не нужно специального обучения. При этом она выполняет в основном все функции, необходимые для нормальной работы. Для создания базы данных использовался Microsoft Office Access. Для написания программы использовался язык программирования Delphi, имеющий широкие возможности для работы с базами данных. Соединение с базой данных произведено при помощи технологии ADO. Обработка данных производилась при помощи операторов языка SQL, что значительно ускоряет работу программы. Программный продукт пригоден для использования в учебных целях БПЭК. CПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 1 Гофман В. Э., Хомоненко А. Д. Delphi. Быстрый старт. — СПб.: БХВ-Петербург, 2003. — 288 с. 2 Гофман В. Э., Хомоненко А. Д. Работа с базами данных в Delphi. — СПб.: БХВ-Петербург, 2001. — 656 с. 3 Боровский А. Н. Программирование в Delphi 2005. — СПб.: БХВ-Петербург, 2005. - 448 с. 4 Дарахвелидзе П. Г., Марков Е. П. Delphi 2005 для Win32. - СПб.: БХВ-Петербург, 2005. - 1136 с. 5 Сорокин А. В. Delphi. Разработка баз данных. — СПб.: Питер, 2005. — 477 с. 6 Фленов М. Е. Библия Delphi. — СПб.: БХВ-Петербург, 2004. — 880 с. 7 Фленов М. Е. Программирование в Delphi глазами хакера. — СПб.: БХВ-Петербург, 2003. - 368 с. 8 Фленов М. Е. Delphi в шутку и всерьез: что умеют хакеры (+CD). — СПб.: Питер. 2006. — 271 с. 9 Архангельский Л.Я. Delphi 2006. Справочное пособие: Язык Delphi, классы, функции Win32 и .NET. — М.: ООО «Бином-Пресс», 2006 г. 1 152 с. 10 Фаронов В. В. Delphi 2005. Разработка приложений для баз данных и Интернета. — СПб.: Питер, 2006. — 603 с. 11 Карпова Т. С. Базы данных: модели, разработка, реализация. — СПб.: Питер, 2001. — 304 с. 12 Иллюстрированный самоучитель по Delphi для начинающих. Электронное пособие. 13 Иллюстрированный самоучитель по Delphi для профессионалов. Электронное пособие. 14 Delphi World 6.0. Электронный справочник. 15 ГОСТ 19.507-79 Ведомость эксплуатационных документов. 16 ГОСТ 19.402-78 Описание программы. 17 ГОСТ 19.201 – 78 Техническое задание. 18 ГОСТ 19. 505 – 79 Руководство оператора. |
|