- PR -

CrystalReportsをPDF出力する際に条件を指定する方法について

1
投稿者投稿内容
Nag
会議室デビュー日: 2004/06/29
投稿数: 5
投稿日時: 2004-09-19 19:01
いつもお世話になります。教えていただきたいのですが、
CrystalReportsをPDF出力する際に条件を指定する事は可能でしょうか?
例えば、次のような場合、CrystalReport1.rptのデータベースフィールドに
存在するテーブルの内容全件がPDFに出力されてしまいます。
該当データ(例えば得意先CDが"123456"のデータのみ)のみPDFに出力する
方法はないのでしょうか?
申訳ありませんが、CrystalReportsの事をあまり理解していませんので、
初歩的な質問かもしれませんが、よろしくお願いいたします。
*********************************************************************
Private Sub Button1_Click(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles Button1.Click

Dim report As New _
CrystalDecisions.CrystalReports.Engine.ReportDocument()
Dim diskOpts As New _
CrystalDecisions.Shared.DiskFileDestinationOptions()

report.Load("D:\VBNET500\print290\CrystalReport1.rpt")

'エクスポート先のオプションを設定する。
diskOpts.DiskFileName = "D:\VBNET500\print290.pdf"
report.ExportOptions.DestinationOptions = diskOpts

'レポートをPDF形式でエクスポートする。
report.ExportOptions.ExportDestinationType = _
CrystalDecisions.Shared.ExportDestinationType.DiskFile
report.ExportOptions.ExportFormatType = _
CrystalDecisions.Shared.ExportFormatType.PortableDocFormat
report.Export()

MessageBox.Show("レポートをPDF形式で出力しました。", "結果通知")
End Sub
************************************************************************

Mercury21
会議室デビュー日: 2004/09/18
投稿数: 6
投稿日時: 2004-09-20 21:21
DataSetを作成して、Crystal Report Documentに設定します。

まず、Crystal Reportのログオン情報を設定し(CrystalDecisions.Shared.TableLogOnInfo)、データベース・テーブルの情報を設定します。(CrystalDecisions.CrystalReports.Engine.Table)
そして、バインドしたCrystal Reportドキュメントに対して必要なレコードだけを含んだDataSetを設定すれば、その情報だけを表示するレポートが表示されます。

Dim crDoc As New ReportDocument
Dim crTblLogonInfoCur As CrystalDecisions.Shared.TableLogOnInfo
Dim crReportTable As CrystalDecisions.CrystalReports.Engine.Table
Dim crParamFileds As ParameterFieldDefinitions
Dim crView As New CrystalDecisions.Web.CrystalReportViewer

Dim daReport As SqlDataAdapter
Dim dsReport As DataSet

Dim SQLStr As String
Dim strTableName As String

crDoc.Load("Reportのパス")
crView.ReportSource = crDoc

If m_SQLStr <> "" Then
daReport = New SqlDataAdapter(SQLStr, conReport)
dsReport = New DataSet

conReport.Open()
daReport.Fill(dsReport, strTableName)

conReport.Close()

crDoc.SetDataSource(dsReport)
End If

'あとはExportする
Nag
会議室デビュー日: 2004/06/29
投稿数: 5
投稿日時: 2004-09-21 01:35
教えていただき、ありがとうございます。
早速試してみたのですが、上手くいきませんでした。
結果的にサーバにエクスポートされたPDFファイルには得意先マスタの内容が全件出力されています。
@ソースが問題なのでしょうか?(データセットには対照分のデータのみセットされています。)
ACrystalReport側のデータベースフィールドが設定してあるのが問題なのでしょうか?
度々、申訳ありませんが、よろしくお願いいたします。
*************************************************************************************************
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim crDoc As New ReportDocument
Dim crExportOptions As ExportOptions
Dim crDiskFileDestinationOptions As DiskFileDestinationOptions
Dim Fname As String ' ファイル名

Dim daReport As SqlDataAdapter
Dim dsReport As DataSet
Dim SQLStr As String
Dim strTableName As String
Dim m_SQLStr As String
Dim connectionString As String = CType(ConfigurationSettings.AppSettings("SQLCon"), String)
Dim conReport As SqlConnection = New SqlConnection(connectionString)

Dim logOnInfo As New TableLogOnInfo
' レポート内のテーブルの接続情報を設定します。
logOnInfo.ConnectionInfo.ServerName = "○○○"
logOnInfo.ConnectionInfo.DatabaseName = "×××"
logOnInfo.ConnectionInfo.UserID = "△△△"
logOnInfo.ConnectionInfo.Password = ""
logOnInfo.TableName = "MST_TOKUISAKI"

crDoc.Load("c:\inetpub\wwwroot\WebApplication3\CrystalReport1.rpt")
m_SQLStr = "select * from MST_TOKUISAKI WHERE TokuisakiCd='150120'"

If m_SQLStr <> "" Then
daReport = New SqlDataAdapter(m_SQLStr, conReport)
dsReport = New DataSet

conReport.Open()
daReport.Fill(dsReport, "MST_TOKUISAKI")

conReport.Close()
crDoc.SetDataSource(dsReport)
End If
' サーバへエクスポート
Fname = "c:\exports\" & Page.Session.SessionID().ToString & ".pdf"
crDiskFileDestinationOptions = New DiskFileDestinationOptions
crDiskFileDestinationOptions.DiskFileName = Fname
crExportOptions = crDoc.ExportOptions
With crExportOptions
.DestinationOptions = crDiskFileDestinationOptions
.ExportDestinationType = ExportDestinationType.DiskFile
.ExportFormatType = ExportFormatType.PortableDocFormat
End With
crDoc.Export()
End Sub
*************************************************************************************************
Mercury21
会議室デビュー日: 2004/09/18
投稿数: 6
投稿日時: 2004-09-21 09:35
おそらく、Crystal Reportsのレポートに直接、DBとの接続が設定されているためでは無いでしょうか?
最初にレポートをデザインするとき、データスキーマでフィールドだけを定義しておき、そして実際に表示する段階でデータセットに表示するデータを取得し、それを設定してやるようにすると動くと思います。

まず、レポートを作成する段階でXMLデータスキーマ(.xsd)を定義します。VS.NET上でならドラッグ&ドロップで定義が作成できます。
そしてそれを基にしてレポートを作成します。

その空の(定義だけされた)レポートに先ほどのコードでデータを設定してやると必要なデータだけが表示されたレポートが表示されるはずです。
けに〜
会議室デビュー日: 2002/09/25
投稿数: 9
投稿日時: 2004-09-21 18:28
クリスタルレポートのデータアクセス方法には、プル型とプッシュ型があります。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlmn/html/crconreportdataaccess.asp

プル型では、クリスタルレポート側でデータを取得し
プッシュ型では.NET側でデータを取得するという違いがあります。

Mercury21さんが提案されているのは、「プッシュ型」での方法です。
Nagさんはここまでプル型で作成されているようですので
エクスポート前に以下のコードを追加されてはいかがでしょう?

crDoc.DataDefinition.RecordSelectionFormula= "{TokuisakiCd} = '150120'"
crDoc.Refresh()

もちろん、"{TokuisakiCd} = '150120'"の部分は動的に変化させてください。

参考になるとよいですが。
Nag
会議室デビュー日: 2004/06/29
投稿数: 5
投稿日時: 2004-09-21 23:12
Mercury21様、けに〜様ご返答ありがとうございます。
両方の方法を試してみて両方とも上手くいきました。
教えていただく前は、ワークファイルを作成するしかないかなー
と思っておりましたので、大変助かりました。
これからも、よろしくお願い致します。
1

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