Crystal Reports передает учетные данные в отчет, чтобы он отображал данные только для вошедшего в систему пользователя.

Я создал отчет в Visual Studio, который считывает данные из базы данных SalesLogix (Infor CRM). Отчет работает нормально, но независимо от того, что я ему передаю, результаты показывают только те данные, которые были сохранены для учетных данных пользователя, использованных при создании отчета. При создании отчета, если я подключаюсь к базе данных с помощью учетной записи администратора, я вижу все, а если я подключаюсь к базе данных с использованием одной из учетных записей пользователей, я вижу только их данные. Это идеально.

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

Вот тело.

<body>
    <form id="form1" runat="server">
    <div id="wrapper" style="width: 110%">
        <div id="header">
            <UC:TopNav ID="TopNav" runat="server" />
        </div>
        <div class="hrDiv">
        </div>
        <div id="container">
            <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="True"
                Height="815px" ReportSourceID="CrystalReportSource1" Width="1023px" EnableDatabaseLogonPrompt="True"
                EnableParameterPrompt="False" HasToggleGroupTreeButton="False" PrintMode="PDF" />
            <CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
                <Report FileName="OrdersBooked.rpt">
                </Report>
            </CR:CrystalReportSource>
        </div>
        <div class="hrDiv">
        </div>
        <UC:Footer ID="Footer" runat="server" />
    </div>
    </form>
</body>

А вот код VB.

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports CrystalDecisions.Web
Imports System.web.Security


Partial Class Orders_Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init

        Dim fname As String
        fname = Request.PhysicalApplicationPath & "orders\OrdersBooked.rpt"
        Dim user As MembershipUser = Membership.GetUser()
        Dim un As String = user.UserName
        Dim pw As String = user.GetPassword("Tom")
        Dim sn As String = ConfigurationManager.AppSettings("SLXServerName")
        Dim dn As String = ConfigurationManager.AppSettings("SLXDatabaseName")

        ' Load the report
        Me.CrystalReportSource1.ReportDocument.Load(fname)

        Dim myReport As New ReportDocument
        myReport.Load(fname)

        Dim conninfo As New ConnectionInfo
        With conninfo
            .ServerName = sn
            .DatabaseName = dn
            .UserID = un
            .Password = pw
        End With
        myReport.DataSourceConnections.Clear()
        CrystalReportViewer1.ReportSource = myReport
        CrystalReportViewer1.PrintMode = CrystalDecisions.Web.PrintMode.Pdf
        SetDBLogonForReport(conninfo, myReport)

    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument)
        Dim myTables As Tables = myReportDocument.Database.Tables
        For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
            Dim MyTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
            MyTableLogonInfo.ConnectionInfo = myConnectionInfo
            myTable.ApplyLogOnInfo(MyTableLogonInfo)
        Next

    End Sub

End Class

Я пробовал отлаживать VB, и я вижу, что имя пользователя и пароль верны и, похоже, передаются в Crystal, но это просто не работает.

Любые идеи очень приветствуются.


person user3245915    schedule 30.08.2017    source источник
comment
Это тоже пользователь базы данных? кристалл сообщает о необходимости входа в базу данных с указанными вами учетными данными. Так, например, Том должен быть пользователем БД, который имеет как минимум право чтения в отчетах кристалла базы данных, которые читает   -  person Raphael    schedule 31.08.2017
comment
Да - это пользователи базы данных. Если я подключусь к базе данных через Crystal, используя учетные данные пользователей, а затем сохраню отчет, когда я выполню вышеуказанное, я получу данные этих пользователей. Если я сохраню отчет как администратор, а затем запустил вышеуказанное, я получу всех пользователей, независимо от того, с кем я вошел в систему. Имеет ли это смысл?   -  person user3245915    schedule 01.09.2017
comment
Хорошо, вы пытались вызвать SetDBLogonForReport () сразу после DataSourceConnections.Clear ()? Я думаю, это причина, по которой информация о подключении игнорируется   -  person Raphael    schedule 04.09.2017
comment
Я не пробовал, но просто попробовал и получил точно такие же результаты.   -  person user3245915    schedule 05.09.2017


Ответы (1)


Я заметил, что вам не хватает команды обновления, после того, как вы установили новый источник отчета, вы должны обновить отчет. Я бы так поменял последнюю часть init_page

myReport.DataSourceConnections.Clear()
SetDBLogonForReport(conninfo, myReport)
CrystalReportViewer1.ReportSource = myReport
CrystalReportViewer1.PrintMode = CrystalDecisions.Web.PrintMode.Pdf
CrystalReportViewer1.RefreshReport()
person Raphael    schedule 06.09.2017
comment
Я добавил эту строку, и VS показывает ее подчеркнутой и говорит, что Refresh не является членом CrystalDecisioins.Web.CrystalReportViewer - person user3245915; 07.09.2017
comment
Я также разместил этот вопрос в SAP и не могу найти там никакой радости. Не могу поверить, что это так сложно ... - person user3245915; 07.09.2017
comment
Я должен был видеть это раньше, но на самом деле это код .RefreshReport (), и, похоже, это сработало! - person user3245915; 07.09.2017
comment
Я должен был увидеть это раньше, чтобы сосредоточиться на проблеме настройки соединения ... - person Raphael; 08.09.2017