Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по Delphi.doc
Скачиваний:
144
Добавлен:
10.04.2015
Размер:
262.66 Кб
Скачать

Лабораторная работа № 3 – программа "Магазин cd-дисков"

Образец: task3.exe + содержимое папкиDB.

Программа должна реализовывать следующие функции:

  1. Хранение информации о клиентах, товарах и заказах в базе данных.

  2. Отображение информации о клиентах, товарах и заказах в табличном виде.

  3. Редактирование любой информации о клиентах и товарах.

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

  5. Редактирование информации о любом заказе с проверкой введенных значений.

  6. Удаление заказа (с подтверждением).

  7. Фильтрация записей заказов по критериям: все записи, текущий клиент, текущий товар.

  8. Неточный поиск записей в таблице заказов по имени клиента или названию товара.

  9. Расчет и отображение в таблице заказов «Суммы заказа» на основании текущих значений полей «Цена» и «Количество».

  10. Отображение итоговых значений по столбцам «Количество» и «Сумма заказа» по таблице заказов для текущего отобранного набора записей.

Требования к лабораторной работе № 3:

  1. База данных должна состоять из 3-х связанных между собой таблиц: «Товары», «Клиенты» и «Заказы».

  2. Обязательными полями для таблицы «Товары» являются «Наименование товара» и «Цена за штуку», для таблицы «Клиенты» – «Имя клиента» и «Адрес».

  3. Обязательными полями для таблицы «Заказы» являются «Дата заказа», «Наименование товара», «Имя клиента», «Количество». Поле «Cумма» является вычисляемым («Количество» * «Цена за штуку») и в базе данных не хранится.

  4. Редактирование таблицы «Заказы» должно осуществляться только при помощи кнопок «Добавить», «Изменить», «Удалить», но не напрямую (через компонент DBGrid). Напротив, редактирование таблиц «Товары» и «Клиенты» через компонентыDBGrid должно быть разрешено.

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

  6. По умолчанию записи в таблице «Заказы» должны быть упорядочены по полю «Дата заказа».

  7. В диалоговом окне «Добавить/Изменить запись»:

  1. кнопка «Сохранить» должна быть недоступна (отключена), пока не будут заполнены все поля;

  2. при изменении полей «Название товара» или «Количество» должен сразу же происходить пересчет полей «Цена за единицу» и «Стоимость товара»;

  3. выбор значения полей «Имя клиента» и «Наименование товара» должен осуществляться из выпадающих списков;

  4. ввод значений в поле «Количество» должен быть ограничен в разумных пределах.

  1. При нажатии на кнопку «Удалить» должно появляться окошко для подтверждения операции удаления.

  2. При осуществлении фильтрации или редактировании информации в таблицах «Заказы» или «Товары» должен происходить автоматический пересчет итогов.

  3. Поиск в таблице «Заказы» должен осуществляться даже по частичному ключу (например, по первой букве названия).

Методические указания к лабораторной работе № 3:

  1. Создание базы данных. Чтобы создать в Delphi таблицы БД, необходимо выполнить следующие шаги:

  • Создайте папку, в которой будут храниться таблицы вашей базы данных (например, это может быть подпапка DB в папке, где будет размещаться ваша программа).

  • Запустите приложение Database Desktop. Это можно сделать как из самойDelphi (через менюTools), так и через главное менюWindows (Пуск| Программы| Borland Delphi | Database Desktop).

  • Выберите из меню команду File | Working Directory и сделайте так, чтобы рабочая директория указывала на папку с вашей будущей базой данных.

  • Выберите из меню команду File | New | Table, в появившемся окошке выберите форматParadox 7 (таблицы этого формата лучше всего подходят для небольшой настольной базы данных), после чего вы попадете в окошко определения структуры вашей таблицы.

  • Заполните структуру вашей таблицы, обращая внимание на следующее:

  • Имя поля (Field Name) должно состоять из букв, цифр и символов подчеркивания «_», пробелы и русские буквы не допускаются.

  • Список допустимых типов полей (Type) можно вызвать, нажав клавишу «пробел» или правую кнопку мыши. Наиболее часто используемыми типами полей являются: строковый(Alpha), числовой(Number, Short, Long Integer), дата(Date), автоинкрементный(+). Чтобы получить подробное описание каждого типа данных, вызовите Cправку (кнопкаHelp или клавишаF1).

  • Для некоторых типов данных необходимо указать размер (Size). Например, строковые поля могут быть размером от 1 до 255 символов.

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

  • Вы можете пометить любое поле как «обязательное к заполнению», поставив галочкуRequired Field.

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

  • Чтобы в дальнейшем произвести модификацию структуры вашей таблицы, откройте эту таблицу (выполнив командуFile | Open | Table) и нажмите кнопкуRestucture на панели инструментов (или выберите из меню командуTable | Restructure).

Вот пример структуры таблицы «Заказы» (Orders.db) из 4 работы:

  • Аналогичным образом разработайте структуру остальных таблиц вашей базы данных и сохраните их под собственными именами.

  1. Установка связей (ссылочной целостности) между таблицами. Связи между таблицами необходимы для поддержания согласованности одних и тех же данных в разных таблицах. Например, в нашей базе данных поле «Имя клиента» из таблицы «Заказы» должно принимать только те значения, которые имеет поле «Имя клиента» в таблице «Клиенты». Чтобы обеспечить это, необходимо выполнить следующие шаги (в нашем примере таблица «Заказы» называется подчиненной (Child), а таблица «Клиенты» – главной или родительской(Parent)):

  • Закройте главную таблицу («Клиенты»), если она открыта, и откройте подчиненную таблицу («Заказы»).

  • Нажмите кнопку Restucture на панели инструментов.

  • Выберите из выпадающего списка Table Properties в правой части окна значениеReferencial Integrity (ссылочная целостность) и нажмите кнопкуDefine (определить).

Откроется диалоговое окно, в левой части которого указан список всех полей текущей таблицы («Заказы»), а в правой – все другие таблицы в рабочем каталоге. (Если правое окошко пустое или содержит таблицы не вашей базы данных, то перед продолжением необходимо вернуться к пункту определения текущего рабочего каталога – Working Directory).

  • В левом списке выберите поле «Имя клиента» (ClientName) и нажмите стрелку вправо. Указанное поле появится в спискеChild Fields.

  • Вправом списке выберите таблицу «Клиенты» и нажмите стрелку влево. Ключевое поле из указанной таблицы появится в спискеParent’s Key.

  • Нажмите кнопку OK и в появившемся диалоговом окошке введите произвольное название для созданной связи, напримерClientIntegrity.

Важно. Для того, чтобы между полями двух таблиц можно было установить связь, типы этих полей должны совпадать. Если для поля указывается размер (например, для строк), то эти размеры также должны совпадать. Исключение делается только для автоинкрементых полей, которые могут связываться с типом Long Integer.

  • Аналогичным образом создайте связь между таблицами «Заказы» и «Товары» по полю «Наименование товара».

  1. Занесение начальных данных в таблицы:

  • Выберите из меню команду File | Open | Table, чтобы открыть нужную таблицу.

  • Нажмите кнопку Edit Data на панели инструментов(или клавишуF9), чтобы перейти в режим ввода/редактирования данных. Повторное нажатие клавиши F9 возврает нас в режим просмотра.

  1. Использование таблиц базы данных в Delphi. Чтобы подключить к вашему приложению таблицу базы данных, необходимо выполнить следующие шаги:

  • Разместите на вашей форме 2 невизуальных компонента: Table (таблица) с закладкиBDEиDataSource (источник данных) с закладкиData Access. КомпонентTable служит для связи (через драйверBDE) с таблицей базы данных, а компонентDataSource служит для отображения данных из таблицы в различных визуальных элементах управления(Data Controls). Для каждой таблицы базы данных вы должны использовать два этих компонента. Поскольку большая база данных может состоять из множества таблиц, то,чтобы не загромождать форму компонентами, можно разместить их вотдельном модуле данных. Чтобы создать модуль данных, используйте командуFile | New | Data Module.

  • У компонента DataSource найдите в Инспекторе объектов свойствоDataSet и выберите извыпадающего списка название компонента Table, с которым он связан.

  • У компонента Table найдите свойствоTableName и напишите имя вашей таблицы базы данных вместе в путем (например, если таблица находится в подпапкеDB и называетсяOrders, то введите «DB\Orders.db»).

Существует и другой способ подключения базы данных – через псевдоним(alias). В этом случае псевдоним базы данных должен быть создан заранее (при помощи программDatabase Desktop илиBDE Administrator), а затем указан в свойствеDatabaseName у компонента Table. Недостатком этого способа является то, что при переносе программы с компьютера на компьютер необходимо сначала настроить на новом компьютере псевдоним.

  • Совет. Чтобы в дальнейшем в приложении было удобно ссылаться на компоненты Table иDataSource, рекомендуется их переименовать, чтобы их имена совпадали с названиями таблиц. Например, если у вас имеется таблица заказов (Orders), то для компонентаTable установим свойство Name = ‘Orders’, адля компонентаDataSource установим свойство Name = ‘DS_Orders’.

  1. Работа с элементами управления для доступа к данным (Data Controls). Элементы управления для доступа к данным позволяют просматривать и редактировать данные, относящиеся к текущей записи в таблице. Следующая таблица дает краткую сводку основных компонентов, расположенных на закладке Data Controls:

DBGrid

отображает информацию из источника данных в табличной форме

DBNavigator

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

DBText

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

DBEdit

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

DBMemo

показывает содержимое Memo-поля илиBLOB-объекта в многострочном редакторе

DBImage

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

DBCheckBox

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

DBRadioGroup

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

DBListbox

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

DBComboBox

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

DBLookupListbox

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

DBLookupComboBox

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

Все элементы управления соединяются с таблицей базы данных через посредника – источник данных (Data Source). Чтобы связать какой-то элемент управления с таблицей базы данных, выполните следующие шаги:

  • Разместите на форме или в модуле данных компоненты Table и DataSourceи установите их свойства, как указано в предыдущем пункте.

  • Поместите нужный элемент управления с закладки Data Controls на форму.

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

  • Найдите у элемента управления свойство DataField и выберите из выпадающего спискаимя поля, которое должно отображаться в этом элементе управления. (Этот шаг не нужен для компонентовDBGrid, DBNavigator, у которых нет свойстваDataField.)

  • Установите у компонента Table свойство Active в значениеTrue, чтобы открыть таблицу и показать ее данные в элементе управления.

  1. Работа с компонентом DBGrid (табличное представление базы данных):

  • Для редактирования текста заголовков, ширины и порядка следования стобцов у компонента DBGrid используйте встроенный редактор столбцов(Columns Editor, вызывается двойным щелчком мыши по компоненту).

  • Чтобы запретить изменение содержимого таблицы через компонент DBGrid, установите его свойство ReadOnly в значение True.

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

  1. Получение и изменение данных в таблице в процессе выполнения программы. Для чтения и записи данных в поля таблицы можно использовать процедуру <таблица>.FieldByName(‘<имя поля>’).As<тип>. Например, операторKolvo := Orders.FieldByName('Count’).AsInteger прочитает значение поля“Count” для текущей записи в таблице «Orders», а операторOrders.FieldByName(‘Client’).AsString := ‘John Lennon’ изменит имя клиента в текущем заказе.

  2. Работа с вычисляемыми (calculated) полями. Вычисляемые поля не сохраняются в физической базе данных на жестком диске, их значения вычисляются по мере необходимости на основании значений других полей базы данных. Преимущество использования вычисляемых полей состоит в том, что нет необходимости хранить в базе данных дублирующую информацию. Примеры вычисляемых полей: «Стоимость партии товара» (= «Цена за единицу товара» * «Размер партии»), «ФИО» (= «Фамилия» +‘‘+ «Имя» +‘ ‘+ «Отчество»).

  • Чтобы создать в таблице вычисляемое поле:

  • двойным щелчком мыши по компоненту Table откройте редактор полей(Fields Editor);

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

  • еще раз щелкните правой кнопкой мыши по редактору полей и выберите команду New field для того, чтобы создать новое поле;

  • в появившемся диалоговом окне введите имя нового поля (Name), выберите тип данных поля(Type), отметьте, что поле будет являться вычисляемым (Calculated) и нажмите кнопкуOK.

  • Чтобы отобразить вычисляемое поле в компоненте DBGrid, вызовите редактор столбцов (Columns Editor) для компонентаDBGrid и добавьте в нем новый столбец, указав в качестве имени поля(FieldName) имя нового поля.

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

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

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

  • Чтобы задать условие фильтрации записей, присвойте свойству Filterу компонентаTable необходимое условие в следующем формате: <имя поля> <операция сравнения> <значение>. Примеры условий:‘Cnt > 10’, ‘FIO = ‘Иванов’’.

  • Чтобы включить или выключить фильтрацию записей, присвойте свойствуFiltered значениеTrue илиFalse.

  1. Поиск записей в таблице базы данных. Существует два основных метода поиска записей: поиск по произвольному условию (процедура Table.Locate) и поиск по ключевому полю (процедураTable.FindNearest). Первый вариант обладает большей гибкостью, но имеет следующие существенные недостатки: а) поскольку записи перебираются последовательно, то в большой базе данных поиск осуществляется медленно; б) для поиска следующей записи, отвечающая условию, поиск надо запустить повторно. Второй вариант требует задания ключевых полей (создания вторичных индексов), но зато поиск по ним осуществляется быстро и все записи, отвечающие условию, будут найдены за один раз.

  • Для того, чтобы создать в таблице «Заказы» индексы по полю «Товар» и «Клиент»:

  • Откройте в Database Desktop таблицу «Заказы», нажмите кнопку Restructure, выберите из выпадающего спискаTable Properties в правой части окна значениеSecondary Indexes (вторичные индексы) и нажмите кнопкуDefine (определить).

  • Из списка полей выберите то поле, по которому вы хотите построить индекс, (в данном случае это поле «Товар») и нажмите кнопкуOK.

  • Придумайте и введите имя для названия индекса, например TovarIndex.

  • Повторите операцию для поля “Клиент”.

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

  1. Ну, и последний совет:

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

31