Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
uaggster
Member

Откуда:
Сообщений: 889
Коллеги, несколько тупой вопрос, я понимаю, но тем не менее.

Руководство поставило задачу: Некоторые отчеты SSRS - должны быть акцептованы.
Т.е., в отчете должна появиться некая ссылка, кнопка (черт лысый, не важно), при нажатии на которую, в частности, отчет в отрендеренном виде, в виде pdf, tiff или mht - должен сохранится на sql server, в базе, откуда берутся данные для построения отчета, ну, или в какой то другой базе на том же сервере.

Ну, предположим, текстбокс, реакцией на нажатие которого будет вызов другого отчета, который будет построен на хранимой процедуре, в которой, понятно, можно сделать что угодно - это я сделать могу.
А как запихнуть в нее отрендеренную форму отчета?

С какой стороны подойти к проблеме?
19 ноя 20, 09:42    [22235100]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
godsql
Member

Откуда:
Сообщений: 134
uaggster,

сам не использовал, но нечто похожее:
Создание, изменение и удаление моментальных снимков в журнале отчетов
https://docs.microsoft.com/ru-ru/sql/reporting-services/report-server/create-modify-and-delete-snapshots-in-report-history?view=sql-server-2017
19 ноя 20, 09:57    [22235109]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
uaggster
Member

Откуда:
Сообщений: 889
godsql, интересно, но не то :-(
19 ноя 20, 10:10    [22235114]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6026
Сохранить чисто технически можно - отправить веб-серверу, где развернут SSRS, get-запрос, получить бинарный ответ, сохранить его куда нужно.
Как формировать запрос:
https://docs.microsoft.com/en-us/sql/reporting-services/pass-a-report-parameter-within-a-url?view=sql-server-ver15
https://docs.microsoft.com/en-us/sql/reporting-services/url-access-parameter-reference?view=sql-server-ver15
Пример (простенький отчет, выводящий содержимое sys.objects для указанной в параметре schema_id схемы ):
class SsrsTest
{
  public static void Test()
  {
    var url = string.Concat(
      "http://myserverurl/myreportname",
      "&rs:Command=Render&rs:Format=PDF&schema_id=1"
    );
    var request = WebRequest.Create(url);
    request.Credentials = CredentialCache.DefaultCredentials.GetCredential(new Uri("http://tempuri.org/"), "Basic");
    request.Timeout = 5 * 60 * 1000;
    request.Method = WebRequestMethods.Http.Get;
    try
    {
      using (var response = (HttpWebResponse)request.GetResponse())
      using (var responseStream = response.GetResponseStream())
      {
        if (responseStream == null)
          throw new ApplicationException("response is null");
        const int bufferSize = 1024;
        var buffer = new byte[bufferSize];
        var tmpFile = @"D:\Trash\456.pdf";
        if (File.Exists(tmpFile))
          File.Delete(tmpFile);
        using (var fs = new FileStream(tmpFile, FileMode.Create))
        using (var writer = new BinaryWriter(fs))
        {
          int count;
          do
          {
            count = responseStream.Read(buffer, 0, buffer.Length);
            if (count == 0) break;
            writer.Write(buffer, 0, count);
          } while (count > 0);
        }
      }
    }
    catch(WebException we)
    {
      var errorStream = we.Response.GetResponseStream();
      if (errorStream == null)
        throw;
      string s;
      using (var sr = new StreamReader(errorStream, Encoding.UTF8))
        s = sr.ReadToEnd();
      if (string.IsNullOrWhiteSpace(s))
        throw;
      Console.WriteLine(s);
      var serverErrors = Prepare500(s); // cos' web exception message here always is 'Internal server error (500)'
      if (string.IsNullOrEmpty(serverErrors))
        throw;
      throw new ApplicationException($"Ошибка получения отчета: {serverErrors}");
    }
    Console.WriteLine("done");
    Console.ReadKey(true);
  }

  static string Prepare500(string errorResponse)
  {
    try
    {
      var xd = new XmlDocument();
      using(var sr = new StringReader(errorResponse))
      using(var xr = XmlReader.Create(sr))
        xd.Load(xr);
      var errors = xd.SelectNodes("/html/body/ul//li/text()");
      if (errors == null)
        return null;
      var sb = new StringBuilder();
      foreach (XmlText xt in errors)
        if (!string.IsNullOrWhiteSpace(xt.Value))
          sb.AppendLine(xt.Value.Trim());
      return sb.Length == 0 ? null : sb.ToString();
    }
    catch(Exception e)
    {
      Console.WriteLine(e);
      return null;
    }
  }
}

- это просто пример-набросок, подобное в допиленном виде у нас используется для получения и пост-обработки одного отчёта, выгружаемого в эксель.
Удастся ли подселить такое хозяйство в CLR SP, и вызвать со страницы отчёта - не знаю.
19 ноя 20, 11:03    [22235152]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
SERG1257
Member

Откуда:
Сообщений: 2788
Посмотрите в сторону подписок на отчеты
https://docs.microsoft.com/en-us/sql/reporting-services/subscriptions/subscriptions-and-delivery-reporting-services?view=sql-server-ver15
Оно для другого задумано но наверняка есть некий API чтобы оформить подписку без расписания.
19 ноя 20, 16:51    [22235521]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
uaggster,

пишите простейшее приложение на C# (ASP.NET) с контролом отчета. Пользователь жмет кнопку, формируется отчет в файл и сохраняется куда захотите.
19 ноя 20, 18:52    [22235637]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 34241
Блог
uaggster,

можно попробовать решить задачу на другом уровне - сохранять "снимок" отчета просто в таблице (в виде строк)

Сообщение было отредактировано: 19 ноя 20, 21:44
19 ноя 20, 21:50    [22235738]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
uaggster
Member

Откуда:
Сообщений: 889
Сон Веры Павловны, похоже это да, оно.

Коллеги, спасибо! Буду копать в направлении, как Сон Веры Павловны обозначил.
20 ноя 20, 12:38    [22235974]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
uaggster
Member

Откуда:
Сообщений: 889
Сон Веры Павловны
Сохранить чисто технически можно - отправить веб-серверу, где развернут SSRS, get-запрос, получить бинарный ответ, сохранить его куда нужно.
Как формировать запрос:
https://docs.microsoft.com/en-us/sql/reporting-services/pass-a-report-parameter-within-a-url?view=sql-server-ver15
https://docs.microsoft.com/en-us/sql/reporting-services/url-access-parameter-reference?view=sql-server-ver15


Собственно, CLR, которая умеет отправлять http-запросы - у меня есть.
Задача, получается, сводится к формированию url, который представляет собой запрос: "Сформировать отчет и скачать его в виде pdf".

Есть проблема, что указанный запрос будет исполняться не от имени пользователя, а от имени контекста, в котором выполняется clr-ка (если я правильно понимаю), но это, вроде, пока не важно.
20 ноя 20, 12:43    [22235980]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли сохранить отчет SSRS на sql server в отрендеренном виде?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8047
uaggster,

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

Однако, смысл этих действий не совсем понятен, так как данные, на которых строится отчет, могут быть изменены. Визировать надо и данные (и запрещать из изменение в дальнейшем) и саму форму (версию) отчета, только в этом случае это будет подлинно достоверный отчет.
20 ноя 20, 13:54    [22236023]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить