A continuación encontrará el procedimiento que uso (lo simplifiqué sobre la marcha, suprimiendo nuestros propios objetos y variables globales). Este procedimiento permite redirigir un informe desde una conexión original utilizada en el momento del desarrollo al servidor SQL activo. Está escrito en VB y utiliza 2 objetos principales:
- El objeto de informe original se abrió a través de una instancia de Crystal Report
- Una conexión ADODB que es la conexión activa (llamada P_currentConnection) al servidor SQL actual
Esta función (también podría ser una sub) se llama antes de ver/imprimir el objeto de informe en la aplicación. Se puede usar al distribuir informes entre bases de datos replicadas donde los usuarios, según su ubicación, se conectan a diferentes servidores/bases de datos.
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
Se puede llamar con un procedimiento como:
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)
En caso de que su informe incluya subinformes, es posible que también deba redirigirlos a la conexión activa. En este caso, deberá buscar todos los objetos en su informe, verificar los que son del tipo de informe y redirigirlos a la nueva conexión. Estoy seguro de que te divertirás agregando las líneas adicionales correspondientes a este procedimiento original.