Зависимые переменные
<< Click to Display Table of Contents >> Navigation: Проект > Документы объектов > Генератор отчетов > Источники данных и переменные > Переменные > Локальные переменные > Панель "Запросить у пользователя" > Зависимые переменные |
При создании отчетов с параметрами, можно использовать зависимые переменные. В этом случае, одна переменная будет независимая, а остальные могут подчиняться ей или представлять собой иерархию, т.е. каждая последующая переменная подчиняется предыдущей. Для того чтобы переменная стала зависимой необходимо установить флажок Зависимое значение (расположен на панели Запросить у пользователя, при выборе источника данных Колонки данных). После установки флажка, будут отображаться два поля: Переменная и Зависимая колонка. В первом поле следует выбрать переменную, которая будет главной, т.е. от которой данная переменная будет зависеть. Во втором поле следует указать колонку данных, по которой будет осуществляться связь с главной переменной.
Данная возможность, зависимость между переменными, удобна при применении параметров в отчете, к примеру, в Master-Detail отчетах. Допустим, есть список категорий, в каждую категория входит несколько продуктов, а каждый продукт обладает детальной информацией. В этом случае, при использовании параметров в отчете, переменная по продуктам и по детальным данным будет содержать огромный список значений (полностью весь перечень продуктов и весь список детальной информации), и если необходимо произвести выборку продукта или какой-то конкретной дательной информации, придется затратить не мало времени. Если взаимосвязь между переменными будет отсуствувовать, то список значений категорий будет содержать 8 категорий, продуктов - 77 записей, а детальных данных до нескольких сотен. Отыскать необходимый продукт и уж тем более детальные данные в таком случае практически невозможно. На рисунках снизу приведены примеры списков значений без взаимосвязи между переменными:
Возможность зависимых переменных предоставляет возможность сократить списки значений переменных. Иными словами, между переменными можно организовать связь, что приведет к фильтрации списка значений в зависимости от значения главной переменной. Например, в зависимости от выбранной категории, сформируется список значений переменной по продуктам, а в зависимости от выбранного продукта сформируется список детальной информации. К примеру, будет выбрана категория Condiments, тогда список продуктов отфильтруется и будет вида:
Теперь выберем продукт Genen Shouyu, и тогда список детальных данных будет вида:
Рассмотрим создание и использование переменных в отчете. Создадим две переменных, одна из которых будет содержать список категорий, вторая список продуктов. Причем список продуктов будет зависеть от выбранной категории. Пример рассмотрим на источниках данных Demo.
Создадим переменные Category и Product, типа Значение с инициализацией данных integer. В главной переменной (Category), ключи выберем Categories.CategoryID, а значения Categories.CategoryName.
Примечание: Ключ - это уникальный идентификатор записи (строки) в источнике данных. В данном случае для категорий, колонкой содержащей ключи, будет CategoryID, а для продуктов - ProductID. Именно при помощи ключей организуется зависимость (связь) между источниками данных. Важно понимать, что разные ключи продуктов могут относится к одному и тому же ключу категории.
В зависимой переменной ключи укажем Products.ProductID, а значения - Products.ProductName. Установим флажок Зависимое значение, выберем Category как главную переменную, а колонку данных Products.CategoryID, как зависимую колонку. Теперь перейдем на вкладку Предварительного просмотра, как видно на рисунке ниже, отображается два параметра. В первом списке выбирается категория, а второй список (продукты) формируется в зависимости от выбранной категории:
Как видно из рисунка, вторая переменная, которая представляет собой список значений, отображает не полностью весь список хранимых значений, а лишь те значения, которые относятся к выбранной категории.
Добавим третью переменную в словарь данных. Переменная будет с именем All, типа Значение с инициализацией данных bool.
Теперь используем зависимость переменных в отчете. Допустим есть Master-Detail отчет, где в каждой категории по несколько продуктов. Для того, чтобы при помощи параметров выбирать определенный продукт или продукты определенной категории, добавим на бэнды Данные в шаблоне отчета, фильтры с выражениями:
Первый фильтр будет на Master бэнде Данные, т.е. на бэнде при помощи которого формируется список категорий в отчете. Здесь необходимо отфильтровать категории, в зависимости от выбранного параметра отчета, поэтому выражение будет вида (Category == Categories.CategoryID).
Далее необходимо добавить второй фильтр на Detail бэнд Данные, т.е. на бэнд при помощи которого формируется список продуктов в отчете. Фильтр будет с выражением (Product == Products.ProductID).
Осуществляем переход на вкладку предварительного просмотра. В параметрах отчета наобходимо выбрать категорию, затем продукт, применить параметры в фильтрации данных отчета:
Как видно из рисунка, была выбрана категория Grains/Cereals (обратите внимание, ключ категории = 5) и продукт Gustaf's Knackebrod (ключ продукта = 22). Другими словами, отобразятся все категории с ключом 5 и все продукты с ключом 22.
Для того чтобы в отчете отобразить полный список продуктов относящихся к выбранной категории, необходимо использовать третью переменную (All). Поэтому следует изменить выражение фильтра на бэнде Данные, при помощи которого формируется список продуктов (Product == Products.ProductID || All). В этом случае, в зависимости от значения третьей переменной (установлен флажок или не установлен), будет осуществляться фильтрация. Если флажок не установлен, то фильтрация будет по ключам продуктов, т.е. в отчете отобразится тот продукт, чей ключ совпадет. Если же флажок будет установлен, то отображаться будут все продукты выбранной категории:
Как видно из рисунка, отображена одна категория (ключ = 5) и все продукты относящиеся к ней, с разными ключами.
Пример, который был рассмотрен выше, представляет собой одноуровневую зависимость. Теперь рассмотрим более сложный пример, из одноуровневой сделаем двухуровневую зависимость. Оставим категории, продукты относящиеся к ним, и добавим детальные данные уже по каждому продукту. Для этого создаем переменную Order, типа Значение с инициализацией данных integer. Далее, установим флажок Запросить у пользователя, выбираем источник данных как колонка данных.
Колонкой с ключами OrderDetails.OrderID, со значениями - OrderDetails.UnitPrice.
Далее необходимо установить взаимосвязь с продуктами, для этого в качестве главной переменной следует выбрать Product, зависимой колонкой будет OrderDetails.ProductID.
Теперь в шаблон отчета, следует добавить бэнд Данные с детальной информацией по продуктам. В данном примере, у бэнда Данные следует выбрать Order Details как источник данных. Master компонентом будет бэнд Данные с продуктами, и также необходимо указать связь между источниками данных.
Добавить фильтр с выражением Order == Order_Details.OrderID на бэнд Данные, который содержит детальные данные по продуктам.
Осуществляем переход на вкладку предварительного просмотра.
В отчете выбираем категорию, после чего фильтруется список продуктов. Выбираем продукт, после чего фильтруется список детальных данных выбранного продукта. Выбираем детальное значение, нажием кнопку Применить:
Если необходимо, чтобы можно было отображать всю детальную информацию по выбранному продукту, то следует изменить выражение фильтрации на бэнде Данные с детальными данными продуктов. Выражение будет с использованием Variable3 и примет вид Order == Order_Details.OrderID || All. Теперь, можно просто указать категорию, выбрать продукт и получить все детальные данные по нему:
Как видно из рисунка отобразилась одна категория, один продукт и все детали поэтому продукту. Стоит также отметить, что количество уровней вложенности так же не ограничен.