Зависимые переменные

<< Click to Display Table of Contents >>

Navigation:  Проект > Документы объектов > Генератор отчетов > Источники данных и переменные > Переменные > Локальные переменные > Панель "Запросить у пользователя" >

Зависимые переменные

 

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

 

 

Данная возможность, зависимость между переменными, удобна при применении параметров в отчете, к примеру, в Master-Detail отчетах. Допустим, есть список категорий, в каждую категория входит несколько продуктов, а каждый продукт обладает детальной информацией. В этом случае, при использовании параметров в отчете, переменная по продуктам и по детальным данным будет содержать огромный список значений (полностью весь перечень продуктов и весь список детальной информации), и если необходимо произвести выборку продукта или какой-то конкретной дательной информации, придется затратить не мало времени. Если взаимосвязь между переменными будет отсуствувовать, то список значений категорий будет содержать 8 категорий, продуктов -  77 записей, а детальных данных до нескольких сотен. Отыскать необходимый продукт и уж тем более детальные данные в таком случае практически невозможно. На рисунках снизу приведены примеры списков значений без взаимосвязи между переменными:

 

 

Возможность зависимых переменных предоставляет возможность сократить списки значений переменных. Иными словами, между переменными можно организовать связь, что приведет к фильтрации списка значений в зависимости от значения главной переменной. Например, в зависимости от выбранной категории, сформируется список значений переменной по продуктам, а в зависимости от выбранного продукта сформируется список детальной информации. К примеру, будет выбрана категория Condiments, тогда список продуктов отфильтруется и будет вида:

 

 

Теперь выберем продукт Genen Shouyu, и тогда список детальных данных будет вида:

 

 

Рассмотрим создание и использование переменных в отчете. Создадим две переменных, одна из которых будет содержать список категорий, вторая список продуктов. Причем список продуктов будет зависеть от выбранной категории. Пример рассмотрим на источниках данных Demo.

 

strel Создадим переменные Category и Product, типа Значение с инициализацией данных integer. В главной переменной (Category), ключи выберем Categories.CategoryID, а значения Categories.CategoryName.

 

i Примечание: Ключ - это уникальный идентификатор записи (строки) в источнике данных. В данном случае для категорий, колонкой содержащей ключи, будет CategoryID, а для продуктов - ProductID. Именно при помощи ключей организуется зависимость (связь) между источниками данных. Важно понимать, что разные ключи продуктов могут относится к одному и тому же ключу категории.

 

strel В зависимой переменной ключи укажем Products.ProductID, а значения - Products.ProductName. Установим флажок Зависимое значение, выберем Category как главную переменную, а колонку данных Products.CategoryID, как зависимую колонку. Теперь перейдем на вкладку Предварительного просмотра, как видно на рисунке ниже, отображается два параметра. В первом списке выбирается категория, а второй список (продукты) формируется в зависимости от выбранной категории:

 

 

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

 

strel Добавим третью переменную в словарь данных. Переменная будет с именем All, типа Значение с инициализацией данных bool.

 

strel Теперь используем зависимость переменных в отчете. Допустим есть Master-Detail отчет, где в каждой категории по несколько продуктов. Для того, чтобы при помощи параметров выбирать определенный продукт или продукты определенной категории, добавим на бэнды Данные в шаблоне отчета, фильтры с выражениями:

fly Первый фильтр будет на Master бэнде Данные, т.е. на бэнде при помощи которого формируется список категорий в отчете. Здесь необходимо отфильтровать категории, в зависимости от выбранного параметра отчета, поэтому выражение будет вида (Category == Categories.CategoryID).

fly Далее необходимо добавить второй фильтр на Detail бэнд Данные, т.е. на бэнд при помощи которого формируется список продуктов в отчете. Фильтр будет с выражением (Product == Products.ProductID).

 

strel Осуществляем переход на вкладку предварительного просмотра. В параметрах отчета наобходимо выбрать категорию, затем продукт, применить параметры в фильтрации данных отчета:

 

 

Как видно из рисунка, была выбрана категория Grains/Cereals (обратите внимание, ключ категории = 5) и продукт Gustaf's Knackebrod (ключ продукта = 22). Другими словами, отобразятся все категории с ключом 5 и все продукты с ключом 22.

 

strel Для того чтобы в отчете отобразить полный список продуктов относящихся к выбранной категории, необходимо использовать третью переменную (All). Поэтому следует изменить выражение фильтра на бэнде Данные, при помощи которого формируется список продуктов (Product == Products.ProductID || All). В этом случае, в зависимости от значения третьей переменной (установлен флажок или не установлен), будет осуществляться фильтрация. Если флажок не установлен, то фильтрация будет по ключам продуктов, т.е. в отчете отобразится тот продукт, чей ключ совпадет. Если же флажок будет установлен, то отображаться будут все продукты выбранной категории:

 

 

Как видно из рисунка, отображена одна категория (ключ = 5) и все продукты относящиеся к ней, с разными ключами.

 

Пример, который был рассмотрен выше, представляет собой одноуровневую зависимость. Теперь рассмотрим более сложный пример, из одноуровневой сделаем двухуровневую зависимость. Оставим категории, продукты относящиеся к ним, и добавим детальные данные уже по каждому продукту. Для этого создаем переменную Order, типа Значение с инициализацией данных integer. Далее, установим флажок Запросить у пользователя, выбираем источник данных как колонка данных.

fly Колонкой с ключами OrderDetails.OrderID, со значениями - OrderDetails.UnitPrice.

fly Далее необходимо установить взаимосвязь с продуктами, для этого в качестве главной переменной следует выбрать Product, зависимой колонкой будет OrderDetails.ProductID.

fly Теперь в шаблон отчета, следует добавить бэнд Данные с детальной информацией по продуктам. В данном примере, у бэнда Данные следует выбрать Order Details как источник данных. Master компонентом будет бэнд Данные с продуктами, и также необходимо указать связь между источниками данных.

fly Добавить фильтр с выражением Order == Order_Details.OrderID на бэнд Данные, который содержит детальные данные по продуктам.

fly Осуществляем переход на вкладку предварительного просмотра.

 

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

 

 

Если необходимо, чтобы можно было отображать всю детальную информацию по выбранному продукту, то следует изменить выражение фильтрации на бэнде Данные с детальными данными продуктов. Выражение будет с использованием Variable3 и примет вид Order == Order_Details.OrderID || All. Теперь, можно просто указать категорию, выбрать продукт и получить все детальные данные по нему:

 

 

Как видно из рисунка отобразилась одна категория, один продукт и все детали поэтому продукту. Стоит также отметить, что количество уровней вложенности так же не ограничен.