Могу ли я получить и сохранить значения параметров в проекте сервера отчетов VS? - PullRequest
0 голосов
/ 15 апреля 2020

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

a) получить сохраненные значения параметров отчета

и

b) сохранить любые измененные значения для параметров отчета

Я знаю, что значения параметров можно извлечь из данных, установив для значений по умолчанию значение «Получить значения из запроса».

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

Можно ли это сделать? Кажется, нет никакого выхода "из коробки".

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Это довольно просто.

Предположим, у вас есть таблица стран, в которой указаны доступные значения вашего параметра, и что в этой таблице myCountryTable есть два столбца CountryID и CountryName.

Набор данных доступных значений будет выглядеть просто как

SELECT * FROM myCountryTable

CountryID будет значением параметра, а CountryName будет меткой параметра.

ОК, так что вы, вероятно, получите уже сделали все вышеперечисленное.

Теперь, в вашем основном запросе к набору данных просто добавьте оператор INSERT перед выполнением основного запроса.

Итак, если ваш запрос к набору данных выглядит следующим образом ..

SELECT * FROM SomeBigTable WHERE CountryID in (@CountryID)

вы бы изменили его на что-то вроде

INSERT INTO myLogTable
    SELECT CountryID, CountryName FROM myCountryTable WHERE CountryID IN (@CountryID)
-- original query follows
SELECT * FROM SomeBigTable WHERE CountryID in (@CountryID)

Примечание : Если по какой-либо причине вы не можете изменить запрос к основному набору данных, вы можете сделать это в отдельный набор данных, но есть несколько вещей, которые вам нужно будет сделать

Первый: измените sql, чтобы он возвращал значение в конце, все будет делать, например,

INSERT INTO myLogTable
   SELECT CountryID, CountryName FROM myCountryTable WHERE CountryID IN (@CountryID)
   SELECT 1 as myReturnValue

Второй : Вы должны связать этот набор данных с чем-то на Отчет, такой как таблица или список, предназначен для того, чтобы запрос выполнялся только при выполнении отчета, а не при изменении параметров.

1 голос
/ 15 апреля 2020

Вы можете хранить параметры и их значения при каждом выполнении отчета.

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

Например, в конце каждой хранимой процедуры, используемой в отчете, поместите эту часть SQL запрос, который использует вновь созданную таблицу dbo.ReportParameterValuePairs:

INSERT INTO dbo.ReportParameterValuePairs (ReportName, ParameterValuePair, ExecutionDateTime) VALUES( 'MyReport', '$$$parameter1$$$: ' + @parameter1 + ',' + '$$$parameter2$$$: ' + @parameter2, GETDATE())

Позже будет понятно, почему эти данные хранятся и почему таким образом.

Шаг вложения будет создавать процедуру, которая будет извлекать значение какого-либо параметра во время последнего выполнения отчета:

CREATE PROCEDURE spRetrieveReportParameterValue @parameter NVARCHAR(100), @report NVARCHAR(100) AS BEGIN

-- this is an example
DECLARE @parameters NVARCHAR(MAX) = '$$$parameter1$$$: value1, $$$parameter2$$$: value2'
-- in reality parameter-value pairs will be retrieved from database
--DECLARE @parameters NVARCHAR(MAX) =
--  (SELECT TOP 1 ParameterValuePair
--  FROM dbo.ReportParameterValuePairs
--  WHERE ReportName = @report
--  ORDER BY ExecutionDateTime DESC)

--SELECT @parameters

DECLARE @parameterValuePair NVARCHAR(200) =
    (SELECT * FROM STRING_SPLIT (@parameters, ',')
    WHERE
        VALUE LIKE '%$$$' + @parameter + '$$$%')

--SELECT @parameterValuePair

DECLARE @value NVARCHAR(100) =
(SELECT * FROM STRING_SPLIT (@parameterValuePair, ':') WHERE value NOT LIKE '%$$$%')

SELECT TRIM(@value) AS ParameterValue

END

Параметры процедуры : параметр, значение которого необходимо, отчет о выполнении.

Пары параметр-значение хранятся в одной строке. Для доступа к этой таблице поиска данных dbo.ReportParameterValuePairs для текущего отчета. Упорядочить данные по дате и времени выполнения, начиная с самых последних.

Строка пар параметр-значение будет разбита с использованием ,. Результатом этого разделения является таблица, которая состоит из пар параметр-значение. Различие между параметрами и их значениями составляет $$$ mark. Из-за этого условие в запросе VALUE LIKE '%$$$' + @parameter + '$$$%'. В переменной @parameterValuePair теперь хранится нужный параметр и его значение.

После еще одного разделения, на этот раз с использованием :, поскольку оно отделяет значение от имени параметра, результатом разделения будет две строки. Один содержит параметр и отметки $$$ ( $$$ [параметр] $$$ ), а другой содержит значение. Используя условие WHERE value NOT LIKE '%$$$%', значение параметра будет сохранено в переменной @value.

Последний шаг процедуры - обрезать значение, если в конце и в начале * 1044 есть пустые пробелы и вернуть его как ParameterValue.

Чтобы извлечь это значение из отчета, создайте DataSet для каждого параметра отчета. Этот DataSet предоставит параметру значение по умолчанию:

  1. щелкните правой кнопкой мыши DataSets
  2. выберите Добавить набор данных
  3. выберите вкладка / карта Запрос
  4. имя Набор данных
  5. выбор Источник данных
  6. для типа запроса выберите Текст
  7. введите spRetrieveReportParameterValue 'parameter1', 'MyReport', где parameter1 - имя параметра, последнее значение которого будет получено
  8. щелкните Refre sh Поля

enter image description here

Последний шаг - установить значение по умолчанию для параметра:

  1. щелкнуть правой кнопкой мыши параметр
  2. выберите Свойства параметра
  3. выберите карту / вкладку Значения по умолчанию
  4. выберите вариант Получить значения из запроса
  5. для набора данных выберите вновь созданный набор данных
  6. для поля значения выберите ParameterValue

enter image description here

Это должен быть результат:

enter image description here

...