Nachfolgend finden Sie das von mir verwendete Verfahren (ich habe es spontan vereinfacht, indem wir unsere eigenen Objekte und globalen Variablen unterdrückt haben). Dieses Verfahren ermöglicht es, einen Bericht von einer ursprünglichen Verbindung, die zur Entwicklungszeit verwendet wurde, auf den aktiven SQL-Server umzuleiten. Es ist in VB geschrieben und verwendet 2 Hauptobjekte:
- Das ursprüngliche Berichtsobjekt, das durch eine Instanz von Crystal Report geöffnet wurde
- Eine ADODB-Verbindung, die die aktive Verbindung (namens P_currentConnection) zum aktuellen SQL-Server ist
Diese Funktion (könnte auch ein Sub sein) wird vor dem Anzeigen/Drucken des Berichtsobjekts in der Anwendung aufgerufen. Es kann beim Verteilen von Berichten auf replizierte Datenbanken verwendet werden, bei denen Benutzer je nach Standort eine Verbindung zu verschiedenen Servern/Datenbanken herstellen.
Public Function connectReportToDatabase( _
P_report As CRAXDRT.Report)
Dim table As CRAXDRT.DatabaseTable, _
For Each table In P_report.Database.tables
If table.DllName <> "crdb_ado.dll" Then
table.DllName = "crdb_ado.dll"
End If
table.ConnectionProperties.DeleteAll
table.ConnectionProperties.Add "Provider", P_currentConnection.Provider
table.ConnectionProperties.Add "Data source", P_currentConnection.Properties("Data source").Value
table.ConnectionProperties.Add "Database", P_currentConnection.DefaultDatabase
table.ConnectionProperties.Add "Integrated security", P_currentConnection.Properties("Integrated security").Value
table.ConnectionProperties.Add "Persist Security Info", P_currentConnection.Properties("Persist Security Info").Value
table.ConnectionProperties.Add "Initial Catalog", P_currentConnection.Properties("Initial Catalog").Value
table.SetTableLocation table.location, "", P_currentConnection.ConnectionString
table.TestConnectivity
Next table
Es kann mit einer Prozedur aufgerufen werden wie:
Dim crystal As CRAXDRT.Application, _
m_report as CRAXDRT.report
Set crystal = New CRAXDRT.Application
Set m_rapport = crystal.OpenReport(nameOfTheReport & ".rpt")
connectreportToDatabase(m_report)
Falls Ihr Bericht Unterberichte enthält, müssen Sie diese möglicherweise auch auf die aktive Verbindung umleiten. In diesem Fall müssen Sie alle Objekte in Ihrem Bericht durchsuchen, diejenigen überprüfen, die dem Berichtstyp entsprechen, und sie auf die neue Verbindung umleiten. Ich bin sicher, Sie werden Spaß daran haben, die entsprechenden zusätzlichen Zeilen zu dieser ursprünglichen Prozedur hinzuzufügen.