2009-04-20 26 views
4

私は50個の奇数サブレポートを持つCrystalレポートを持っており、それぞれにパラメータがあります。 Crystal Reports IDEでは、各サブレポートのすべてのパラメータを入力する必要があるため、データベースを別のデータベースに切り替えるには時間がかかります。Crystal Reports設定ツール

すべてのサブレポートの現在のデータベース設定をrptファイルに表示し、理想的には別のデータベースに切り替えるために、C#で簡単なツールを書くことができるのだろうかと思います。

私はCrystalオブジェクトモデルの経験はあまりありません。どこから始めたらいいですか?

ありがとう、 Jon。

我々は次の(インクリメンタルCR6からCR9に更新汚いコピーペースト状古いコード、)のようなものを使用VB6で
+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

、多分あなたは、いくつかのアイデアを得ることができます:実験の

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

ええ、リファクタリングが必要です。レガシーVB6コード、youknow ... 私は何を言わなければならないのですか?CRオブジェクトモデルのバージョンとの互換性はかなり良いようです。私のコードは古いバージョンであり、これまでのところ作業していますが、新しいメソッドはよりフレンドリーであるようです。 – Arvo

0

ビットは、問題を解決しているようです:

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("-"); 
     } 
    }