@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

CrystalReports【RecordSelectionFormulaに関して】

1
投稿者投稿内容
めろん
会議室デビュー日: 2006/09/05
投稿数: 5
投稿日時: 2006-09-06 09:35
いつもお世話になっています。
今回初めて質問させて頂きます。

開発環境:
VB.NET 2003
CrystalReports for VS.NET
SQL Server 2000
ASP.NET

現在複数のCrystalReportsで作成したレポートをWEBで閲覧するアプリケーションを開発しています。

一部レポートにRecordSelectionFormulaを使用して表示するレコードに条件をつけているのですが、条件を指定したレポートを表示した後、
別のレポートを表示すると条件を指定した前のレポートのRecordSelectionFormulaが次に開いたレポートにも摘要されてしまい、
「フィールドがありません。」というエラーが発生してしまいます。

レポート表示部分のコード(Page_Loadイベントで実行しています):

Dim CrReportDocument As ReportDocument
Dim crDatabase As Database
Dim crTables As Tables
Dim crTable As Table
Dim crTableLogOnInfo As TableLogOnInfo
Dim crConnectionInfo As ConnectionInfo

CrReportDocument = New ReportDocument

CrReportDocument.Load(レポートの場所)

CrReportDocument.DataDefinition.RecordSelectionFormula = ""

Select Case ReportName
Case "レポート名"
CrReportDocument.DataDefinition.RecordSelectionFormula = "抽出条件"
End Select

CrReportDocument.Refresh()

crConnectionInfo = New ConnectionInfo

With crConnectionInfo
.ServerName = "Server"
.DatabaseName = "Name"
.UserID = "User"
.Password = "Pass"
End With

crDatabase = CrReportDocument.Database
crTables = crDatabase.Tables

For Each crTable In crTables
crTableLogOnInfo = crTable.LogOnInfo
crTableLogOnInfo.ConnectionInfo = crConnectionInfo
crTable.ApplyLogOnInfo(crTableLogOnInfo)
Next

CrystalReportViewer1.ReportSource = CrReportDocument
CrReportDocument.Refresh()
CrystalReportViewer1.DataBind()
CrystalReportViewer1.RefreshReport()
--------------------------------------------------------

またPage_Unloadイベントで、
CrReportDocument.Close
CrReportDocument.Dispose
を実行しています。

開発経験が浅く自分なりに色々調べてみたのですが、解決する事が出来ませんでした。
おかしな部分等ありましたら、ご指摘頂けますでしょうか。
よろしくお願いします。

[ メッセージ編集済み 編集者: めろん 編集日時 2006-09-06 09:36 ]
めろん
会議室デビュー日: 2006/09/05
投稿数: 5
投稿日時: 2006-09-07 09:10
自己解決しました。

CrystalReportViewer1.RecordSelectionFormula = "抽出条件"
とオブジェクトではなくビューアーに条件を設定することで正常に動作しました。

また、同じビューアーに違うレポートを連続して表示する場合、
CrystalReportViewer1.RecordSelectionFormula = ""
とブランクを入力しないと、別レポートの条件がリセットされないようです。

Windowsアプリの時は、こんな事しなくてもよかったような気がするのですが・・。

私の投稿を閲覧&検討して下さった皆様、ありがとうございました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-07 09:34
引用:

めろんさんの書き込み (2006-09-07 09:10) より:

また、同じビューアーに違うレポートを連続して表示する場合、
CrystalReportViewer1.RecordSelectionFormula = ""
とブランクを入力しないと、別レポートの条件がリセットされないようです。


同一のインスタンスであれば、そうなるのは当然でしょうね。
新しいインスタンスを使用しているのにも関わらずであれば、確かにヘンですね。

引用:

Windowsアプリの時は、こんな事しなくてもよかったような気がするのですが・・。


Page.Unload イベントの Close && Dispose メソッドは意味があるとお考えですか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
めろん
会議室デビュー日: 2006/09/05
投稿数: 5
投稿日時: 2006-09-07 10:14
ご返答ありがとうございます。
じゃんぬねっとさんのサイトや書き込みには大変お世話になっております。

>同一のインスタンスであれば、そうなるのは当然でしょうね。

同一インスタンスを使用しておりました・・・。
同じビューアーに違うレポートを表示するのではなく、
その都度インスタンスを作成するほうが良いのでしょうか?

>Page.Unload イベントの Close && Dispose メソッドは意味があるとお考えですか?

コンボボックスのAutoPostBackプロパティをTrueにして、
そこからレポート名を選択し表示するという流れになっています。

コンボボックスのアイテムを変えたときデバッグで
Load → Unload → 表示 という順番で動いていましたので、
Unloadのタイミングで一度Close && Dispose した方が良いのかと思いました。

レポートオブジェクトをCloase && Disposeするタイミングは、
どこで行うのがベストなのでしょうか?

未熟者な為おかしな事を書いているかもしれませんがご教授下さい。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-09-07 10:32
引用:

めろんさんの書き込み (2006-09-07 10:14) より:

同一インスタンスを使用しておりました・・・。
同じビューアーに違うレポートを表示するのではなく、
その都度インスタンスを作成するほうが良いのでしょうか?


いえ、自前で初期化をしてコストが減らせているのであれば、問題ないです。

引用:

コンボボックスのAutoPostBackプロパティをTrueにして、
そこからレポート名を選択し表示するという流れになっています。


なるほど、そういうことでしたか。

引用:

コンボボックスのアイテムを変えたときデバッグで
Load → Unload → 表示 という順番で動いていましたので、
Unloadのタイミングで一度Close && Dispose した方が良いのかと思いました。


特にこちら側では何もしなくても良いと思いますよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
めろん
会議室デビュー日: 2006/09/05
投稿数: 5
投稿日時: 2006-09-07 10:56
お忙しい中何度もありがとうございます。

>特にこちら側では何もしなくても良いと思いますよ。

.NET Frameworkが自動で解放してくれると言うことなのでしょうか?

サーバーのリソースをどんどん使用して行く事になるとまずいと思い、
解放のタイミングを色々考えていました。
1

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