Crystal Report Datasource重新映射

时间:2008-10-15 13:00:45

标签: sql-server asp-classic crystal-reports

我正在使用Crystal Reports和MS SQL Server。 我需要重新映射晶体报告以指向同一SQL Server上的不同数据库。是否有自动执行此操作的方法,或者我是否必须重新映射每个报告?我目前正在通过添加新的数据连接,然后使用指定的参数更新存储过程来更改数据库(目录)。此外,重映射后,显示报告的.asp崩溃如下:

Active Server Pages,ASP 0115(0x80004005) 外部对象中发生了可捕获的错误(E06D7363)。该脚本无法继续运行。

代码是:

设置mainReportTableCollection = Session(“oRpt”)。Database.Tables

For Each mnTable in mainReportTableCollection
  With mnTable.ConnectionProperties
   .Item("user ID") = "<some_login_name>"
   .Item("Password") = "<some_password>"
   .Item("DSN") = "<some_DSN>"
   .Item("Database") ="<some_Database>"
  End With
Next

但是,如果我注释掉最后两个分配,它就会运行。

提前致谢。

你的真实,Silviu。

2 个答案:

答案 0 :(得分:3)

您将在此后找到我使用的程序(我在运行中简化它,抑制我们自己的对象和全局变量)。此过程允许将报表从开发时使用的原始连接重定向到活动SQL Server。它是用VB编写的,使用了两个主要对象:

  1. 通过水晶报告实例打开原始报告对象
  2. ADODB连接是当前SQL服务器的活动连接(称为P_currentConnection)
  3. 在查看/打印应用程序中的报表对象之前,将调用此函数(也可以是子函数)。在复制数据库之间分发报表时可以使用它,其中用户根据其位置连接到不同的服务器/数据库。

    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
    

    可以通过以下程序调用:

    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)
    

    如果您的报告包含子报告,您可能还必须将它们重定向到活动连接。在这种情况下,您必须浏览报表中的所有对象,检查报表类型的对象并将其重定向到新连接。我相信你会很乐意在这个原始程序中添加相应的额外行。

答案 1 :(得分:0)

您可以从当前报告连接信息中获取任何信息。因此,如果您不更改服务器,请将crystalServer变量设置为报告当前服务器。

'SET REPORT CONNECTION INFO
For i = 0 To rsource.ReportDocument.DataSourceConnections.Count - 1
    rsource.ReportDocument.DataSourceConnections(i).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword)
Next

For i = 0 To rsource.ReportDocument.Subreports.Count - 1
    For x = 0 To rsource.ReportDocument.Subreports(i).DataSourceConnections.Count - 1
        rsource.ReportDocument.OpenSubreport(rsource.ReportDocument.Subreports(i).Name).DataSourceConnections(x).SetConnection(crystalServer, crystalDB, crystalUser, crystalPassword)
    Next
Next