Перейти к содержанию

Связи (relations): различия между версиями

Материал из Химсофт Вики
Строка 27: Строка 27:
==Способ 2==
==Способ 2==


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


[[Файл: data_link_3.png|center|border]]
[[Файл: data_link_3.png|center|border]]


Если перетащить показанное на рисунке поле в отчет, мы получим объект "Текст" с текстом:
Мы видим, что среди полей источника <code>Indicators</code> есть ссылка на родительскую таблицу <code>LaboratoryFilter</code>.


[Products.Categories.CategoryName]
Таким образом, для реализации такого типа отчета нужно:
*создать связь между источниками данных;
*перетащить в дереве данных из подчиненного источника поле родительского источника <code>[Indicators.LaboratoryFilter.lab_name]</code>;
*перетащить в дереве данных из подчиненного источника поле <code>[Indicators.ind_name]</code>.


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


[[Файл: data_link_4.png|center|border|500px]]
[[Файл: data_link_4.png|center|border]]


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

Версия от 09:14, 16 октября 2026

Между двумя источниками данных можно установить связь типа главный-подчиненный (или родительский-дочерний).

Например:

  • одна запись в запросе LaboratoryFilter может иметь множество подчиненных записей в запросе Indicators;
  • оба запроса имеют поле lab_id, по которому можно установить связь.

Есть 2 способа построить отчет с подобными взаимоотношениями.

Способ 1

Первый способ дает возможность строить отчеты типа "главный-подчиненный" (master-detail).

Для этого используются два бэнда "Данные":

  • главный бэнд привязывается к главному источнику данных;
  • подчиненный бэнд привязывается к подчиненному источнику данных;
  • в фильтре подчиненного источника задается выражение сопоставления соответствующих полей
[Indicators.lab_id] == [LaboratoryFilter.lab_id].

В результате отчет может выглядеть, например, так:

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

Способ 2

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

Мы видим, что среди полей источника Indicators есть ссылка на родительскую таблицу LaboratoryFilter.

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

  • создать связь между источниками данных;
  • перетащить в дереве данных из подчиненного источника поле родительского источника [Indicators.LaboratoryFilter.lab_name];
  • перетащить в дереве данных из подчиненного источника поле [Indicators.ind_name].

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

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

Создание связи

Редактирование связи