Автоматизированное рабочее место менеджера книжного магазина

Разработка программного обеспечения, которое позволит автоматизировать работу менеджера с клиентами и поставщиками. Определение требований, тестирование, описание программы. Руководство системного программиста. Создание СУБД в DELPHI для менеджера.

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

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

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

В целях пожарной профилактики в помещении машинного зала предусматриваются пожарные извещатели, автоматические системы тушения пожара (спринклерные или дренчерные), расположенные на потолке, а также первичные средства пожаротушения: огнетушители ручные ОХП - 10, ОХВП - 10, ОУ - 5. Оборудование должно располагаться так, чтобы оно не мешало эвакуации людей из здания при пожаре.
12. СОЗДАНИЕ СУБД В DELPHI ДЛЯ МЕНЕДЖЕРА

12.1. Определение состава СУБД

СУБД состоит из совокупности экранных и отчетных форм и процедур обработки данных вводимых в БД и выводимых из БД. При программировании СБД в среде Windows СУБД называют приложением.

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

Пусть порядок работы пользователя задается следующей схемой.

Схема работы пользователя.

Интерфейс пользователя происходит через главное меню. Поэтому система должна имеет главное меню.

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

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

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

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

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

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

Таким образом, из описанной выше схемы работы системы “пользователь - система” видно, что для работы системы необходимо следующие формы:

Форма для меню;

Форма для ввода данных в базу;

Форма для просмотра БД;

Форма для отчета №1;

Форма для отчета №2;

Форма для отчета №3.

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

12.2 Проект и план создания компонентов СУБД

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

Следует отметить, что основой для проектирования СУБД является форма. Являясь основой и носителем всех остальных компонентов, форма служит фундаментом для процессов обработки данных. Теоретической основой такой схемы является объектно-ориентированная технология проектирования и программирования.

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

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

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

В Delphi информационная связь форм СУБД с БД осуществляется через определенные невизуальные компоненты. Поэтому для обеспечения связи экранных форм с БД в проекте используется специальный невизуальный компонент (контейнер) TDataModule, который также должен создаваться отдельно.

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

· Форма для меню;

· Форма для ввода данных в базу;

· Форма для просмотра БД;

· Форма для отчета №1.

· Форма для отчета №2.

· Форма для отчета №3.

· Компонента TDataModule

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

Компонента TDataModule

Форма для меню;

Форма для просмотра БД;

Форма для ввода данных в базу;

Форма для отчета №1.

Форма для отчета №2.

Форма для отчета №3.

Формы, необходимые для создания СУБД можно задать двумя способами:

1. Если заранее известно их количество, то на экране монитора и соответственно в хранилище (repository) проекта IDE Delphi заранее можно вывести нужное количество визуальных и невизуальных форм, т.е. в проект можно добавить столько форм, сколько требуется. С помощью команды File|New Form добавляются визуальные формы, а командой File|New Data Module - невизуальная. Отметим, что для нашей системы требуется всего шесть визуальных форм и одна компонента TDataModule.

2. Если заранее количество нужных форм для проекта не известно, то на экране монитора и соответственно в хранилище (repository) проекта IDE Delphi добавляется та форма, которая нужна для проекта на текущем этапе создания СУБД. Установление форм на экране осуществляется через команды File|New Form или File|New Data Module. Другими словами каждая форма в проект добавляется по мере необходимости.

В данном случае добавление новых форм в хранилище проекта происходить с помощью команды добавления (File|Add to Project).

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

Сначала будем считать, что на экране выведено столько форм, сколько требуется для создания всех форм СУБД. Если форм не хватает, то доводим их до необходимого количества. Это делается путем повторение действия (File|New Form) столько раз, сколько требуется количеств форм и один контейнер командой File|New Data Module.

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

Данная последовательность оформления и создания форм упрощает процесс создания СУБД.

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

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

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

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

Из вышеприведенного определения видно, что СУБД также как БД состоит из множества компонентов. Все эти компоненты СУБД требуют формирования и программирования и их файлы также как и файлы БД следует хранить в определенном месте. Для этой цели можно использовать тот же каталог, что и для БД, т.е. C:\PRIMER, либо создадим в каталоге C:\PRIMER подкаталог АРР и в нем храним разработанные приложения.

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

12.3 Создание СУБД

12.3.1 Способы организаций доступа экранных форм и отчетных форм к базе данных

В данном пункте описывается вопросы организация доступа экранных форм (ЭФ) и отчетных форм (ОФ) к базе данных путем создания контейнера TDataModule

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

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

В случае, когда СУБД имеет несколько экранных форм, то их доступ следует осуществить двумя способами:

1. Доступ каждой формы (и ее компонентов) к БД можно осуществить автономно, независимо от остальных форм.

2. Второй способ предполагает не повторять для каждой формы организацию доступа к БД, а для всех экранных и отчетных форм организовать единый доступ через специальный компонент типа TDataModule. Компонент типа TDataModule представляет собой контейнер, в который можно помещать все невизуальные компоненты TTable, TQuery, DataSource, которые необходимы для доступа к БД и т.д. Тогда все те формы, для которых потребуется доступ к БД, доступ получат через компонент TdataModule. Для этого для каждой экранной формы необходимо установить связь с данным компонентом, т.е. с TdataModule.

Таким образом, в случае множества ЭФ и ОФ для работы СУБД удобно создать компонент типа TDataModule, который является контейнером для невизуальных компонентов, обеспечивающих доступ к базами данных.

Создание экземпляра TDataModule в среде Delphi осуществляется через пункт меню File|New Data Module. После чего, в палитре компонентов Delphi на странице Data Access выберем мышью невизуальный компонент ТТаblе (рис. 12.1), щелкнем на нем мышью и затем щелкнем мышью в контейнере. После этого, изображение компоненты останется в контейнере.

Рис. 12.1. Палитра компонентов Delphi

Невизуальным компонент TTable (как и другие компоненты, например, TQuery, TDataSource) называется потому, что он применяется для хранения и доступа к данным, а не для их визуализации - для этой цели применяются визуальные компоненты (TDBGrid, TEdit и другие).

После того, как мы разместили компонент TTable, установим его свойства. Для этой цели воспользуемся инспектором объектов (Object Inspector), который обычно помещается слева от формы. Если он не видим, его можно вызвать, нажав кнопку F11. Инспектор объектов позволяет устанавливать свойства того компонента, который выделен при помощи мыши. Выделим мышью компонент TTable.

Установим значение свойства DatabaseName в PRIMER (это является псевдоним БД)при помощи выпадающего списка или введя его вручную. Установим значение свойства TableName (имя таблицы БД) в Materialy.DB при помощи выпадающего списка. После этого установим значение свойства Active в True. После этого произойдет реальное связывание компонента TTable (он по умолчанию имеет имя Table1) с реально существующей таблицей Materialy.DB.

Компонент TTable и компонент TQuery служат для хранения наборов данных. Понятие набора данных несколько шире, чем понятие таблицы БД, поскольку набор данных может содержать:

· подмножество записей или полей таблицы БД (компоненты TTable, TQuery);

· записи, сформированные из нескольких таблиц БД (компонент TQuery).

Расположим в контейнере DataModule компонент TDataSource. Он служит в качестве связующего звена между невизуальными компонентами (в данном случае Table1) и визуальными компонентами, которые мы добавим в форму №3 позднее. Поэтому компоненты TDataSource часто называют источниками данных. Установим свойство DataSet (имя набора данных) компонента TDataSource в значение Table1 путем выбора из выпадающего списка.

TDataModule нужно сохранить под каким-либо именем (по умолчанию Unit5.pas). Имя модуля Unit, в котором описан TDataModule, добавляется в текст модулей unit всех иных форм приложения, которые будут использовать БД и TDataSource, расположенные в этом TDataModule. Это производится в главном меню среды Delphi, в элементе меню File|Use Unit.

В дальнейшем визуальные компоненты, работающие с данными набора данных (НД), должны в своем свойстве DataSource содержать имя соответствующего компонента TDataSource из TDataModule. При этом имя является составным: сначала идет имя компонента TDataModule и затем через точку - имя компонента TDataSource, например, в нашем случае - DataModule5.DataSource1.

12.3.2. Создание простых экранных форм

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

Создание экранной формы для меню СУБД

Перейдем в форму №1 (элемент меню View|Forms), выбрав из диалогового окна Form1 нажмем на кнопку Ok. Расположим в форме компонент MainMenu из страницы Standard палитры компонентов. Затем вызовем средства разработки меню (это можно сделать двумя способами):

· Двойное нажатие на компонент MainMenu внутри формы №1

· Переходим в окно Object Inspector при выделенном компоненте на форме. Щелкнем на свойстве Items и нажмем кнопку .

Находясь в Конструкторе меню Form1.MainMenu1 (это имя, присвоенное Delphi по умолчанию созданному нами перед этим компоненту TMainMenu), дадим названия пунктам меню (свойства Caption в Object Inspector) “Файл/Ввод/Просмотр/Отчет/Выход”. Для перехода на следующий уровень нажимаем на <Enter>. Для визуального разделения пунктов меню на отдельные группы после Отчет используем несколько символов минус (-), назначать имя разделителю необязательно. Для пункта меню “Ввод” создадим подменю “Название материала/Поступление материала”. Для этого выделим его и щелкнем правой кнопкой мыши, в появившемся окне выберем пункт Create Submenu.

Теперь, когда меню создано, можно связать с каждым пунктом меню код, который будет выполняться при выборе данного пункта пользователем. Для создания процедуры обработки этого события - OnClick, находясь в Конструкторе меню, дважды щелкнем мышью на пункте меню. В появившемся окне Редактора кода процедуре обработки события OnClick напишем код, который будет выполняться при выборе этого пункта меню. Такого же результата можно достичь при помощи двойного щелчка мышью на имени процедуры обработки, которое находится на странице Events окна Object Inspector.

Например, в пункт Просмотр введем следующий код:

Form1.Visible := False;

Form3.Visible := True;

элемент меню Поступление материала:

Form1.Visible := False;

Form2.Visible := True;

элемент меню Выход: Сlose;

Выберем элемент меню File|Save Project As и сохраним проект. Сначала запрашивается имя формы проекта (у нас пять форм, с именами Form1 Form4, DataModule5). Сохраним формы под именами 'Unit*.pas'. Затем запрашивается имя проекта. Сохраним проект под именем 'appl.dpr'.

Добавим имена модулей Unit2 и Unit3 в текст модулей unit формы №1.

После этого выполним приложение. (Чтобы выполнить приложение не выходя из среды Delphi, достаточно нажать кнопку F9. Чтобы создать приложение и запустить его вне среды Delphi, следует нажать комбинацию кнопок Ctrl+F9 и затем запустить созданный файл с расширением .ехе и именем, совпадающим с именем проекта. В нашем случае следует запускать файл 'appl.exe'.

Остановить работающее приложение можно командой Run|Program Reset.

Создание экранной формы для представления содержания БД

1. Представление содержания одной таблицы БД на экранной форме.

Сначала построим простую экранную форму, которая имеет доступ только к одной таблице БД.

Перейдем в форму №3 путем выбора элемента (или команды) меню View|Forms, нажмем на кнопку Ok выбрав из диалогового окна Form3. Расположим в форме компонент TDBGrid, взяв его из палитры компонентов (страница Data Controls). Установим свойство DataSource компонента TDBGrid в значение DataSource1 (это имя созданного нами выше компонента TDataSource, присвоенное Delphi по умолчанию) предварительно добавив имя модуля Unit5, в котором описан TDataModule, в текст модулей unit формы №3. Компонент TDBGrid служит для отображения записей набора данных в табличной форме.

Добавим в форму компонент кнопки TButton (страница Standard палитры компонентов), дадим имя этому компоненту (свойство Name), используя инспектор объектов, CancelButton. Изменим заголовок кнопки (свойство Caption) на Отмена.

Вид разрабатываемой формы представлен на рис. 12.2.

Рис. 12.2. Вид формы на этапе разработки

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

Сlose;

Form1.Visible := True;

Запустим приложение на выполнение из Delphi, выбрав команду Run из меню Run (или F9). Из меню Файл/Ввод приложения выберем команду Просмотр.

Вид работающего приложения показан на рис.12.3.

Рис. 12.3. Вид формы №3 во время выполнения

Добавлять записи в набор данных (и, следовательно, в таблицу Materialy.DB) можно прямо из компонента TDBGrid.

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

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

Для удаления записи следует установить на нее указатель текущей записи и нажать комбинацию кнопок Ctrl+Del.

2. Представление содержания двух таблиц БД

Теперь работу усложним. Представим содержание двух таблиц БД. Причем в двух вариантах:

а) без установления связи между таблицами на экранной форме;

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

2.1. Отображение данных таблиц БД на экранной форме без установления связи между ними

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

Добавим в контейнер DataModule5 компонент ТТаblе (с именем Таblе2) для работы с таблицей Prihod базы данных PRIMER (значения свойств такие же, как у компонента Table1, но свойство TableName ссылается на имя таблицы Prihod.DB). Добавим в форму компонент TDataSource (имя по умолчанию DataSource2). Установим свойство DataSet этого компонента в значение Таblе2. Разместим в форме №3 компонент TDBGrid (имя по умолчанию DBGrid2) и установим его свойство DataSowce в значение DataSource2. Установим свойство Таbl2.Аvtive в True. После этого произойдет реальное связывание компонентов TTable с реально существующими таблицами Materialy.DB и Prihod.DB.

Рис. 12.4. Форма с родительским и дочерними наборами данных во время разработки

Чтобы при просмотре нельзя было изменять данные о материалах (таблица Materialy.DB), установим свойства ReadOnly компонента DBGrid1 в положение True.

Запустим приложение на выполнение. Добавим несколько записей в таблицу Prihod.DB из компонента TDBGrid2. Обратите внимание, значение поля N_Prih формируется автоматически.

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

2.2. Отображение данных таблиц БД на экранной форме с учетом связи между ними

Нам известно, что таблицы базы данных Materialy.DB и Prihod.DB находятся в отношении "один-ко-многим". Поскольку мы определили ссылочную целостность между этими таблицами, можно сделать так, чтобы при установке указателя на запись в наборе данных Table1 (ассоциированном с Materialy.DB) в наборе данных Таblе2 (ассоциированном с Prihod.DB) показывались только записи прихода текущего материала в Table1. Это реализуется через механизм связи наборов данных Master-Detail.

В инспекторе объектов для компонента Таblе2 установим значение свойства Master Source в DataSource1. Переместимся на значение свойства Master Fields и нажмем кнопку . В появившемся окне Field Link Designer установим параметры связи. В поле Available Indexes выберем в качестве текущего индекса по полю 'Material'. В списке Detail Fields выберем поле Material, в списке Master Fields выберем поле Material и нажмем кнопку Add. В поле Joined Fields будет сформировано выражение 'Material Material'). Нажмем кнопку Ok.

Рис. 12.6. Окно установки значения свойства MasterFields

Как можно заметить, в компоненте Таblе2 текущий индекс (свойство FieldIndexNames) заменен на индекс, построенный по полю 'Material'.

Теперь в наборе данных Table2 показываются только записи по приходу материала, текущего в наборе данных Table1 (рис. 12.7).

Рис. 12.7. Связь Master-Detail - в дочернем наборе данных показываются только подчиненные записи

Создание экранной формы для ввода данных в базе данных

Для дальнейшей работы подготовим контейнер DataModule5. Из палитры компонентов Delphi на странице Data Access добавим невизуальный компонента TTаblе, установим значения свойств DatabaseName (псевдоним БД) в PRIMER при помощи выпадающего списка или введя его вручную. В Tаblе3 установим значение свойства TableName (имя таблицы БД) в PRIHOD.DB. После этого установим значение свойства Active в True. Расположим компонента TDataSource, установим свойство DataSet (имя набора данных) компонента DataSource3 в значение Table3. Добавление невизуальных компонентов для связи с таблицей PRIHOD.DB в контейнер обязательно, т.к. аналогичные компоненты в контейнере DataModule взаимно связаны и в дальнейшем может произойти циклическое обращение.

Добавим в форму №2 компонент TDBGrid из палитры компонентов Data Controls. Установим свойство DataSource компонента TDBGrid в значение DataSource3, предварительно добавив имя модуля Unit5 в текст модулей unit формы №2.

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

Добавим в форму №2 два компонента TDBEdit (палитра компонентов Data Controls). Определим поле, к которому можно иметь доступ через компонент DBEdit1. Для этого установим значение его свойств - DataSource в DataSource3 и DataField в DatPrih. Определим поле, к которому можно иметь доступ через компонент DBEdit2. Для этого установим значение его свойств - DataSource в DataSource3 и DataField в Kolvo.

Для доступа к полю Material нам нужен более сложный компонент, который позволял бы вводить в поле Material таблицы Prihod.DB значения полей Material из таблицы Materialy.DB, и никакие другие значения. Для этой цели разместим компонент TDBLookupComboBox с именем по умолчанию DBLookupComboBox1. Установим свойства этого компонента:

DataSource - в значение DataModule5.DataSource3;

DataFiled - в значение Material;

List Source - в значение DataModule5.DataSource1

ListField - в значение Material;

KeyField - в значение Material.

Добавление кнопок управления данными базы данных на экранной форме

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

Для этого в приложение добавим пять компонентов кнопок TButton (страница Standard палитры компонентов). Изменим имена этих компонентов (свойство Name), используя инспектор объектов, соответственно на InsertButton, EditButton, DeleteButton, PostButton, CancelButton. Изменим заголовки этих кнопок (свойство Caption), используя инспектор объектов, соответственно на "Добавить", "Изменить", "Удалить", "Запомнить", "Закрыть" (рис. 12.8).

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

Выберем при помощи мыши кнопку InsertButton и два раза щелкнем на ней. После этого мы перейдем в редактор кода и определим для кнопки InsertButton обработчик события нажатия кнопки, OnClick:

procedure TForm2.InsertButtonClick(Sender: TObject);

begin

DataModule5.Table3.Insert;

end;

Метод Insert переводит набор данных Table1 в состояние добавления записи dsInsert. Ввод значений полей осуществляется в компонентах DBEdit1, DBLookupComboBox1, DBEdit2. Для этого необходимо, чтобы набор данных находился в режиме просмотра dsBrowse.

Определим обработчик нажатия кнопки EditButton:

procedure TForm2.EditButtonClick(Sender: TObject);

begin

DataModule5.Table3.Edit;

end;

Метод Edit переводит набор данных Table1 в состояние добавления записи dsEdit. Редактирование значений полей осуществляется в компонентах DBEdit1,

DBLookupComboBox1, DBEdit2. Для этого необходимо, чтобы набор данных находился в режиме просмотра dsBrowse.

Определим обработчик нажатия кнопки DeleteButton:

procedure TForm2.DeleteButtonClick(Sender: TObject);

begin

IF MessageDlg('Подтвердите удаление записи',

mtConfirmation,[mbYes, mbNo],0) = mrYes THEN

DataModule5.Table3.Delete;

end;

Если набор данных Table1 находится в режиме просмотра записей dsBrowse, вызывается окно диалога (при выполнении функции MessageDlg); если пользователь нажимает кнопку Yes, происходит удаление текущей записи в наборе данных Table1.

Определим обработчик нажатия кнопки PostButton:

procedure TForm2.PostButtonClick(Sender: TObject);

begin

DataModule5.Table3.Post;

end;

Если набор данных находится в режиме добавления новой записи или редактирования, происходит выполнение метода набора данных Post, который запоминает текущее состояние записи в таблице БД. После запоминания набор данных переводится в режим просмотра dsBrowse.

Определим обработчик нажатия кнопки CancelButton:

procedure TForm2.CancelButtonClick(Sender: TObject);

begin

close;

Form1.Visible:=true;

end;

Если набор данных находится в режиме добавления новой записи или редактирования, происходит выполнение метода набора данных Cancel, который отменяет запоминание записи в таблице БД и переводит набор данных в режим просмотра и переходит на форму меню.

Для того чтобы набор данных нельзя было переводить в состояние добавления и изменения данных, а также удалять записи непосредственно из компонента DBGrid1, установим свойство DBGrid1.ReadOnly в значение True. После этого запустим приложение на выполнение. При добавлении новой записи или при корректировке существующей в поля можно заносить значения, используя ввод в компоненты DBEdit1, DBEdit2 и путем выбора из списка значений в компоненте DBLookupComboBox1 (рис. 12.10). То же происходит при изменении записи.

Рис. 12.9. Добавление новой записи

При удалении записи выдается окно диалога (рис. 4.11).

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

12.3.3 Создание сложных экранных форм

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

Варианты модификации TDBGrid на экранной форме

Как можно заметить, значение поля N_Prih необходимо для обеспечения уникальности в таблице Prihod и не несет никакой иной нагрузки. Поэтому данное поле лучше не показывать в составе столбцов DBGrid2. Для этой цели сформируем список полей таблицы Prihod. В Delphi имеются две возможности указать, какие из полей таблицы БД следует использовать в приложении для набора данных.

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

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

Выберем в контейнере DataModule5 при помощи мыши компонент Таblе2 и нажмем правую кнопку мыши. В появившемся на экране всплывающем меню выберем элемент Fields Editor. В появившемся списке редактора полей нажмем правую кнопку мыши и во всплывающем меню выберем элемент меню Add Fields. Будет показан список всех полей таблицы БД Prihod.DB. Отметим (при помощи мыши и кнопки Shift) все поля, кроме N_Prih и нажмем кнопку Add. Теперь список редактора полей будет включать все отмеченные поля.

а) б) в)

Рис. 12.11. Работа с редактором полей:

а) пустой список редактора полей

б) добавление полей

в) заполненный список редактора полей.

Как можно заметить, в составе столбцов в компоненте DBGrid2 на форме №3 теперь присутствуют только те поля, которые добавлены для набора данных Table2 в редакторе полей (рис. 12.13).

Рис. 12.12. Состав полей DBGrid2 определяется списком редактора полей

Определение для набора данных списка полей в редакторе полей (нажатие правой кнопки мыши по компоненту Таblе2) приводит к тому, что для каждого добавленного таким образом поля в приложении Delphi автоматически создает компонент TField (поле набора данных). Каждый такой компонент по умолчанию именуется уникальным именем - в качестве первой составляющей имени поля берется имя набора данных (Таblе2), а в качестве второй составляющей - имя поля в таблице БД. Так, компонент TField соответствующий полю Material, будет поименован как Table2Material. Если в редакторе полей щелкнуть по имени соответствующего поля, в инспекторе объектов можно установить или изменить свойства поля, а также определить обработчики события для конкретного поля.

Изменим параметры компонента DBGrid2 так, чтобы названия его столбцов содержали русские наименования. Для этого нажмем правой кнопкой мыши на компоненте DBGrid2, и во всплывающем меню выделим элемент Columns Editor. На экране появится окно редактора столбцов компонента . Для того чтобы изменить характеристики столбцов в TDBGrid, нужно перейти от неявно определяемых столбцов к определяемым. Для этого нужно щелкнуть по кнопке Add All Fields, в результате чего будут добавлены столбцы, каждый из которых соответствует полю, определенному в редакторе полей компонента Table2. Что бы изменить заголовок каждого столбца, следует выбрать при помощи мыши имя столбца в редакторе столбцов, и в инспекторе объектов раскрыть список свойства Title (для чего следует щелкнуть мышью по крестику рядом с именем свойства). В элементе Caption этого списка содержится заголовок столбца; изменим соответствующим образом заголовки и затем выйдем из редактора столбцов DBGrid2.

Рис. 12.13.

а) пустой список столбцов DBGrid2

б) заполненный список столбцов

То же проделаем для набора данных Table1 (рис. 12.14).

Рис. 12.14. Установка заголовков столбцов DBGrid1 и 2

Аналогичные изменения проделаем и в форме №2.

Изменим также порядок сортировки записей в наборе данных Таblе3 в форме №2. Для этого в инспекторе объектов компонента Table3 (в DataModule5) установим свойство IndexFieldNames в значение "DatPrih;Material" путем выбора из выпадающего списка, содержащего названия индексных полей, определенных для каждого существующего индекса таблицы Prihod.DB. После этого войдем еще раз в редактор колонок DBGrid и при помощи мыши "перетащим" столбец DatPrih так, чтобы он предшествовал столбцу Material. Откомпилируем приложение и запустим его на выполнение. Как видно из рис. 4.16, набор данных Table2, ассоциированный с таблицей БД Prihod.DB, в приложении отсортирован по дате прихода, а внутри каждой даты прихода - по наименованию материала.

Рис. 12.15. Материалы отсортированы по дате поступления

Создание вычисляемых полей на экранной форме

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

В экранной форме № 3 создадим новое вычисляемое поле в DBGrid2, значение которого вычисляется по значениям других полей, для этого выполним следующие действия:

Перейдем в DataModule5, при помощи мыши сделаем текущим необходимый набор данных (в нашем примере Table2), нажав на правую кнопку мыши, выберем в меню пункт Field Editor (редактор полей) и снова нажав на правую кнопку мыши и выберем в меню пункт New Field.

Затем в диалоговом окне (рис.124.17) необходимо указать имя поля (в поле Name введем “vychisl”), его тип (в поле Type выберем “String”) и длину (в поле Size введем “3”). Помечаем поле как вычисляемое (Calculated). Нажимаем Ok и закрываем редактор полей.

Рис. 12.16. Окно определения свойств нового поля

Таким образом, для нового поля “vychisl” создан компонент TField, доступ к которому можно осуществлять в редакторе полей.

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

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

Например, нам необходимо знать наличие на складе товаров более 100 единиц. Для этого будем заносить в созданное вычисляемое поле Table2Vychisl набора данных Table2, ассоциированному с таблицей БД “Приход”, значение “Да”, если в поле Table2Kolvo этой записи содержится значение больше 100. В противном случае в поле Table2Vychisl будем заносить пустое значение.

В окне Редактора кода процедуры обработки события OnCalcFields напишем следующий код:

procedure TDataModule5.Table2CalcFields(DataSet: TDataSet);

begin

IF Table2Kolvo.Value > 100 Then

Table2Vychisl.AsString := 'Да'

ELSE

Table2Vychisl.AsString := ' ';

end;

Если свойство набора данных AutoCalcFields установлено в True, событие OnCalcFields наступает и при модификации значений невычисляемых полей в режимах dsInsert и dsEdit данного набора данных или набора данных, реляционно с ним связанного (когда установлены ограничения целостности в самой таблице БД, а не тогда, когда они подразумеваются).

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

Рис. 12.17. Вид запущенного приложения

Использования SQL-запроса для отображения данных из разных таблиц на экранной форме

Создадим форму для отображения данных из нескольких таблиц. Для этого в контейнере TDataModule5 расположим компонент TQuery (страница Data Access палитра компонентов). По умолчанию его имя Query1. Установим его свойство DatabaseName в PRIMER. Расположим компонент TDataSource (имя DataSource4). Установим его свойство DataSet в значение Query1.

Расположим в форме №4 компонент TDBGrid. Установим его свойство DataSource в значение DataSource4.

В инспекторе объектов для компонента Query1 найдем свойство SQL и нажмем кнопку . Затем в появившемся окне редактора наберем текст SQL-запроса

SELECT P.DatPrih, P.Material, P.Kolvo,Т.Zena,

(P.Kolvo * T.Zena) As Stoim

FROM Materialy T, Prihod P

WHERE T.Material = P.Material

ORDER BY P.DatPrih, P.Material

и нажмем кнопку Ok.

После этого установим свойство Query1.Active в значение True. Набор данных Query1 содержит сведения о приходе материала на склад. В составе записи этого набора присутствуют поля DatPrih (дата прихода), Material (название материала), Kolvo (количество прихода), Zena (цена за ед. измерения данного материала), Stoim (стоимость прихода материала). Как видно из текста запроса в свойстве SQL, набор данных "собирается" из двух таблиц БД PRIMER, Materialy.DB и Prihod.DB. При этом соединяются записи из этих таблиц БД, имеющие одинаковое значение поля Material.

Рис. 12.18. Соединение данных из разных таблиц в одном наборе данных

В форме №1 в пункт Отчет введем следующий код:

Form1.Visible := False;

Form4.Visible := True;

Заметим, что в набор данных Query1 нельзя добавить новые записи и нельзя изменить или удалить существующие записи в наборе данных. Это происходит потому, что тип набора данных, "собираемого" более чем из одной таблицы БД, является доступным только для чтения.

12.3.4 Создание отчетных форм

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

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

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

12.3.5 Запуск и проверка работы системы

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

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

Запуск системы осуществляется по команде: Rиn|Rиn. Запуск системы можно осуществить и с помощью горячей клавиши F9.

В случае зависания системы или при отсутствии выхода из системы прерывание работы осуществляется по команде Rиn|Program Reset.

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

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

Если порядок отображения экранных форм не соответствует желаемому варианту, то его можно менять в поле Main Form с помощью элемента меню Proect|Options закладка Forms.

12.4 Вычисляемые поля

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

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

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

· имитация соединения двух таблиц с возможностью редактировать результат соединения.

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

Эта программа связывает три таблицы в отношении один ко многим. В частности, ORDERS и ITEMS связаны по полю OrderNo, а ITEMS и PARTS связаны по полю PartNo. (В таблице ORDERS хранятся все заказы; в таблице ITEMS - предметы, указанные в заказах; PARTS - справочник предметов). В программе можно перемещаться по таблице ORDERS и видеть связанный с текущим заказом список включенных в него предметов. Программа CALC_SUM достаточно сложная, но хорошо иллюстрирует мощность вычисляемых полей.

Последовательность создания проекта CALC_SUM:

1. Создайте новый проект (File|New Project) и удалите из него форму (в Менеджере Проекта View|Project Manager)

2. Выберите эксперта форм БД из меню Help.

3. На первом экране, выберите "Create a master/detail form" и "Create a form using TQuery Objects".

4. Нажмите кнопку Next и выберите таблицу ORDERS.DB из псевдонима БД DBDEMOS.

5. Нажмите Next и выберите поля OrderNo, CustNo, SaleDate, ShipDate и ItemsTotal из таблицы ORDERS.DB.

6. Нажмите Next и выберите "Horizontal" из расстановки компонентов dbEdit на форме.

7. Нажмите Next и выберите таблицу ITEMS.DB.

8. В двух следующих экранах выберите все поля из таблицы и поместите их в grid.

9. Нажмите Next и выберите поле OrderNo из Master и Detail ListBoxes, и Нажмите кнопку Add.

10. Нажмите Next и сгенерируйте форму.

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

Выделите первый из двух объектов TQuery и установят свойство Active в True. Для Query2 в свойстве SQL напишите текст запроса:

select * from Items I, Parts P

where (I.OrderNo =:OrderNo) and

(I.PartNo=P.PartNo)

Активизируйте объект Query2 (Active установите в True) и вызовите редактор DataSet (Fields Editor) для него. Вызовите диалог Add Fields и добавьте поля OrderNo, PartNo, Qty и ListPrice.

Нажмите Define и ведите слово Total в поле FieldName. Установите Field Type в CurrencyField. Проверьте что Calculated CheckBox отмечен. Нажмите Ok и закройте редактор DataSet.

Простой процесс описанный в предыдущем абзаце, показывает как создать вычисляемое поле. Если посмотреть в DBGrid, то можно видеть, что там теперь есть еще одно пустое поле. Для того, чтобы поместить значение в это поле, откройте в Инспекторе Объектов страницу событий для объекта Query2 и сделайте двойной щелчок на OnCalcFields. Заполните созданный метод так:

procedure TForm2.Query2CalcFields(DataSet: TDataSet);

begin

Query2NewTotalInvoice.Value := 23.0;

end;

После запуска программы поле Total будет содержит строку $23.00.

Это показывает, насколько просто создать вычисляемое поле, которое показывает правильно сформатированные данные. На самом деле это поле должно показывать нечто другое - произведение полей Qty (количество) и ListPrice (цена). Для этого вышеприведенный код для события OnCalcFields нужно изменить следующим образом:

procedure TForm1.Query2CalcFields(DataSet: TDataset);

begin

Query2Total.Value:=Query2Qty.Value*Query2ListPrice.Value;

end;

Если теперь запустить программу, то поле Total будет содержать требуемое значение.

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

Теперь давайте добавим вычисляемое поле для первой таблицы (Query1, ORDERS), которое будет отображать сумму значений из поля Total второй таблицы (Query2) для данного заказа. Вызовите редактор DataSet для объекта Query1 и добавьте вычисляемое поле NewItemsTotal типа CurrencyField. В обработчике события OnCalcFields для Query1 нужно подсчитать сумму и присвоить ее полю NewItemsTotal:

procedure TForm1.Query1CalcFields(DataSet: TDataset);

var R : Double;

begin

R:=0;

with Query2 do begin

DisableControls;

Close;

Open;

repeat

R:=R+Query2Total.Value;

Next;

until EOF;

First;

EnableControls;

end;

Query1NewItemsTotal.Value:=R;

end;

В данном примере сумма подсчитывается с помощью простого перебора записей, это не самый оптимальный вариант - можно, например, для подсчета суммы использовать дополнительный объект типа TQuery. Метод DisableControls вызывается для того, чтобы отменить перерисовку DBGrid при сканировании таблицы. Запрос Query2 переоткрывается для уверенности в том, что его текущий набор записей соответствует текущему заказу.

Поместите на форму еще один элемент DBEdit и привяжите его к Query1, полю NewItemsTotal. Запустите программу, ее примерный вид показан на рис.12.19.

Рис. 12.19. Программа CALC_SUM

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

Управление TDBGrid во время выполнения

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

Вы можете использовать свойство Options объекта DBGrid, чтобы изменить ее представление. Свойство Options может принимать следующие возможные значения:

DgEditing Установлен по-умолчанию в true, позволяет пользователю редактировать grid. Вы можете также установить свойство ReadOnly grid в True или False.

DgTitles Будут ли видны названия колонок.

DgIndicator Будут ли видны небольшие иконки слева.

DgColumnResize Может ли пользователь менять размер колонки.

dgColLines Показывать ли линии между колонками.

dgRowLines Показывать ли линии между строками.

dgTabs Может ли пользователь использовать tab и shift-tab для переключения между колонками.

Как объявлено в этой структуре:

TDBGridOption = (dgEditing, gdAlwaysShowEditor, dgTitles,

dgIndicator, dgColumnResize, dgColLines,

dgRowLines, dgTabs);

Например, Вы можете установить опции в Runtime написав такой код:

DBGrid1.Options := [dgTitles, dgIndicator];

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

DBGrid1.Options := DBGrid1.Options + [dgTitles];

Пусть есть переменная ShowTitles типа Boolean, тогда следующий код позволяют включать и выключать параметр одной кнопкой:

procedure TForm1.Button3Click(Sender: TObject);

begin

if ShowTitles then

DBGrid1.Options := DBGrid1.Options + [dgTitles]

else

DBGrid1.Options := DBGrid1.Options - [dgTitles];

ShowTitles := not ShowTitles;

end;

Если Вы хотите скрыть поле в run-time, то можете установить свойство visible в false:

Query1.FieldByName(`CustNo').Visible := False;

Query1CustNo.Visible := False;

Обе строки кода выполняют идентичную задачу. Чтобы показать поле снова, установите видимый в true:

Query1.FieldByName(`CustNo').Visible := True;

Query1CustNo.Visible := True;

Если Вы хотите изменить положение колонки в Runtime, можете просто изменить индекс, (первое поле в записи имеет индекс нуль):

Query1.FieldByName(`CustNo').Index := 1;

Query1CustNo.Index := 2;

По-умолчанию, поле CustNo в таблице Customer является первым. Код в первой строке перемещает это поле во вторую позицию, а следующая строка перемещает его в третью позицию. Помните, что нумерация полей начинается с нуля, так присвоение свойству Index 1 делает поле вторым в записи. Первое поле имеет Index 0.

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

Если Вы хотите изменить ширину колонки в Runtime, только измените свойство DisplayWidth соответствующего TField.

Query1.FieldByName(`CustNo').DisplayWidth := 12;

Query1CustNo.DisplayWidth := 12;

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

Программа DBGR_RT показывает как работать с DBGrid в Runtime. Программа достаточно проста, кроме двух небольших частей, которые описаны ниже. Первая часть показывает, как создать check box в Runtime, а вторая показывает, как изменить порядок пунктов в listbox в Runtime.

При создании формы (событие OnCreate) ListBox заполняется именами полей, далее создается массив объектов CheckBox, соответствующий полям в таблице. Сперва все CheckBox'ы выбраны и все поля в таблице видимы. Программа узнает через TTable1 имена полей и присваивает их свойству Caption соответствующего CheckBox. Кроме того, обработчику события OnClick всех CheckBox'ов присваивается процедура ChBClick, которая и включает/выключает поля в DBGrid.

procedure TForm1.FormCreate(Sender: TObject);

var i : Word;

R : Array[0..49] of TCheckBox;

begin

{Fill ListBox}

ListBox1.Clear;

for i:=0 to Table1.FieldCount-1 do

ListBox1.Items.Add(Table1.Fields[i].FieldName);

{Make CheckBoxes}

for i:=0 to Table1.FieldCount-1 do begin

R[I] := TCheckBox.Create(Self);

R[I].Parent := ScrollBox1;

R[I].Caption := Table1.Fields[i].FieldName;

R[I].Left := 10;

R[I].Top := I * CheckBox1.Height + 5;

R[I].Width := 200;

R[I].Checked := True;

R[I].OnClick := ChBClick;

end;

end;

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

R[I] := TCheckBox.Create(Self);

R[I].Parent := ScrollBox1;

Первая строки создает CheckBox с заданным Owner (Владельцем). Вторая строки назначает Parent (Родителя) для CheckBox. Чтобы понять различия между Родителем и Владельцем, посмотрите соответствующие свойства в online-help.

Программа содержит ListBox, который показывает текущий порядок полей в DataSet. Для изменения порядка полей в DataSet (а, следовательно, в DBGrid) используются две кнопки. При нажатии на одну из кнопок, выбранное в ListBox'е поле перемещается на одну позицию вверх или вниз. Синхронно с этим меняется и порядок полей в DBGrid. Код, показанный ниже, изменяет Index поля для Table1, изменяя, таким образом, позицию поля в DBGrid. Эти изменения касаются только визуального представления DataSet. Физически данные на диске не изменяются.


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

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