Переназначение источника данных Crystal Report

Я работаю с 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

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

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

Искренне Ваш, Сильвиу.

Какую версию Crystal Reports вы используете? Кроме того, какие инструменты у вас есть под рукой? ASP не идеален, если вам не нужно делать это на лету в веб-приложении.

Pittsburgh DBA 15.10.2008 18:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
5 147
2

Ответы 2

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

  1. Исходный объект отчета открыт через экземпляр Crystal Report
  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)

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

Другие вопросы по теме