л.р.4 - Программирование приложения для работы с базами данных (BDE)
******* Заметки при создании ****************
Так как в задании требуется реализовать ограничения ссылочной
целостности таблиц на уровне приложения, то логично убрать эти
ограничения на уровне BDE.
Поэтому была создана копия БД, из которой убрано все
второстепенное (ограничения, проверка ввода). Остались только
сами таблицы и пароли. Эта БД регистрируется под псевдонимом
kassa5.
В проекте использован компонент Ses1: TSession, для:
- выбора алиасов,
- хранения пароля доступа к БД.
*********** ОТЧЕТ по лаб 4_1 *********************************
Пункты задания:
-2. Одна из таблиц БД должна быть создана методом CreateTable.
- см Меню\Редактирование списка лекарств. Табл. Kategor2.DB так
создается, затем заполняется копией табл kategorii.db .
! Однако, в инспекторе объектов пришлось задать для компонента
TTable: имя сессии, имя БД, имя табл.db ? - Иначе при удалении
таблица не существует.
! Однако при копировании русификация не верна.
- добавил database1.options: LANGDRIVER=Pdox ANSI Cyrillic
- не помогло.
- поэтому эта табл не используется, только демо создания,
заполнения, удаления.
-3. На отдельной форме отобразить набор данных одной из таблиц и
создать группу кнопок, запрограммировав за ними действия,
имитирующие работу навигатора.
- см Меню\Клиенты (Демо-навигатор)
- см Меню\Редактирование списка лекарств и списка категорий
-4.Реализовать на уровне приложения ограничения ссылочной
целостности таблиц (каскадное удаление и изменение записей в
связанных таблицах).
- см Меню\Редактирование списка лекарств и категорий, а также:
Правила для связи таблиц lek_list <---> kategorii (ниже.)
a)При вставке нового лекарства или правке - tabLekar.
проверить, есть ли такой Id_kategor в tabKategor
Еще лучше: поле Id_kategor вводить выбором из списка категорий.
(т е DBLookUpComboBox)
- см TForm7.btnPostClick, TForm7.btnInsertClick
b)При удалении из tabKategor и исправлении поля Id_kategor:
разрешать убрать Id_kategor только если нет
такого Id_kategor в tabLekar
- см обработчик tabKategor.BeforeDelete
запретить изменять ключевое поле Id_kategor.
- см обработчики tabKategor.BeforeEdit, BeforePost
c) При удалении лекарства проверяются остатки на складе.
Выдается предупреждение и возможность удалять/ не удалять.
Лекарство удаляется одновременно из списка лекарств и списка
склада.
d) При вставке нового лекарства проверяется:
* Правильность заполнения полей
(см TForm7.ValidFields)
* Присутствие этой категории в табл Категорий.
* Запрещена вставка лекарства с существующим индексом.
* Если такого лекарства нет в табл Склад, можно разрешить
добавление в табл склад.
-5. Установить связи между таблицами с помощью Инспектора
объектов. (Выполняется в Runime, кнопками) На отдельной форме
приложения выполнить демонстрационный пример для отображения
работы связанных между собой таблиц (использовать стандартные
компоненты визуализации данных).
- см Меню\Связь таблиц.
-6. Реализовать на уровне приложения возможности пользователя
по созданию, смене и удалению индексов. Предусмотреть возможность
демонстрации изменения порядка следования записей при смене индекса.
- см Меню\Связь таблиц.
Создание индексов вынесено в TTable.AfterOpen.
-7. Реализовать на уровне приложения возможности пользователя
по созданию и редактированию фильтров. Предусмотреть возможность
демонстрации работы фильтров. - см Меню\Связь таблиц.
Использован CheckBox и Edit
-8. Продумать механизм бизнес – правил для корректной работы
приложения и реализовать его путем программирования.
- см ниже, в этом файле.
-9. Реализовать в приложении инструмент контроля для ввода данных
в поля, используя при этом различные возможности ограничения
ввода данных и шаблоны ввода.
- ограничения см Меню\Редактирование списка лекарств и категорий -
(см TForm7.ValidFields)
- шаблон см Меню\Клиенты , поле Phone
-10. Продемонстрировать в разрабатываемом приложении различные
приемы программирования работы с базой данных для поиска записей
в наборе данных и установки закладок, обработку исключительных
ситуаций.
- Поиск (FindKey) см TForm7.Lek_IdExistsSklad, TForm7.Lek_IdExists,
TForm7.KategorExists
- Поиск Tablel.Locate см TForm7.btnFind0Click
- BookMark - TForm7.btnBookStartClick, TForm7.btnGoBookClick
- обработка исключений: Unit2, Unit5, Unit7 - поиском найти try
************* О бизнес-правилах ********************************
(Лекции, раздел 3, тема 9)
«бизнес-правила» (Business Rules) или декларативные
ограничения целостности.
• Ограничения целостности атрибута: значение по умолчанию, задание
обязательности или необязательности значений (Null), задание
условий на значения атрибутов.
• Ограничения целостности, задаваемые на уровне связи между
отношениями: задание обязательности связи, принципов каскадного
удаления и каскадного изменения данных, задание поддержки
ограничений по мощности связи. Эти виды ограничений могут быть
выражены заданием обязательности или необязательности значений
внешних ключей во взаимосвязанных отношениях.
----------- Таблицы БД ----------------
==============================
Табл ap_users
--------------------------------
Имя поля Тип Размер Ключ
--------------------------------
Id_users S *
Name A 100
Email A 30
Pass A 20
Contactfio A 30
Id_country S
Pindex A 10
City A 20
Paddress A 50
Phone A 12
Fax A 12
Etc A 50
-----------------------------
Табл countries
--------------------------------
Имя поля Тип Размер Ключ
--------------------------------
Id_country S *
Country A 20
----------------
Табл kategorii
--------------------------------
Имя поля Тип Размер Ключ
--------------------------------
Id_kategor S *
Kategor A 30
--------------
Табл lek_list
--------------------------------
Имя поля Тип Размер Ключ
--------------------------------
Lek_id S *
Id_kategor S
Nazvan1 A 30
Nazvan2 A 30
Nazvan3 A 40
Cena $
-----------------
Табл sklad
--------------------------------
Имя поля Тип Размер Ключ
--------------------------------
Lek_id S *
Ostatok S
Stellaj A
===========================================
--------- Связи между отношениями (таблицами) ---------
1. lek_list <---> sklad (1 : 1)
Поля связи: Lek_id
Класс принадлежности: обязательный для обеих табл.
2. lek_list <---> kategorii (m : 1)
Поля связи: Id_kategor
Класс принадлежности: необязательный для lek_list,
обязательный для kategorii.
3. ap_users <---> countries (m : 1)
Поля связи: Id_country
Класс принадлежности: необязательный для ap_users,
обязательный для countries.
--------------------
========== Правила для связи lek_list <---> kategorii ===
A)lek_list:
Before_Insert - поле Id_kategor вводить выбором из списка категорий.
------------
Before_Update - поле Id_kategor вводить выбором из списка категорий.
==============
B)kategorii:
Before_Delete
Проверить: если есть связанные записи в lek_list, выдать сообщение
и не удалять или предложить удалить все лекарства этой категории
(каскадно).
------------
Before_Update
Проверить: если есть связанные записи в lek_list, запретить
редактирование ключа Id_kategor
========= Реализация правил =========
На уровне приложения, на этапе разработки
настраиваем ссылочную целостность:
***************************************
Как распаковать архив и установить на другой машине:
--------------
1. В какую-нибудь папку (например, E:\tempo) распаковать архив
Apteka.rar
В результате - в папке E:\tempo\Apteka будут 3 папки:
- E:\tempo\Apteka\BD_kassa - база данных, где находятся все
таблицы. (алиас kassa4 - для лаб № 2,3)
- E:\tempo\Apteka\BD_kassa5 - база данных, где находятся все
таблицы. (алиас kassa5 - для лаб № 4)
- E:\tempo\Apteka\lab4_1 - здесь будет проект лаб4.
2. Если не зарегистрирован алиас kassa5, Зарегистрировать алиас
kassa5, для этого вызвать BDE Admin и
- В меню: Object\New, driver name оставить - STANDARD щелкн ОК
- В правом окне, строка PATH пощелкать и установить путь к БД,
т е E:\tempo\Apteka\BD_kassa5 (папка BD_kassa5 должна распахнуться)
щелк ОК
- Перейти на закладку Configuration, щелк по кресту Configuration
затем: Dravers - Native - Paradox
- В правом окне, строка LANGDRIVER из списка выбрать
Pdox ANSI Cyrillic
- Раскрыть SYSTEM - Init и тоже выбрать LANGDRIVER =
Pdox ANSI Cyrillic
- Сделать правый щелчок на Configuration и выбрать Apply
(если доступно)
- Вернуться на закладку DATABASES, правый щелчок по STANDARD1,
выбрать - переименовать. Новое имя - kassa5.
- Еще правый щелчок по STANDARD1, выбрать - Apply, затем - ОК
В результате будет создан алиас= kassa5 (постоянный). Фокусы с Pdox
ANSI Cyrillic можно отложить на потом (если будут проблемы с
русификацией таблиц.)
3. Запустить Apteka4_1.exe Из папки с проектом Делфи.
если алиас создан нормально, появится окно этой программы. При помощи
меню можно открыть любую из трех форм проекта (основной пароль=
krolik, другие пароли см. в отчете по лаб2)
4. Если постоянный алиас не нужен, то можно создавать временный,
при помощи DB DeskTop. Меню\Tools\Alias Manager.
- Щелкнуть New, вписать kassa5 в окно Database alias , затем
щелкнуть save as, в появившемся окошке выбрать из раскрывающегося
списка kassa5, затем сохранить файл IDAPI32.CFG в папке
E:\tempo\Apteka\BD_kassa5
Однако когда алиас станет негодным - прога не запустится и придется
повторить создание алиаса.
5. Алиас kassa4, необходимый для лаб 2,3 - создается аналогично.
База данных для него находится в папке BD_kassa
Screens