- - PR -
Crystal Reportで動的にDBが変更されない
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-06-28 10:57
はじめまして、asahiです。
いつも参考にさせていただいています。 Crystal ReportをWebサービスにして、Windowsアプリケーションで表示するプログラムを作成しています。 Crystal Reportに接続するDBを動的に変更したいのですが、変更されません。 行っているのは以下のとおりです。 『Windowsアプリケーション』 Public Class Form Inherits System.Windows.Forms.Form Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim cls As New localhost.ReportService() Dim ERR As String Dim f_MDB As String = "C:\\winreport\\report.mdb" Dim f_FILEPATH As String = "c:\\WebReport\\crystalreport.rpt" Dim f_PATH As String = "http://localhost/webreport/CrystalReportService.asmx" ERR = cls.Report_Load(f_MDB, f_FILEPATH) Me.CrystalReportViewer1.ReportSource = f_PATH End Sub End Class 『Webサービス』 Imports System.Web.Services Imports CrystalDecisions.Shared Imports CrystalDecisions.CrystalReports.Engine <WebService(Namespace:="http://tempuri.org/")> _ Public Class ReportService Inherits System.Web.Services.WebService <WebMethod()> Public Function Report_Load(ByVal DBName As String, ByVal FilePath As String) As String Dim report As New CrystalReport() Try report.Database.Tables.Item(0).Location = DBName report.Refresh() report.ReportOptions.EnableSaveDataWithReport = True report.SaveAs(FilePath, ReportFileFormat.VSNetFileFormat) report.Dispose() report.Close() Catch ex As Exception Return ex.Message End Try End Function End Class 開発環境はWindoows2000、.NET2002(VisualBasic)、ACCESS2000、.NETFramework1.1です。 いったん変更内容を保存してから表示するといった流れで考えて作っていますが、Crystal reportの方は変更されていません。 また、他にも何か方法がありましたら教えていただきたく思っています。 何分初心者なもので、どうかよろしくお願いいたします。 (誤って他の会議室に書き込んでいたので移動してきました。すみませんでした。) | ||||
|
投稿日時: 2004-06-29 09:48
他に何か方法がないだろうかと思い考えたのですが、エラーが生じてしまいました。
考え方はReportDocumentを返して、それをビューで表示しようとしてみました。 『Windowsアプリケーション』 Public Class Form Inherits System.Windows.Forms.Form Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim cls As New localhost.ReportService() Dim f_MDB As String = "C:\winreport\report.mdb" Dim Report As ReportDocument Report = cls.ReportRefresh(f_MDB) Me.CrystalReportViewer1.ReportSource = Report End Sub End Class 『Webサービス』 Imports System.Web.Services Imports CrystalDecisions.Shared Imports CrystalDecisions.CrystalReports.Engine <WebService(Namespace:="http://tempuri.org/")> _ Public Class ReportService Inherits System.Web.Services.WebService <WebMethod()> Public Function ReportRefresh(ByVal DBName As String) As ReportDocument Dim report As New CrystalReport() report.Database.Tables.Item(0).Location = DBName Return report End Function End Class Webサービスを実行すると以下のエラーが表示されます。 ****************************************型 System.ComponentModel.ISite のメンバ System.ComponentModel.Component.Site はインターフェイスなのでシリアル化できません。 説明 : 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.NotSupportedException: 型 System.ComponentModel.ISite のメンバ System.ComponentModel.Component.Site はインターフェイスなのでシリアル化できません。 ソース エラー: 現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。 **************************************** どんなことでもいいので、教えてください。お願いします。 Crystal Reportがプレビューできないことには先に話が進まないのです。 よろしくお願いします。 | ||||
|
投稿日時: 2004-07-03 11:29
Webサービス は シリアル化可能なものしか返せませんが、ReportDocument は System.ComponentModel.Component の派生クラスなので、シリアル化できません。
これが、直接的な回答です。 あとは感じたことです。 やりたいことが伝わってこないのでレスポンスが無いのではないでしょうか? Webサービス を実行しているコンピュータ(サーバー) と Windowsアプリケーション を実行しているコンピュータ(クライアント)を考えて。 データベースはどこにあるのですか? サーバー・クライアントは同一マシンなのですか? クライアントでアクセスのファイル名を与えてサーバーでレポートを作成してクライアントで見たいのでしょうか? サーバー・クライアントは同一マシンなら、サーバー・クライアントにする必要はなく、『Windowsアプリケーション』でデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。 サーバー・クライアントが別のマシンならサーバーからデータベースの内容をクライアントに返してクライアントでデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。 両方ともクライアントに型指定されたデータセットを作成しておくと便利だと思います。 単語がわからないときはとりあえず検索エンジンで調べてみてください。 _________________ えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12 えムナウのプログラミングのページ Blog1 Blog2 | ||||
|
投稿日時: 2004-07-06 09:35
えムナウさん、貴重な返答ありがとうございます。
分かりにくかったと大変反省しております。 ******************************************* データベースはどこにあるのですか? サーバー・クライアントは同一マシンなのですか? クライアントでアクセスのファイル名を与えてサーバーでレポートを作成してクライアントで見たいのでしょうか? ******************************************* データベースはサーバ側においています。 MDBファイルを使用しています。 サーバとクライアントは別マシンです。 クライアントはサーバにノータッチディプロイメントでアクセスする方法をとっています。 クライアントでMDBファイル名を与えてサーバー側でレポートを作成してクライアントで見るようにしたいです。 ******************************************* サーバー・クライアントが別のマシンならサーバーからデータベースの内容をクライアントに返してクライアントでデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。 ******************************************* 早速試してみようと思います。 また何かありましたらご教授お願いしたいと思います。 | ||||
|
投稿日時: 2004-07-06 11:29
早速試してみました。
******************************************* サーバー・クライアントが別のマシンならサーバーからデータベースの内容をクライアントに返してクライアントでデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。 ******************************************* ですが、サーバからデータベースの内容を取り出してクライアントでデータセットまで作成することまでできたのですが、これをどうやってWebサービスのクリスタルレポートに渡したらよいのか分かりません。 いろいろ調べてはいるのですが・・・。 すみませんが、どなたか教えてください。 よろしくお願いいたします。 | ||||
|
投稿日時: 2004-07-06 13:20
WindowsFormでWebサービスにアクセスしてクリレポに出せばいいんじゃないでしょうか?
わかる方引き続きお願いします。 _________________ えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12 えムナウのプログラミングのページ Blog1 Blog2 | ||||
|
投稿日時: 2004-07-06 18:23
Webアプリケーションにてこんな感じで「DataSetSend.Service1.DataSetRequest」から
帰ってくるデータセット(DataSetSend.DataSet1)をWebのクリレポで表示できました。 この例ではデータセットをWebサービスで返す前提で組んでますが、 極力構造体配列でデータの受け渡しをしたほうがいいと思います。
_________________ 〜〜〜〜〜〜〜〜 えムナウ http://www.geocities.jp/mnow mnow@yahoo.co.jp 〜〜〜〜〜〜〜〜 [ メッセージ編集済み 編集者: えムナウ 編集日時 2004-07-06 18:27 ] | ||||
|
投稿日時: 2004-07-07 09:07
えムナウさん、度々ありがとうございます。
大変助かりました。 やっと形にすることができました。 まだまだ疑問に思うところがありますが、自分で勉強してみたいと思います。 また、何かありましたらよろしくお願いいたします。 |
1