0

Crystal Reports と MS SQL Server を使用しています。同じ SQL Server 上の別のデータベースを指すように Crystal レポートを再マップする必要があります。これを行う自動化された方法はありますか?それとも、レポートごとに再マッピングする必要がありますか? 現在、新しいデータ接続を追加し、指定されたパラメーターでストアド プロシージャを更新してデータベース (カタログ) を変更することで、これを行っています。また、再マッピング後、レポートを表示する .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

ただし、最後の 2 つの割り当てをコメントアウトすると実行されます。

前もって感謝します。

敬具、シルヴィウ。

4

2 に答える 2

3

以下に、私が使用する手順を示します (私はその場で簡略化し、独自のオブジェクトとグローバル変数を抑制しました)。この手順により、開発時に使用された元の接続からアクティブな SQL サーバーにレポートをリダイレクトできます。これは VB で書かれており、2 つの主要なオブジェクトを使用します。

  1. Crystal レポートのインスタンスを通じて開かれた元のレポート オブジェクト
  2. 現在の SQL サーバーへのアクティブな接続 (P_currentConnection と呼ばれる) である ADODB 接続

この関数 (サブ関数の場合もあります) は、アプリケーションでレポート オブジェクトを表示/印刷する前に呼び出されます。ユーザーが場所に応じて異なるサーバー/データベースに接続する複製されたデータベース間でレポートを配布するときに使用できます。

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)

レポートにサブレポートが含まれている場合は、それらをアクティブな接続にリダイレクトする必要がある場合もあります。この場合、レポート内のすべてのオブジェクトを参照し、レポート タイプのものを確認して、それらを新しい接続にリダイレクトする必要があります。この元の手順に対応する余分な行を追加すると、きっと楽しいはずです。

于 2008-10-20T08:10:27.240 に答える
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
于 2008-10-16T15:23:48.490 に答える