- PR -

Crystal Reportで動的にDBが変更されない

1
投稿者投稿内容
asahi
会議室デビュー日: 2004/06/28
投稿数: 17
投稿日時: 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の方は変更されていません。

また、他にも何か方法がありましたら教えていただきたく思っています。
何分初心者なもので、どうかよろしくお願いいたします。

(誤って他の会議室に書き込んでいたので移動してきました。すみませんでした。)
asahi
会議室デビュー日: 2004/06/28
投稿数: 17
投稿日時: 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/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 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
asahi
会議室デビュー日: 2004/06/28
投稿数: 17
投稿日時: 2004-07-06 09:35
えムナウさん、貴重な返答ありがとうございます。
分かりにくかったと大変反省しております。

*******************************************
データベースはどこにあるのですか?
サーバー・クライアントは同一マシンなのですか?
クライアントでアクセスのファイル名を与えてサーバーでレポートを作成してクライアントで見たいのでしょうか?
*******************************************

データベースはサーバ側においています。
MDBファイルを使用しています。
サーバとクライアントは別マシンです。
クライアントはサーバにノータッチディプロイメントでアクセスする方法をとっています。
クライアントでMDBファイル名を与えてサーバー側でレポートを作成してクライアントで見るようにしたいです。

*******************************************
サーバー・クライアントが別のマシンならサーバーからデータベースの内容をクライアントに返してクライアントでデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。
*******************************************

早速試してみようと思います。
また何かありましたらご教授お願いしたいと思います。
asahi
会議室デビュー日: 2004/06/28
投稿数: 17
投稿日時: 2004-07-06 11:29
早速試してみました。


*******************************************
サーバー・クライアントが別のマシンならサーバーからデータベースの内容をクライアントに返してクライアントでデータセットを作成して、プッシュ型でクリスタルレポートに渡しましょう。
*******************************************


ですが、サーバからデータベースの内容を取り出してクライアントでデータセットまで作成することまでできたのですが、これをどうやってWebサービスのクリスタルレポートに渡したらよいのか分かりません。
いろいろ調べてはいるのですが・・・。
すみませんが、どなたか教えてください。
よろしくお願いいたします。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-07-06 13:20
WindowsFormでWebサービスにアクセスしてクリレポに出せばいいんじゃないでしょうか?
わかる方引き続きお願いします。
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-07-06 18:23
Webアプリケーションにてこんな感じで「DataSetSend.Service1.DataSetRequest」から
帰ってくるデータセット(DataSetSend.DataSet1)をWebのクリレポで表示できました。
この例ではデータセットをWebサービスで返す前提で組んでますが、
極力構造体配列でデータの受け渡しをしたほうがいいと思います。

コード:

protected DataSetRecv.CrystalReport1 crystalReport11;
protected CrystalDecisions.Web.CrystalReportViewer CrystalReportViewer1;

private void Page_Load(object sender, System.EventArgs e)
{
// ページを初期化するユーザー コードをここに挿入します。
DataSetSend.Service1 service = new DataSetSend.Service1() ;
DataSetSend.DataSet1 dataSet1 = service.DataSetRequest() ;
crystalReport11 = new DataSetRecv.CrystalReport1() ;
crystalReport11.SetDataSource(dataSet1) ;
CrystalReportViewer1.ReportSource = crystalReport11 ;
CrystalReportViewer1.DataBind() ;
}



_________________
〜〜〜〜〜〜〜〜
えムナウ
http://www.geocities.jp/mnow
mnow@yahoo.co.jp
〜〜〜〜〜〜〜〜

[ メッセージ編集済み 編集者: えムナウ 編集日時 2004-07-06 18:27 ]
asahi
会議室デビュー日: 2004/06/28
投稿数: 17
投稿日時: 2004-07-07 09:07
えムナウさん、度々ありがとうございます。
大変助かりました。

やっと形にすることができました。
まだまだ疑問に思うところがありますが、自分で勉強してみたいと思います。
また、何かありましたらよろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)