Я работаю с Crystal Reports и MS SQL Server. Мне нужно переназначить кристаллический отчет, чтобы он указывал на другую базу данных на том же 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
Однако он запускается, если я закомментирую два последних присвоения.
Заранее спасибо.
Искренне Ваш, Сильвиу.





Вы можете получить любую информацию из информации о подключении текущего отчета. Поэтому, если вы не меняете серверы, установите переменную 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
Далее вы найдете процедуру, которую я использую (я упростил ее на лету, подавив наши собственные объекты и глобальные переменные). Эта процедура позволяет перенаправить отчет с исходного соединения, использованного во время разработки, на активный сервер SQL. Он написан на VB и использует 2 основных объекта:
Эта функция (также может быть вспомогательной) вызывается перед просмотром / печатью объекта отчета в приложении. Его можно использовать при распределении отчетов между реплицированными базами данных, где пользователи, в зависимости от своего местоположения, подключаются к разным серверам / базам данных.
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)
Если ваш отчет включает вложенные отчеты, возможно, вам также придется перенаправить их на активное соединение. В этом случае вам нужно будет просмотреть все объекты в вашем отчете, проверить те, которые относятся к типу отчета, и перенаправить их на новое соединение. Я уверен, что вам понравится добавление соответствующих дополнительных строк к этой исходной процедуре.
Какую версию Crystal Reports вы используете? Кроме того, какие инструменты у вас есть под рукой? ASP не идеален, если вам не нужно делать это на лету в веб-приложении.