Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Neuzuordnung der Crystal Report-Datenquelle

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:

  1. Das ursprüngliche Berichtsobjekt, das durch eine Instanz von Crystal Report geöffnet wurde
  2. 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.