Poniżej znajdziesz procedurę, której używam (uprościłem ją w locie, wyłączając nasze własne obiekty i zmienne globalne). Procedura ta pozwala na przekierowanie raportu z oryginalnego połączenia używanego w czasie tworzenia do aktywnego serwera SQL. Jest napisany w VB i używa 2 głównych obiektów:
- Oryginalny obiekt raportu otwarty przez instancję Crystal Report
- Połączenie ADODB będące aktywnym połączeniem (o nazwie P_currentConnection) do bieżącego serwera SQL
Ta funkcja (może być również podrzędną) jest wywoływana przed wyświetleniem/wydrukowaniem obiektu raportu w aplikacji. Może być używany podczas dystrybucji raportów między zreplikowanymi bazami danych, w których użytkownicy, w zależności od ich lokalizacji, łączą się z różnymi serwerami/bazami danych.
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
Można go wywołać za pomocą procedury takiej jak:
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)
Jeśli raport zawiera podraporty, konieczne może być również przekierowanie ich do aktywnego połączenia. W takim przypadku będziesz musiał przejrzeć wszystkie obiekty w swoim raporcie, sprawdzić te, które są typu raport i przekierować je do nowego połączenia. Jestem pewien, że będziesz się dobrze bawić dodając odpowiednie dodatkowe linie do tej oryginalnej procedury.