2009-04-20 3 views
4

각기 다른 매개 변수가있는 50 개의 하위 보고서가있는 Crystal 보고서가 있습니다. Crystal Reports IDE는 각 하위 보고서의 모든 매개 변수를 입력해야하므로 한 데이터베이스에서 다른 데이터베이스로 전환하는 데는 시간이 오래 걸립니다.Crystal Reports 구성 도구

C#에서 빠른 도구를 작성하여 rpt 파일의 모든 하위 보고서의 현재 데이터베이스 구성을보고 이상적으로 다른 데이터베이스로 전환 할 수 있는지 궁금합니다.

불행히도 (또는 다행스럽게도) Crystal 개체 모델에 대한 많은 경험이 없습니다.

감사합니다. Jon. 실험의

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 
+1

당신은 운이 도움이

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 

희망) – dotjoe

답변

7

이 작업을 수행해야합니다. 분명히 암호와 사용자 이름을 대체해야합니다. 건배 벤

1

, 어쩌면 당신은 몇 가지 아이디어를 얻을 수 있습니다 :

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

감사 아르보 - 내가 같은 시간에 게시 무엇보다 완벽한 버전처럼 보인다. –

+0

예치하지만 리팩토링해야합니다. 레거시 VB6 코드, youknow ... 내가 말해야 할 한가지 - CR 오브젝트 모델 호환성은 버전보다 좋을 것 같습니다. 새로운 코드가 더 친숙한 것처럼 보일지라도, 내 코드는 여러 버전이 있으며 지금까지 작업 중입니다. – Arvo

0

비트 보인다 문제를 해결하기 위해 :

우리가 다음 (점진적 CR6에서 CR9으로 업데이트 더러운 복사 - 붙여 넣기 양식 예전의 코드) 같은 것을 사용 VB6에서