はじめまして、助けてください!
[環境]
OS: Windows Vista SP1
データベース: Oracle 10g
IDE: Visual Studio 2008 Professional Edition(Visual Basic 2008)
Crystal Reports XI R2 SP5
以上の環境でクリスタルレポートで作成したレポートを
アプリケーション上で表示させたいのですが
色々試したのですが、データベースのログイン画面が表示され
毎回パスワード入力しないと、レポートがリフレッシュされません。
どうにかして、パスワード入力せづに、レポート表示したいのですが
方法はあるでしょうか?
以下が現在のコードです。
フォーム上にCrystalReportDocument、CrystalReportViewer、Button
コンポーネントを配置
ButtonコンポーネントのClickイベントに以下の記述をしました。
'クリスタルレポート定義
Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
CrystalReportViewer1.ReportSource = reportDocument1
' 印字するレポートファイルの指定
rpt.Load("C:\TEST.RPT")
Dim logOnInfo As New CrystalDecisions.Shared.TableLogOnInfo
logOnInfo = rpt.Database.Tables.Item(0).LogOnInfo
Dim connectionInfo As New CrystalDecisions.Shared.ConnectionInfo
connectionInfo = rpt.Database.Tables.Item(0).LogOnInfo.ConnectionInfo
' 接続パラメータを設定
connectionInfo.DatabaseName = "oracle10"
connectionInfo.ServerName = "Microsoft OLE DB Provider for Oracle"
connectionInfo.UserID = "scott"
connectionInfo.Password = "tiger"
'ログオン情報を適用
rpt.Database.Tables.Item(0).ApplyLogOnInfo(logOnInfo)
CrystalReportViewer1.Refresh()
長文で大変申し訳ありませんが、助けてください!
お願い致します。
.NET 版の Crystal Reports は使った事も調べた事も無いので、
外しているかも知れませんが、コードを見て気になった点を:
> 'クリスタルレポート定義
> Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument()
> CrystalReportViewer1.ReportSource = reportDocument1
>
> ' 印字するレポートファイルの指定
> rpt.Load("C:\TEST.RPT")
CrystalReportViewer1 に渡しているのは、「reportDocument1」ですが、
"C:\TEST.RPT" を読み込んでいるのは、変数「rpt」なのですよね。
rpt に対しては、接続パラメータを調整しているようですが、それと
CrystalReportViewer1 とは関連付けられていないように見えますが、
これが原因という事はありませんか?
> Dim logOnInfo As New CrystalDecisions.Shared.TableLogOnInfo
> logOnInfo = rpt.Database.Tables.Item(0).LogOnInfo
上記のコードで、「New」は余計だと思います。上記のコードですと、
(1)「New」で TableLogOnInfo を生成し、それを変数 logOnInfo に割り当てる。
(2) (1) で生成した変数を使うこと無く破棄して、変わりに .LogOnInfo プロパティの値をセット。
という事になってしまいますので。
> Dim connectionInfo As New CrystalDecisions.Shared.ConnectionInfo
> connectionInfo = rpt.Database.Tables.Item(0).LogOnInfo.ConnectionInfo
こちらも同様で、「New」が余計だと思います。
魔界の仮面弁士さん、お返事ありがとうございます。
>rpt に対しては、接続パラメータを調整しているようですが、それと
>CrystalReportViewer1 とは関連付けられていないように見えますが、
>これが原因という事はありませんか?
色々なサイトをみて、理解半分(1/3?)でコーディングしています。
どのように関連付けすれば良いのでしょうか?
> 色々なサイトをみて、理解半分(1/3?)でコーディングしています。
私は仕様さえ知らないので、あっちむいて ほい!さんのコードから
推測しただけですが、おそらくは名前からして、reportDocument1 は
rpt 同様に「ReportDocument型」であるのでしょうから、
CrystalReportViewer1.ReportSource = reportDocument1
ではなく、
CrystalReportViewer1.ReportSource = rpt
にする必要があるだろうと予想しています。
もしくは、「Dim rpt As 〜」の変数宣言を一切行わずに、
reportDocument1 に対して処理すれば良いかも知れません。
魔界の仮面弁士さん、早々のご回答ありがとうございます。
おっしゃる通り修正したところ
「レポートのロードに失敗しました。」というエラーになりました。
OKボタンを押すと「レポートファイルパスが無効です。」となり
もう1回OKボタンを押すとまた「レポートファイルパスが無効です。」
と表示されます。
rpt.Load("C:\TEST.RPT")の記述では駄目なのでしょうか?
ステップ実行すると
rpt.Load("C:\TEST.RPT")
↑の行で「レポートのロードに失敗しました。」という
エラーが表示されます。
なにが、足りないのでしょうか?
> ステップ実行すると
> rpt.Load("C:\TEST.RPT")
> ↑の行で「レポートのロードに失敗しました。」という
> エラーが表示されます。
Load の処理は、最初のコードにもありましたが、
その当時は、そのエラーは出ていなかったのですよね。
その当時と今とで、変数 rpt に対して何か違う処理を行っていますか?
(以前のコードに戻したら、そのエラーは出なくなりますか?)
あるいは、その TEST.RPT ファイルが破損していたり、
アプリの実行ユーザーが、そのファイルへのアクセス権を
有していない…という可能性はありませんか?
魔界の仮面弁士さん、ご回答ありがとうございます。
>Load の処理は、最初のコードにもありましたが、
>その当時は、そのエラーは出ていなかったのですよね。
はい。 同様のエラーがでておりました。
>あるいは、その TEST.RPT ファイルが破損していたり、
破損はございません。
>アプリの実行ユーザーが、そのファイルへのアクセス権を
>有していない…という可能性はありませんか?
アクセス権はございます。
どこが、へんなんでしょうか?
>> Load の処理は、最初のコードにもありましたが、
>>その当時は、そのエラーは出ていなかったのですよね。
> はい。
当時はエラーが出ていなかったのですね。
> 同様のエラーがでておりました。
当時からエラーが出ていたのですね。
…どうも話が噛み合っていないように感じるので、再度確認しますが、
2010/02/24 16:27:55 の質問時点で、Load メソッドによる
「レポートのロードに失敗しました。」のエラーが発生していたのでしょうか?
2010/02/24 16:27:55 のコードは、reportDocument1 を表示するコードで、
しかも Load メソッドは、reportDocument1 に対しては行われていません。
その状態で、(パスワード入力の必要があったにしても)帳票を表示できていたのなら、
そもそも Load メソッドを呼び出す必要は無く、単に TableLogOnInfo の調整を
(rpt ではなく) reportDocument1 に対して行うだけで良いのではないでしょうか。
> どこが、へんなんでしょうか?
ファイル自体に問題が無いのであれば、コード側の
「Load の呼び出し」「TableLogOnInfo の調整」「CrystalReportViewer への割り当て」
の呼び出し順をそれぞれ変えてみるとか。
魔界の仮面弁士さん、ご回答ありがとうございます。
>Load の処理は、最初のコードにもありましたが、
>その当時は、そのエラーは出ていなかったのですよね。
お返事が不適切で申し訳ありませんでした。
はじめから、エラーがでていました。
呼び出し順番を色々変更しましたが、動作しませんでした。
魔界の仮面弁士さん、何度もお手数おかけしております。
なかなか、うまくいかないので、ネットで色々探していたら
以下のようなコーディングが記載されていました。
*************************************************
' CrystalReportsオブジェクトの生成
Dim Report As CrystalDecisions.CrystalReports.Engine.ReportDocument
Report = New CrystalDecisions.CrystalReports.Engine.ReportDocument
Dim sReportFile As String = "C:\TEST.RPT"
Report.Load(sReportFile,CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy)
'// プレビュー表示 //
Dim frmPreview As New Form1
frmPreview.CrystalReportViewer1.ReportSource = sReportFile
' レポート内のテーブルの接続情報を設定
Dim logOnInfo As New CrystalDecisions.Shared.TableLogOnInfo
logOnInfo.ConnectionInfo.ServerName = "@@@"
logOnInfo.ConnectionInfo.DatabaseName = "@@@"
logOnInfo.ConnectionInfo.UserID = "@@@"
logOnInfo.ConnectionInfo.Password = "@@@"
logOnInfo.TableName = "@@@"
' logOnInfosコレクションにlogOnInfoオブジェクトを追加します。
frmPreview.CrystalReportViewer1.LogOnInfo.Add(logOnInfo)
For Each Table As CrystalDecisions.CrystalReports.Engine.Table In Report.Database.Tables
' logOnInfosコレクションにlogOnInfoを追加
Table.ApplyLogOnInfo(logOnInfo)
Next
' ビューアーの表示
frmPreview.Show()
**********************************************************
実行したところForm1のボタンをClickすると
もう1枚Form1が表示され、そのなかにクリスタルレポートが表示されました。
ボタンをClickするとそのフォーム上でクリスタルレポートを表示
する方法はあるのでしょうか。
> なかなか、うまくいかないので、ネットで色々探していたら
製品付属のヘルプやサンプルには、参考になりそうな記述はありませんでしたか?
> 以下のようなコーディングが記載されていました。
別フォームが起動してしまうという問題が発生したものの、
当初の問題(Loadエラー、接続パスワードの件)は解決したという事でしょうか?
> 実行したところForm1のボタンをClickすると
> もう1枚Form1が表示され、そのなかにクリスタルレポートが表示されました。
何故そうなるのかは理解できていますでしょうか。
--------------
> Dim frmPreview As New Form1
ここで、Form1 が作られています。New はオブジェクトを生成するためのキーワードです。
> frmPreview.CrystalReportViewer1.ReportSource = sReportFile
そして sReportFile を、その生成した Form1 上のビューワーに割り当てて…
:
:
> frmPreview.Show()
最後に、その新規作成された Form1 を表示していますね。
--------------
> ボタンをClickするとそのフォーム上でクリスタルレポートを表示
> する方法はあるのでしょうか。
Click 時に Form1 を New するコードは不要なので、取り除いてください。
また、使用するビューワー(CrystalReportViewer1)も、新規フォームのものではなく、
自フォーム上の Me.CrystalReportViewer1 を利用するように書きなおせば良いと思います。
魔界の仮面弁士さん、長期にわたり、お付き合いいただきまして
ありがとうございます。
早速、試しましたところ、Form1は生成されませんでした・・・
しかし、データベースのログイン画面が表示され
パスワードの入力を催促されました。
コードにパスワードをコーディングしているのですが
何かおかしいのでしょうか?
直した個所は、以下の通りです。
①Dim frmPreview As New Form1 行を削除
②frmPreview. をMe. に変更
魔界の仮面弁士さん、大変お世話になりましたが、
やっと、イメージ通り動きました。
(ログイン画面もでなくなりました。)
追加したコードは
Me.Show()の後に
Me.CrystalReportViewer1.RefreshReport()を追加致しました。
本当にお世話になりましてありがとうございました。
また、何かありましたら、懲りずにお付き合いお願い致します。