powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Обращение к Reporting Services из Visual Basic в Integration Services
7 сообщений из 7, страница 1 из 1
Обращение к Reporting Services из Visual Basic в Integration Services
    #35462563
Dmitry Zhukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Делаю пакет в Integration Services. Внутри пакета есть Script Task, в который нужно запихать код на VB, обращающийся к репортингу.
Нашел примерчик от майкрософта
Код: plaintext
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.
Imports System
Imports System.Web.Services.Protocols
Imports System.Text.RegularExpressions

Class Sample
Public Shared Sub Main()
Dim rs As New ReportingService()
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    Try
Dim inheritParent As Boolean
Dim rolePath As String
Dim items As CatalogItem() = rs.ListChildren("/", True)
Dim item As CatalogItem
        For Each item In items
            rolePath = item.Path
            rs.GetPolicies(rolePath, inheritParent)
            While inheritParent
                rolePath = GetParentPath(rolePath)
                rs.GetPolicies(rolePath, inheritParent)
            End While
            If item.Path = rolePath Then
                Console.WriteLine("The item {0} does not inherit it's role assignment.", item.Path)
            Else
                Console.WriteLine("The item {0} inherits it's role assignment from {1}", item.Path, rolePath)
            End If
        Next item
    Catch e As SoapException
        Console.WriteLine(e.Detail("Message").InnerXml)

    Catch e As Exception
        Console.WriteLine(e.Message)
    End Try
End Sub

Private Shared Function GetParentPath(ByVal currentPath As String) As String
Dim delimiter As String = "/"
Dim rx As New Regex(delimiter)
Dim childPath As String() = rx.Split(currentPath)

Dim parentLength As Integer = childPath.Length -  1 
Dim parentPath(parentLength) As String

Dim i As Integer
    For i =  0  To parentLength -  1 
        parentPath(i) = childPath(i)
    Next i
    If parentPath.Length =  1  Then
        Return "/"
    Else
        Return String.Join("/", parentPath)
    End If
End Function 'GetParentPath
End Class 

Вот мой код на основе этого примера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.Web.Services.Protocols


Public Class ScriptMain

    Public Sub Main()
        Dts.TaskResult = Dts.Results.Success
        Dim rs As New ReportingService()
    End Sub

End Class

ругается на строку Dim rs As New ReportingService()
Как мне подключить возможность использования репортинга в VisualBasic?
Вероятно, нужно что-то в Imports прописать, но вот что....
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35463021
Боюсь, что никак...
Дело в том, что ReportingService() - это ссылка на WebService RS-а (ну, который http://localhost/ReportServer/ReportService.asmx).
Для того что бы пользовать эту ссылку в приложении, надо добавить в приложение WebReference на этот WebService. В задаче Script Task, как я вижу нет возможности добавлять WebReference-ы
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35463188
Dmitry Zhukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Max Otto fon ShtirlicБоюсь, что никак...
Дело в том, что ReportingService() - это ссылка на WebService RS-а (ну, который http://localhost/ReportServer/ReportService.asmx).
Для того что бы пользовать эту ссылку в приложении, надо добавить в приложение WebReference на этот WebService. В задаче Script Task, как я вижу нет возможности добавлять WebReference-ы
Поясните, пожалуйста, как тогда можно выполнить указанный скрипт, т.е. мне нужно создать проект в студии, или что-то еще?
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35463243
Как я понимаю, надо создать отдельный проект, в котором прописать всю логику работы с RS-ом. А в Script Task добавить ссылку уже на этот проект и в коде вызывать его методы, свойства и т.д.
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35465823
Dmitry Zhukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, опишу решение данной проблемы.
Я создал проект на VB, все делал по умолчанию.
Проект называется Console Application1, внутри него есть файл Module1.vb
В Solution Explorer данного проекта щелкаем правой кнопкой мыши по ConsoleApplication1 выбираем пункт Add Web Reference, в строке URL открывшегося окна прописываем
http://localhost/reportserver/reportservice2005.asmx
(вместо localhost можно подставить имя вашего сервера). Это нам нужно для того, чтобы в приложении мы смогли обратиться к объекту ReportingService2005 ну и делать с отчетами, что нам нужно.
Вот, собственно и все.
Далее привожу код, который у меня в Module1.vb
Код: plaintext
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.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
Imports System
Imports System.Web.Services.Protocols
Imports System.Text.RegularExpressions
Imports ConsoleApplication1.localhost

Module Module1

    Sub Main()
        Dim rs As New ReportingService2005()
        rs.Credentials = System.Net.CredentialCache.DefaultCredentials
        Dim conn As New SqlClient.SqlConnection
        conn.ConnectionString = "integrated security=SSPI;data source=localhost;" & "persist security info=False;initial catalog=users_policies"
        Dim conn1 As New SqlClient.SqlConnection
        conn1.ConnectionString = "integrated security=SSPI;data source=localhost;" & "persist security info=False;initial catalog=users_policies"
        Try
            Dim myCMD As SqlClient.SqlCommand = New SqlClient.SqlCommand("SELECT DISTINCT report_path FROM dbo.users_reports_policies;", conn)
            conn.Open()
            Dim myReader As SqlClient.SqlDataReader = myCMD.ExecuteReader()
            Dim myReader1 As SqlClient.SqlDataReader
            Dim QueryStr As String
            Dim CountStr As Integer
            Dim i As Integer
            Dim fNextResult As Boolean = True
            Dim fNextResult1 As Boolean = True
            Do Until Not fNextResult
                Do While myReader.Read()
                    'Console.WriteLine(myReader.GetString(0))
                    conn1.Open()
                    QueryStr = "SELECT userlogin FROM dbo.users_reports_policies WHERE report_path='" & myReader.GetString(0) & "';"
                    'Console.WriteLine("QuerySTR = " & QueryStr)
                    Dim myCMD1 As SqlClient.SqlCommand
                    myCMD1 = New SqlClient.SqlCommand(QueryStr, conn1)
                    myReader1 = myCMD1.ExecuteReader()
                    'Console.WriteLine("FieldCount = " & myReader1.)

                    'Считаем кол-во строк, возвращенных запросом
                    fNextResult1 = True
                    CountStr =  0 
                    Do Until Not fNextResult1
                        Do While myReader1.Read()
                            CountStr = CountStr +  1 
                        Loop
                        fNextResult1 = myReader1.NextResult()
                    Loop

                    myReader1.Close()
                    myCMD1 = New SqlClient.SqlCommand(QueryStr, conn1)
                    myReader1 = myCMD1.ExecuteReader()

                    Dim Item As String = myReader.GetString( 0 )
                    Dim Policies(CountStr -  1 ) As Policy
                    fNextResult1 = True
                    i =  0 
                    Do Until Not fNextResult1
                        Do While myReader1.Read()
                            Policies(i) = New Policy
                            Policies(i).GroupUserName = myReader1.GetString( 0 )
                            Policies(i).Roles = New Role( 0 ) {}
                            Policies(i).Roles( 0 ) = New Role
                            Policies(i).Roles( 0 ).Name = "Browser"
                            Policies(i).Roles( 0 ).Description = "May view folders, reports and subscribe to reports."
                            i = i +  1 
                        Loop
                        fNextResult1 = myReader1.NextResult()
                    Loop
                    Console.WriteLine("CountStr = " & CountStr)
                    Console.WriteLine("i = " & i)
                    Console.WriteLine("Item = " & Item)

                    myReader1.Close()
                    conn1.Close()
                    Console.WriteLine("ItemType = " & rs.GetItemType(Item))
                    If rs.GetItemType(Item) <>  0  Then
                        rs.SetPolicies(Item, Policies)
                    End If
                Loop
                fNextResult = myReader.NextResult()
            Loop
            myReader.Close()

        Catch ex As Exception
            MsgBox("I'm sorry. The application is failed")
        Finally
            conn.Close()
        End Try



        MsgBox("Ok")

    End Sub


End Module

Данный код не претендует на изящество, или супер качество (все-таки это мое первое приложение в студии). Его главное достоинство - он работает. :)
Комментарии по коду:
Этот код решает следующую задачу: у нас имеется таблица dbo.users_reports_policies с полями userlogin, report_path. В этой таблице представлены соответствия логинов пользователей списку отчетов. Программа раздает на указанный список отчетов пользователям роль Browser.
По ходу выполнения в консоль вываливаются сообщения служебного характера.
Если будут вопросы - с радостью отвечу.
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35466196
Ну, это всё гут. Но Вы не описали как вы вызываете Console Application1 из SSIS пакета. Просто вызовом exe-шника из командной строки с помощью какого-нить Execute Process Task?
...
Рейтинг: 0 / 0
Обращение к Reporting Services из Visual Basic в Integration Services
    #35466410
Dmitry Zhukov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Max Otto fon ShtirlicНу, это всё гут. Но Вы не описали как вы вызываете Console Application1 из SSIS пакета. Просто вызовом exe-шника из командной строки с помощью какого-нить Execute Process Task?
На самом деле не знаю :)
Просто пакет IS должен был быть создан для вызова из job на сервере скуля. А раз есть exe-шник, то из джоба можо и его вызвать. Так что задача помещения в IS отпала сама собой.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Обращение к Reporting Services из Visual Basic в Integration Services
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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