Crystal Report Источник данных переназначение - PullRequest
0 голосов
/ 15 октября 2008

Я работаю с Crystal Reports и MS SQL Server. Мне нужно переназначить отчет Crystal, чтобы указать на другую базу данных на том же SQL Server. Есть ли автоматизированный способ сделать это, или я должен переназначить для каждого отдельного отчета? В настоящее время я делаю это, добавляя новое подключение к данным, а затем обновляю хранимую процедуру указанным параметром для изменения базы данных (каталога). Кроме того, после переназначения .asp, который отображает отчет, вылетает примерно так:

Активные серверные страницы, 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

Однако он запускается, если я закомментирую последние два назначения.

Заранее спасибо.

С уважением, Сильвиу.

Ответы [ 2 ]

3 голосов
/ 20 октября 2008

Ниже вы найдете процедуру, которую я использую (я упростил ее на лету, подавив наши собственные объекты и глобальные переменные). Эта процедура позволяет перенаправить отчет из исходного соединения, используемого во время разработки, на активный сервер SQL. Он написан на VB и использует 2 основных объекта:

  1. Исходный объект отчета, открытый через экземпляр отчета Crystal
  2. ADODB-соединение, являющееся активным соединением (называемое P_currentConnection) с текущим сервером SQL

Эта функция (также может быть подпрограммой) вызывается перед просмотром / печатью объекта отчета в приложении. Его можно использовать при распределении отчетов между реплицированными базами данных, где пользователи, в зависимости от их местоположения, подключаются к различным серверам / базам данных.

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)

Если в ваш отчет включены вложенные отчеты, возможно, вам также придется перенаправить их на активное соединение. В этом случае вам придется просмотреть все объекты в вашем отчете, проверить те, которые относятся к типу отчета, и перенаправить их на новое соединение. Я уверен, что вам будет интересно добавить соответствующие дополнительные строки в эту оригинальную процедуру.

0 голосов
/ 16 октября 2008

Вы можете получить любую информацию из текущего отчета о соединении. Поэтому, если вы не меняете серверы, установите для переменной 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
...