Связи (relations)

Top  Previous  Next

Между двумя источниками данных можно установить связь. Связь описывает отношение типа "главный-подчиненный" (или "родительский-дочерний"). Например, одна запись в таблице Categories может иметь множество подчиненных записей в таблице Products:

 

materDetailRelation

 

Для того чтобы создать связь, нужно указать следующее:

 

1.главная таблица;
2.подчиненная таблица;
3.набор ключевых полей в главной таблице;
4.набор ключевых полей в подчиненной таблице.

 

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

 

masterDetailTables

 

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

 

Как можно использовать связанные источники данных в FastReport? Есть два способа сделать это.

 

Первый способ дает возможность строить отчеты типа "главный-подчиненный" (master-detail). Для этого используются два бэнда "Данные". Главный бэнд привязывается к главному источнику данных, подчиненный бэнд – к подчиненному источнику. Наш пример может выглядеть так:

 

masterDetailReport

 

Такой отчет, если его запустить, напечатает список продуктов в каждой категории:

 

masterDetailReportResult

 

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

 

relationReport

 

Такой отчет, если его запустить, напечатает все продукты из всех категорий. Допустим, мы рядом с каждым продуктом хотим напечатать имя категории, к которой он относится. Без использования связи это было бы затруднительно, т.к. все, что мы знаем о категории – это ее идентификатор (поле CategoryID в таблице Products). Имя категории хранится в поле CategoryName таблицы Categories. С помощью связи мы можем обратиться к имени категории следующим образом:

 

[Products.Categories.CategoryName]

 

При этом FastReport выполнит следующие действия:

 

возьмет текущую строку в таблице Products;
в таблице Categories найдет строку, которая является родительской;
для найденной строки вернет значение поля CategoryName.

 

В общем случае форма обращения к полю родительской таблицы допускает неограниченное количество предков таблицы:

 

[дочерняя_таблица.ее_родитель.родитель_родителя.и_так_далее.поле]

 

Чтобы добавить в отчет такое поле данных, откройте таблицу Products в окне "Данные". Вы увидите, что среди ее полей есть ссылка на родительскую таблицу Categories:

 

relationInDataWindow

 

Если перетащить показанное на рисунке поле в отчет, мы получим объект "Текст" с текстом:

 

[Products.Categories.CategoryName]

 

Наш отчет будет выглядеть следующим образом:

 

relationReport1

 

Если его запустить, мы увидим следующее:

 

relationReportResult