powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / SSRS автоматическое сохранение отчета по абсолютному пути
15 сообщений из 15, страница 1 из 1
SSRS автоматическое сохранение отчета по абсолютному пути
    #38209178
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги.

Возникла следующая проблема, не знаю как бы ее поизящнее решить:
Требуется разослать по корпоративной почте отчет из службы SSRS. Рассылка осуществляется агрегатором почты VipNet. Он забирает по маске файлы из определенной папки и рассылает по получателям. Задача следующая: сформировать из ACCESS по требованию пользователя в SSRS группу отчетов и выложить их в определенную папку. В вебе я никак, поэтому пришлось пользоваться гайдами с MSDN. Там я нашел как формировать по URL необходимый мне файл и скачивать его на машинку пользователя. Проблема возникла с выкладыванием файла в папку назначения (сетевая шара для пользователя) - не знаю как указать RS куда складировать файлы. Возможно стоит и подойти с другого краю и искать уже сгенерированные файлы с папки загрузки и копировать их в шару, но как то неспортивно и некрасиво.

Код: vbnet
1.
Transliteration("http://serversql:81/RS_SPID/Pages/ReportViewer.aspx?%2fСправкаЕкатeринбург%2fActTbc&rs:Format=PDF&rs:Command=Render&date1=1990-01-01&date2=2015-01-01&terr=Алапаевск")



Пример запроса, качающего один файлик на машинку пользователя. Функция для браузера, не понимающего русскую кодировку, приводить тут смысла нет (ТМ-взята в соседней ветке). Папка подключается при запуске клиента с вшитыми логином и паролем. т.е. конечная папка вида: "M:\Mailer_Folder\"

Заранее спасибо.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38209598
Фотография Katy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlassMorre, зачем так сложно. чем стандартные рассылки RS не устраивают?
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38209785
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlassMorre,

Как ответили выше SSRS замечательно сам умеет рассылать. Но если у вас какой то хитрый алгоритм рассылки в помощь вам подписки управляемые данными. Там можно "генерить" и пути и имена файлов и значения параметров.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38210044
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, верно, яиспользую рассылки и очень доволен, но дело в том что конкретный отчет - донесения строгой отчетности и оператор хочет получать их из бд сразу по заполнению, контролировать верность данных и рассылать по контрагентам, контролируя получение.
Раньше это делалось так: печатались бумажные копии и рассылались по факсу) гос контора. Теперь по министерству приказ запрещает подобные данные слать открытыми каналами связи в связи с 152 законом. Решили использовать корпоративную защищенную сеть для этих целей. Но поступление информации нестабильное, может несколько дней не приходить ничего а потом прийти скопом, за один день не успевают отработать, поэтому рассылка по расписанию не подходит, можно заморочится с проверками на завершения батча ввода, ввести пакеты поступлений и рассылать по расписанию только пакеты с отметкой о завершении ввода, но никто не пойдет на усложнение процесса и решили дать пользователю возможность жмякнуть на кнопочку и наблюдать как в почте появляются уходящие письма и потом появляются напротив них отметки о прочтении. Но вот загвоздка. Как заставить SSRS складывать файл в определенную папку.

Тут появилась идея воспользоваться скриптом серверным, который будет генерить письма на сервере, если у кого есть пример работающий или хотя бы идею в какую сторону копать - заранее спасибо. На аксе сделаю за 5 минут, но уже выросли из этой платформы и хочется пробовать технологии поновее.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38210450
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot GlassMorre Но вот загвоздка. Как заставить SSRS складывать файл в определенную папку.
[/quot]

Вы не читали ответа моего? Во-первых, можно в подписке настроить сохранение в папку, если она у вас статична. Во-вторых, можно использовать " подписки управляемые данными", если папка не статична и известен алгоритм именования (по годам, по месяцам, по дням). Что еще нужно?
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38210521
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подписку разве можно выполнить не по расписанию? Подскажите код как выполнить подписку немедленно в любой момент времени. Спасибо.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38210525
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее это веб сервис с loadreport методом, сейчас копаю в эту сторону, на форуме есть пример через соап отправки, но только на си.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38210534
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://msdn.microsoft.com/ru-ru/library/ms159762(v=sql.100).aspx
Ох простите еще вариант.
"Подписка — фиксированный запрос для доставки отчета в определенное время или в ответ на событие"
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38214793
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем система получилось довольно извращенной, но работающей.

При запросе отчета параметры отчета передаются в хранимую процедуру на SQLSERVERе, которая с их помощью генерит RSS скрипт во временной папке и запускает его. В скрипте идет обращение к функциям ssrs по формированию отчетов.

В итоге после нажатия на кнопку в аксе через пару секунд отчет уходит адресату, по функциям доставки его можно слать и через поп/смтп сервера и через общие папки. Если кому интересно могу выложить VBA код и ХП.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38215384
Klick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlassMorre,

Выкладывайте.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38216020
waszkiewicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38216344
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Завтра с работы выложу, может допилим общими усилиями до кондиции)
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38217241
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, радовался рано. При проверке на живых данных выяснилась неприятная особенность - при отработке скрипта у него уходит около 20 секунд на формирование отчета, при этом сам отчет строится менее секунды.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
USE [hiv_data]
GO
/****** Object:  StoredProcedure [dbo].[repsave]    Script Date: 04/08/2013 15:06:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[repsave](@filename as nvarchar(max), @reportpath as nvarchar(max),@params as nvarchar(max))
AS
begin
SET NOCOUNT ON

declare @tempFileName as nvarchar(max)
select @tempFileName='test'+replace(cast(cast(getdate()as decimal(11,5))  as nvarchar(max)),'.','_')+'.rss'
declare @tempPar as nvarchar(max)
declare @comm1 as varchar(3000)
declare @comm2 as varchar(3000)

select @tempPar='Public Sub Main()
	Dim format as string = "PDF"
	Dim fileName as String = "'+@filename+'.pdf"
	Dim reportPath as String = "'+@reportpath+'"
	Dim historyID as string = Nothing
	Dim deviceInfo as string = Nothing
	Dim extension as string = Nothing
	Dim encoding as string
	Dim mimeType as string
	Dim warnings() AS Warning = Nothing
	Dim streamIDs() as string = Nothing
	Dim results() as Byte
	Dim execInfo As New ExecutionInfo
	Dim execHeader As New ExecutionHeader()
	Dim SessionId As String
	Dim credentials As DataSourceCredentials() = Nothing
	Dim showHideToggle As String = Nothing
	Dim reportHistoryParameters As ParameterValue() = Nothing
	'+ @params +'
	rs.ExecutionHeaderValue = execHeader
	execInfo = rs.LoadReport(reportPath, historyID)
	rs.SetExecutionParameters(parameters, "en-us")
	SessionId = rs.ExecutionHeaderValue.ExecutionID
	results = rs.Render(format,  deviceInfo, extension, mimeType, encoding,  warnings, streamIDs)
	execInfo = rs.GetExecutionInfo()
	Dim stream  As FileStream = File.OpenWrite(fileName)
	stream.Write(results, 0, results.Length)
	stream.Close()

	End Sub'
	
	EXEC	hiv_data.[dbo].[spWriteStringToFile] @tempPar,'c:\test',@tempFileName
	select @comm1='rs -i c:\test\'+@tempFileName+' -s http://192.168.0.2:81/rs_spid -e exec2005 -u ***  -p ***'
	select @comm2='del c:\test\'+@tempFileName
	EXEC xp_cmdshell @comm1,no_output 

	EXEC xp_cmdshell @comm2 ,no_output 
	end




Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
Private Sub Кнопка7_Click()
Dim cmd As ADODB.Command
Dim p As ADODB.Parameter
Dim rst As Recordset
Dim con As ADODB.Connection
Dim ctext As String
Dim param As String

Set con = New ADODB.Connection
Set p = New ADODB.Parameter
Set cmd = New ADODB.Command
Set arst = New ADODB.Recordset

con.Open ("Provider=Microsoft.Access.OLEDB.10.0;Persist Security Info=true;Data Source=***;User ID=***;password=***;Initial Catalog=***;Data Provider=SQLOLEDB.1;Language=english;App=trash")

cmd.ActiveConnection = con
cmd.CommandTimeout = 3000
cmd.CommandType = adCmdText
ProgressBar1.Min = 1
ProgressBar1.Visible = True
DoEvents

If Поле0 = "000000" Then
ctext = "SELECT dbo_ACTUAL_TERR_UCHET.kod6 FROM (spis2 LEFT JOIN PD ON spis2.pid = PD.PID) LEFT JOIN dbo_ACTUAL_TERR_UCHET ON PD.First_pid = dbo_ACTUAL_TERR_UCHET.pid " & _
" WHERE (((spis2.Ddiagn) >= #" & Format(Поле2, "mm\/dd\/yyyy") & "# And (spis2.Ddiagn) <= #" & Format(Поле4, "mm\/dd\/yyyy") & "#)) " & _
" GROUP BY dbo_ACTUAL_TERR_UCHET.kod6"
Debug.Print ctext
Set rst = CodeDb.OpenRecordset(ctext, dbOpenDynaset, dbSeeChanges)
If rst.RecordCount > 0 Then
Dim i As Integer
rst.MoveLast
        
ProgressBar1.Max = rst.RecordCount + 1
ProgressBar1.Value = 1
        
For i = 1 To rst.RecordCount
ProgressBar1.Value = ProgressBar1.Value + 1
param = ""
param = param & "Dim parameters(2) As ParameterValue" & vbCr
param = param & "parameters(0) = New ParameterValue()" & vbCr
param = param & "parameters(0).NAME = ""terr""" & vbCr
param = param & "parameters(0).Value = """ & rst!kod6 & """" & vbCr
param = param & "parameters(1) = New ParameterValue()" & vbCr
param = param & "parameters(1).NAME = ""d1""" & vbCr
param = param & "parameters(1).Value = """ & Format(Поле2, "mm.dd.yyyy") & """" & vbCr
param = param & "parameters(2) = New ParameterValue()" & vbCr
param = param & "parameters(2).NAME = ""d2""" & vbCr
param = param & "parameters(2).Value =""" & Format(Поле4, "mm.dd.yyyy") & """" & vbCr
text = "EXEC  [dbo].[repsave] 'E:\...\MAIL_LIST\" & rst!kod6 & "_Список_зарегистрированных " & "'" & _
", '/SPID_Reports/REGCGIE','" & param & "'"
Debug.Print ctext
cmd.CommandText = ctext
Set arst = cmd.Execute(, , adAsyncFetch)
DoEvents
rst.MovePrevious
Next i
Else
MsgBox "На указанную дату нет данных."
Exit Sub
End If
Else
ProgressBar1.Max = 1
ProgressBar1.Value = 1
param = ""
param = param & "Dim parameters(2) As ParameterValue" & vbCr
param = param & "parameters(0) = New ParameterValue()" & vbCr
param = param & "parameters(0).NAME = ""terr""" & vbCr
param = param & "parameters(0).Value = """ & Поле0 & """" & vbCr
param = param & "parameters(1) = New ParameterValue()" & vbCr
param = param & "parameters(1).NAME = ""d1""" & vbCr
param = param & "parameters(1).Value = """ & Format(Поле2, "dd.mm.yyyy") & """" & vbCr
param = param & "parameters(2) = New ParameterValue()" & vbCr
param = param & "parameters(2).NAME = ""d2""" & vbCr
param = param & "parameters(2).Value =""" & Format(Поле4, "dd.mm.yyyy") & """" & vbCr
ctext = "EXEC  [dbo].[repsave] 'E:\...\MAIL_LIST\" & Поле0 & "_Список_зарегистрированных " & "'" & _
", '/SPID_Reports/REGCGIE','" & param & "'"
Debug.Print ctext
cmd.CommandText = ctext
Set arst = cmd.Execute()
End If
ProgressBar1.Visible = False
con.Close
End Sub
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38221238
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, проблема имеет место быть, скорость работы такого метода ужасна. Пытаюсь придумать обходные маневры. Если кто видит узкие места - подскажите. Заранее спасибо.
...
Рейтинг: 0 / 0
SSRS автоматическое сохранение отчета по абсолютному пути
    #38349675
GlassMorre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все оказалось до ужаса просто. Выкладываю тут, вдруг кому тоже приспичит.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
Private Sub Кнопка7_Click()
Dim full_url As String, strFile_path As String, file_name As String
full_url = "http://serversql:81/RS_SPID?/SPID_Reports/REGCGIE&rc:Parametrs=false&rs:Command=Render&rs:format=PDF" & _
"&d1=" & Format(Поле2, "yyyy-mm-dd") & "&d2=" & Format(Поле4, "yyyy-mm-dd") & "&terr=" & Поле0
DoIt full_url, "\\serversql\SoFT_UPDATES\Clinique_N\MAIL_LIST", Поле0 & "_Список_зарегистрированных.pdf"
MsgBox "Из отчета выгружен файл для:" & Поле0.Column(1)
con.Close

End Sub

Sub DoIt(urlname As String, foldername As String, Filename As String)

    Const adTypeBinary = 1
    Const adSaveCreateNotExist = 1
    Const TemporaryFolder = 2
    Dim oStream ' ADODB.Stream
    Dim oFSO    ' Scripting.FileSystemObject
    Dim xml     ' Microsoft.XMLHTTP
    Dim sURL
    Dim oFil
    Dim sImagePath

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set xml = CreateObject("Microsoft.XMLHTTP")
    Set oStream = CreateObject("Adodb.Stream")
     
    sURL = urlname
    sImagePath = foldername & "\" & Filename
    xml.Open "GET", sURL, False
    xml.send

    oStream.type = adTypeBinary
    oStream.Open
    oStream.write xml.responseBody

    oStream.SaveToFile sImagePath, adSaveCreateOverWrite
    oStream.Close
    Set oFil = oFSO.GetFile(sImagePath)
    Set oStream = Nothing
    Set xml = Nothing
    Set oFSO = Nothing
    Set oFil = Nothing
End Sub
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / SSRS автоматическое сохранение отчета по абсолютному пути
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]