Инструмент настройки Crystal Reports - PullRequest
4 голосов
/ 20 апреля 2009

У меня есть отчет Crystal с 50 нечетными подотчетами, каждый из которых содержит множество параметров. Переключение с одной базы данных на другую занимает много времени, поскольку среда Crystal Reports IDE настаивает на том, чтобы вы вводили все параметры для каждого подотчета.

Мне интересно, можно ли написать быстрый инструмент на C # для просмотра текущей конфигурации базы данных всех вложенных отчетов в файле rpt и в идеале для переключения на другую базу данных.

К сожалению (или к счастью) у меня нет большого опыта в объектной модели Crystal - кто-нибудь знает, с чего начать?

Спасибо, Джон.

Ответы [ 3 ]

7 голосов
/ 20 апреля 2009

Это должно сделать работу. Очевидно, заменить пароли и имена пользователей, где это необходимо.

Private Sub ProcessFile(ByVal FileName As String)
        Dim CR As Engine.ReportDocument = Nothing
        Try
            CR = New Engine.ReportDocument
            CR.Load(FileName, CrystalDecisions.Shared.OpenReportMethod.OpenReportByDefault)

            'Recurse thru Report
            RecurseAndRemap(CR)
            'Save File
            CR.SaveAs("OutPutFilePath")

        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            If Not CR Is Nothing Then
                CR.Close()
                CR.Dispose()
            End If
        End Try
    End Sub

    Private Sub RecurseAndRemap(ByVal CR As Engine.ReportDocument)
        For Each DSC As CrystalDecisions.Shared.IConnectionInfo In CR.DataSourceConnections
            DSC.SetLogon("YourUserName", "YourPassword")
            DSC.SetConnection("YouServerName", "YourDatabaseName", False)
        Next

        CR.SetDatabaseLogon("YourUserName", "YourPassword")

        For Each Table As Engine.Table In CR.Database.Tables
            Table.LogOnInfo.ConnectionInfo.UserID = "YourUserName"
            Table.LogOnInfo.ConnectionInfo.Password = "YourPassword"
        Next

        If Not CR.IsSubreport Then
            For Each SR As Engine.ReportDocument In CR.Subreports
                RecurseAndRemap(SR)
            Next
        End If
    End Sub

Надеюсь, что помогает Cheers Бен

1 голос
/ 20 апреля 2009

В VB6 мы используем что-то вроде следующего (грязная копия-вставка из старого кода, постепенно обновляется с CR6 до CR9), возможно, вы можете получить некоторые идеи:

For Each tmpTable In Report.Database.Tables
  Set CPProperties = tmpTable.ConnectionProperties
  CPProperties.DeleteAll
  CPProperties.Add "Provider", "SQLOLEDB"
  CPProperties.Add "Data Source", mServerName
  CPProperties.Add "Initial Catalog", mBaseName
  CPProperties.Add "User ID", mUserID
  CPProperties.Add "Password", mPassword
  CPProperties.Add "Server Name", mServerName
  CPProperties.Add "Server Type", "OLEDB"
  CPProperties.Add "DataBase", mBaseName
  tmpTable.SetTableLocation tmpTable.Location, "", ""
Next tmpTable
For Each tmpSection In Report.Sections
    For Each tmpObject In tmpSection.ReportObjects
        If TypeName(tmpObject) = "ISubreportObject" Then
            Set tmpReport = tmpObject.OpenSubreport()
            For Each tmpTable In tmpReport.Database.Tables
              Set CPProperties = tmpTable.ConnectionProperties
              CPProperties.DeleteAll
              CPProperties.Add "Provider", "SQLOLEDB"
              CPProperties.Add "Data Source", mServerName
              CPProperties.Add "Initial Catalog", mBaseName
              CPProperties.Add "User ID", mUserID
              CPProperties.Add "Password", mPassword
              CPProperties.Add "Server Name", mServerName
              CPProperties.Add "Server Type", "OLEDB"
              CPProperties.Add "DataBase", mBaseName
              tmpTable.SetTableLocation tmpTable.Location, "", ""
            Next tmpTable
        End If
    Next tmpObject
Next tmpSection
0 голосов
/ 20 апреля 2009

Эксперимент, похоже, решил проблему:

    private void Form1_Load(object sender, EventArgs e)
    {
        ReportDocument rd = new ReportDocument();
        rd.Load("Report.rpt");

        Explore(rd);

        foreach (ReportDocument sr in rd.Subreports)
        {
            Explore(sr);
        }
    }

    private void Explore(ReportDocument r)
    {
        foreach (IConnectionInfo con in r.DataSourceConnections)
        {
            if (!r.IsSubreport)
                Console.WriteLine("Main Report");
            else
                Console.WriteLine(r.Name);
            Console.WriteLine(con.DatabaseName);
            Console.WriteLine("-");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...