Одной из мощных функций служб Reporting Services является то, что все является выражением, включая оператор SQL набора данных.
Допустим, ваш первый параметр (тот, который описывает, что выбрать) называется Location
, и он выбирает список местоположений, таких как страна, регион и т. Д. Возможно, вы получите его из таблицы, в которой есть LocationId
а Description
вот так:
SELECT LocationId, Description FROM Locations
Вы подключаете параметр Location к этому запросу, чтобы получить раскрывающийся список селекторов местоположения для параметра Location
.
Теперь создайте второй параметр с именем Select
, в котором мы хотим выбрать из списка стран или регионов. Проще говоря, я предполагаю, что есть только два местоположения: Страна с идентификатором местоположения 1 и Регион с идентификатором местоположения 2.
Создайте новый набор данных с именем Selections
и вручную добавьте в него поля с именами Id
и Description
. Подключите ваш параметр Select
к этому набору данных. Теперь для оператора SQL для набора данных Selections
введите следующее выражение:
=IIF(Parameters!Location.Value = 1,
"SELECT CountryId AS Id, CountryName AS Description FROM Countries",
"SELECT RegionId AS Id, RegionName AS Description FROM Regions")
Таким образом, если для параметра Location
установлено значение 1 (Страна), вы выбираете его из таблицы «Страны», в противном случае вы выбираете из таблицы «Регионы». Вы присваиваете псевдонимы полям, чтобы получить согласованно именованные поля для набора данных для использования в запросе параметра Select
. Очевидно, вы можете расширить это до большего количества выборов по мере необходимости.
Вы понимаете, что это немного хрупко - всякий раз, когда вы хотите добавить новый тип местоположения, вы должны просмотреть все ваши отчеты и обновить оператор SQL для набора данных Selections
. Это утомительно, и никто не хочет эту работу. Нам нужна автоматизированная система, в которой все отчеты получают новые выборки при их добавлении.
Итак, давайте добавим столбец в таблицу Locations, который называется SQLStatement. Для строки Страна это будет иметь значение:
SELECT CountryId AS Id, CountryName AS Description FROM Countries
Для строки Region поле SQLStatement имеет значение:
SELECT RegionId AS Id, RegionName AS Description FROM Regions
Теперь в таблице Locations есть значение SQLStatement для набора данных Selections
. Вы не можете использовать это напрямую (ваш набор данных будет просто возвращать значение поля оператора SQL, а не выполнять его), но вы хотите иметь что-то, что возвращает эту строку в качестве выражения для использования в операторе SQL для набора данных Selections
, Пользовательский код может быть использован для этого. Поэтому выражение для набора данных Selections
будет выглядеть примерно так:
=Code.GetSQLStatement(Parameters!Location.Value)
И тогда у вас есть такая функция кода (значимые части пропущены):
Public Function GetSQLStatement(LocationId As Integer) As String
Dim SQL As String
SQL = "SELECT SQLStatement FROM Locations WHERE LocationId = " + CStr(LocationId)
' Connect to database, get SQLStatement field
GetSQLStatement = <Field Value>
End Function
Когда вы хотите добавить другой выбор местоположения, например, континенты, все, что вам нужно сделать, это добавить еще одну строку в таблицу Locations, скажем LocationId = 3, Description = Continent и SQLStatement = SELECT ContinentId AS Id, ContinentName AS Description FROM Continents
, и теперь каждый ваш отчет который выбирает по местоположению, сможет использовать Континенты.