Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки 11-12 лекция.doc
Скачиваний:
1
Добавлен:
23.11.2019
Размер:
229.89 Кб
Скачать

If not Table1.Locate('name', Edit1.Text, [loPartialKey, loCaseInsensitive ])

Then ShowMessage('Заданная строка не найдена');

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

Работа со связанными таблицами

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

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

Связь между таблицами обычно вида 1:М, т.е. одна – главная, другая – подчиненная (ParentsChild).

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

Существуют требования к обеспечению целостности отношения.

Целостность сущностейкаждое отношение должно описывать экземпляры только одной сущности и обладать первичным ключом (parent’s key).

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

Ссылочная целостностьсвязываемые отношения должны иметь общие атрибуты (поля).

Существует 3 механизма обеспечения ссылочной целостности.

1. Запрещающий (prohibit) — нельзя изменять значение ключа родителя или удалять его, если ему соответствуют записи в дочерней таблице.

2. Каскадное удаление (cascade):

  • при изменении значения ключа родительской таблицы автоматически изменяет соответствующие значения в дочерней таблице;

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

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

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

MasterSource : TDataSource – источник данных главной таблицы,

IndexName – текущий индекс подчиненный таблицы,

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

MasterField : String – поле связи индекса главной таблицы.

Алгоритм установки связи

  1. Индексация по полям связи: в Database Desktop в окне Table Properties/Secondary Indexes/Define и сохранить (у child).

  2. Установление ссылочной целостности: в Database Desktop в окне Table Properties/Referential Integrity/Define выбрать главную таблицу и внешний ключ подчиненной (child) и связь сохранить.

  3. Организация связи MasterDetail (3 способа рассмотрены в Пособии) программно:

Table1.DatabaseName := 'proba'; //выбор псевдонима

Table1.TableName := 'tovar.db';//связь компонента доступа с таблицей

DataSource1.DataSet := Table1;//связь ком-та доступа с к-том связи

DBGrid1.DataSource := DataSource1;//к-та связи с к-том отображения

Table1.Open; //открытие набора данных

Table2.DatabaseName := 'proba';

Table2.TableName := 'prixod.db';

DataSource2.DataSet := Table2;

DBGrid2.DataSource := DataSource2;

Table2.MasterSource := DataSource1; //связывание с источником

Table2.Indexname := 'in_tov_prih'; //по индексному ключу

Table2.MasterFields := 'Tovar'; //данного поля

Table2.Open;

Модификация данных

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

Модификация данных проводится только через отдельные формы данных с верификацией вводимых данных:

  • введения ограничений на диапазон данных,

  • проверка типа вводимых данных,

  • обработка исключительных ситуаций TryExcept, TryFinaly.

Компонент Query

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

Name - имя компонента, используется компонентом DataSource для связи результата выполнения запроса с компонентом, обеспечивающим просмотр записей, например, DBGrid.

SQL - записанный на языке SQL запрос к БД,

Active - при значении True активизирует выполнение запроса.

Компонент Query: TDataSet очень похож на компонент Table.

Он также представляет данные в виде таблицы, колонки которой описываются компонентами TField.

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

Отличается от компонента Table:

  • нет идентификации таблицы свойства TableName (делается через SQL-запрос),

  • не содержит методов управления файлами, т.к. SQL-запрос обращается к таблицам сам,

  • нет смысла индексировать (делается в SQL-запросе),

  • нет механизма связи MasterDetail (делается в SQL-запросе).

SQL-запрос можно отладить в :

  • В программе SQL Explorer на вкладке Enter SQL,

  • В программе Database Desktop составить QBE-запрос и текст запроса посмотреть в окне SQL Editor, выполнив команду Query/Show SQL,

  • В построителе запросов SQL Builder, вызываемом из контекстного меню компонента Query.

Инициализация запроса:

  • В свойстве SQL компонента Query записать текст запроса и присвоить свойству Active = True.

При выполнении программы в таблице будет информация, соответствующая SQL-запросу.

  • Но лучше это осуществлять программно, используя метод Open для компонента Query при создании формы.

Виды SQL – запросов:

  • Статический – запрос включается в исходный код программы на этапе разработки и в процессе выполнения приложения не меняется.

  • Динамический – формируется или изменяется при выполнении приложения.

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

Программная реализация SQL - запроса

Query1.Close; //закрывает предыдущий запрос

Query1.SQL.Clear; //удаляет предыдущий запрос

Query1.SQL.Add(Edit1.Text);//считывает запрос из поля Edit1.Text

Query1.Open; //открывает файл запросов