- PR -

クリスタルレポート データ取得

1
投稿者投稿内容
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-10 15:21
いつもお世話になっております。

1つ質問があります。

現状、テーブルのデータをクリスタルレポートで表示させようとしていまして、そのプレビューフォームを使いまわそうとしています。

データセットを1つだけ用意して、データテーブルの値を T1,T2,T3・・・と作っていき、引数で渡された指定テーブルをselect文で抽出し、fillでデータセットに入れています。("SELECT ID AS DT1, 氏名 AS DT2, 住所 AS DT3・・・")

そのデータセットをバインドして表示させているのですが、単純なデータとかは、データセットを作る必要もないのかなと思いました。


なにか、いい方法がありましたらご教授お願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 16:17
引用:

どらさんの書き込み (2006-07-10 15:21) より:

データセットを1つだけ用意して、データテーブルの値を T1,T2,T3・・・と作っていき、引数で渡された指定テーブルをselect文で抽出し、fillでデータセットに入れています。("SELECT ID AS DT1, 氏名 AS DT2, 住所 AS DT3・・・")


本題とは関係のないところですが、このようなクエリは書く必要はないと思います。
DataSet に含まれる DataTable を 1 つ指定して渡せば良いのではないでしょうか?
(選択するために、DataSet にしているのですよね?)

引用:

そのデータセットをバインドして表示させているのですが、単純なデータとかは、データセットを作る必要もないのかなと思いました。
なにか、いい方法がありましたらご教授お願いいたします。


たとえば、汎用的な照会帳票のタイトルがその代表になりますよね。
(帳票によってタイトルは変わるが、DataSource に含めるべき内容ではない)

このように、DataSource に含めず、値を帳票に直接渡したい場合は、
式フィールド (FieldObject) に対して、値を設定することで可能となります。

「式フィールド」「FieldObject」 あたりで調べてみてください。

# タイトルは、"クリスタルレポート データ取得" になっていますが、
# CrystalReports 側が、'データを取得' する、というよりは、
# プログラム側から、CrystalReports 側に 'データを設定' するというイメージです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-10 17:14
返答ありがとうございます。

式フィールド (FieldObject) あたりをしらべたところ、

Dim crFormulaFieldDefinitions As FormulaFieldDefinitions
Dim crFormulaFieldDefinition As FormulaFieldDefinition
Dim LoopFormula As Integer
Dim FormulaName As String

crFormulaFieldDefinitions = rpt_pr.DataDefinition.FormulaFields
For LoopFormula = 0 To crFormulaFieldDefinitions.Count - 1
  crFormulaFieldDefinition = crFormulaFieldDefinitions.Item(LoopFormula)

FormulaName = crFormulaFieldDefinition.Name

Select Case FormulaName
Case "ID"
crFormulaFieldDefinition.Text = "文字列をいれる"
Case "氏名"
crFormulaFieldDefinition.Text = "文字列をいれる"

End Select
Next

というのがあったので、これを使ってみようと思います。

データセットでは、("SELECT ID AS DT1, 氏名 AS DT2, 住所 AS DT3・・・")の抽出ではなく、すべて抽出し、データセットの中身分だけ”文字列をいれる”というところに、当てはめる認識であってますか??

となると、デザインでデータセットはつくらず、すべてコードでもできるってことでしょうか?

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-07-10 17:38
引用:

どらさんの書き込み (2006-07-10 17:14) より:

式フィールド (FieldObject) あたりをしらべたところ、
(Snip Code)
というのがあったので、これを使ってみようと思います。


そのコードでは、すべてのフィールドを回していますよね。
決め打ちする場合は、以下のようなメソッドを作成します。

コード:

    Option Strict On

    Imports Cr = CrystalDecisions.CrystalReports.Engine

    Public Class CrystalReportsHelper

      #Region " [S] SetFormulaFieldsText メソッド "

        Public Shared Function SetFormulaFieldsText(ByVal oReportClass As Cr.ReportClass, ByVal stFieldName As String, ByVal stSetText As String) As Boolean
            Dim oReportObject As Cr.ReportObject = oReportClass.ReportDefinition.ReportObjects(stFieldName)

            ' 該当するフィールドが存在しない場合
            If oReportObject Is Nothing Then
                Return False
            End If

            Dim oFieldObject As Cr.FieldObject = DirectCast(oReportObject, Cr.FieldObject)
            Dim oFormulaField As Cr.FormulaFieldDefinition = DirectCast(oFieldObject.DataSource, Cr.FormulaFieldDefinition)

            oFormulaField.Text = """" & stSetText & """"
            Return True
        End Sub

      #End Region

    End Class


これは、「ミニマム コード」 ですから、例外処理は省いています。

引用:

データセットでは、("SELECT ID AS DT1, 氏名 AS DT2, 住所 AS DT3・・・")の抽出ではなく、すべて抽出し、データセットの中身分だけ”文字列をいれる”というところに、当てはめる認識であってますか??


いえ、DataSet には、DataTable を複数格納できますよね。
この DataTable を切り分けの単位としてみれば良いのではという意味でした。

# どうやら違う意味で受け取っていたようですね。

引用:

となると、デザインでデータセットはつくらず、すべてコードでもできるってことでしょうか?


ただ、型付 DataSet を使うことを強く推奨します。
アンバウンド レポート作成時には (デザイン時も) 必須です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-07-10 18:18
返答ありがとうございます。

すべてをまわすのではなく、あるものだけをまわすほうが、効率的ですね。

データセットも、必須とのことだったので、データセットを使い、式フィールドをつかったやりかたで、やってみようと思います。

まだまだ、修行不足で単純な質問をしてしまうかもしれませんが、よろしくお願いいたします。
丁寧な返答ありがとうございました。
1

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