Связи (relations): различия между версиями
Sidminik (обсуждение | вклад) |
Sidminik (обсуждение | вклад) |
||
| Строка 23: | Строка 23: | ||
===Способ 2=== | ===Способ 2=== | ||
Второй способ позволяет из подчиненного источника обращаться к главному. Покажем это на примере. Допустим, мы хотим распечатать список всех продуктов. Для этого нам нужен один бэнд "Данные", который подключен к таблице Products: | Второй способ позволяет из подчиненного источника обращаться к главному. | ||
Покажем это на примере. Допустим, мы хотим распечатать список всех продуктов. Для этого нам нужен один бэнд "Данные", который подключен к таблице Products: | |||
Такой отчет, если его запустить, напечатает все продукты из всех категорий. Допустим, мы рядом с каждым продуктом хотим напечатать имя категории, к которой он относится. Без использования связи это было бы затруднительно, т.к. все, что мы знаем о категории – это ее идентификатор (поле CategoryID в таблице Products). Имя категории хранится в поле CategoryName таблицы Categories. С помощью связи мы можем обратиться к имени категории следующим образом: | Такой отчет, если его запустить, напечатает все продукты из всех категорий. Допустим, мы рядом с каждым продуктом хотим напечатать имя категории, к которой он относится. Без использования связи это было бы затруднительно, т.к. все, что мы знаем о категории – это ее идентификатор (поле CategoryID в таблице Products). Имя категории хранится в поле CategoryName таблицы Categories. С помощью связи мы можем обратиться к имени категории следующим образом: | ||
| Строка 39: | Строка 45: | ||
[дочерняя_таблица.ее_родитель.родитель_родителя.и_так_далее.поле] | [дочерняя_таблица.ее_родитель.родитель_родителя.и_так_далее.поле] | ||
Чтобы добавить в отчет такое поле данных, откройте таблицу Products в окне "Данные". Вы увидите, что среди ее полей есть ссылка на родительскую таблицу Categories: | |||
[[Файл: data_link_3.png|center|border|500px]] | |||
Если перетащить показанное на рисунке поле в отчет, мы получим объект "Текст" с текстом: | |||
[Products.Categories.CategoryName] | |||
Наш отчет будет выглядеть следующим образом: | |||
[[Файл: data_link_4.png|center|border|500px]] | [[Файл: data_link_4.png|center|border|500px]] | ||
Если его запустить, мы увидим следующее: | |||
[[Файл: data_link_5.png|center|border|500px]] | |||
==Создание связи== | ==Создание связи== | ||
Версия от 08:57, 16 октября 2026
Между двумя источниками данных можно установить связь типа главный-подчиненный (или родительский-дочерний).
Например:
- одна запись в запросе
LaboratoryFilterможет иметь множество подчиненных записей в запросеIndicators; - оба запроса имеют поле
lab_id, по которому можно установить связь.
Есть 2 способа построить отчет с подобными взаимоотношениями.
Способ 1
Первый способ дает возможность строить отчеты типа "главный-подчиненный" (master-detail).
Для этого используются два бэнда "Данные".
Главный бэнд привязывается к главному источнику данных, подчиненный бэнд – к подчиненному источнику. Наш пример может выглядеть так:

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

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

Если перетащить показанное на рисунке поле в отчет, мы получим объект "Текст" с текстом:
[Products.Categories.CategoryName]
Наш отчет будет выглядеть следующим образом:

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