2009-04-20 4 views
4

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

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

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

Thanks, Jon.

+1

Вам повезло;) – dotjoe

ответ

7

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

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 

Надежда, что помогает Приветствия Бен

1

В 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

Благодаря Арво - выглядит более полной версии, что я писал в то же время. –

+0

Yeh, но нужно реорганизовать. Устаревший код VB6, вы знаете ... Одно, что я должен сказать - совместимость объектной модели CR над версиями выглядит довольно хорошо. Мой код - это много версий старых и работает до сих пор, хотя более новые методы выглядят более дружелюбными. – Arvo

0

Bit экспериментов, кажется, решить эту проблему :

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("-"); 
     } 
    } 
Смежные вопросы