クリスタルレポートの任意項目への値設定

解決


デンデン  2005-03-25 19:20:25  No: 120470  IP: [192.*.*.*]

いつもこちらの掲示板にはお世話になっています。

今回クリスタルレポートを使用して請求書の帳票を作成することになりました。項目のほとんどはレポート出力用に作成したテーブルのデータを使用することで表示できたのですが、金額の合計を出力する箇所を帳票の最終ページのみに出力してその他のページには出力しないような手法をとりたいのです。こういう場合はどのようにすればよいのでしょうか。

(環境) WinXP,VB.Net2003,クリスタルレポートヴァージョン9

編集 削除
じゃんぬねっと  URL  2005-03-26 10:08:11  No: 120471  IP: [192.*.*.*]

こんにちは、じゃんぬ です。

式フィールドなんかを使うと、

> 任意項目への値設定

は確かにできますが。

> 金額の合計を出力する箇所を帳票の最終ページのみに出力して

これならば「レポート フッタ」でやるべき内容ですよね? (^^)
集計が絡むのならば、尚更だと思いますけど。

編集 削除
デンデン  2005-03-26 23:02:43  No: 120472  IP: [192.*.*.*]

レスありがとうございます。

>これならば「レポート フッタ」でやるべき内容ですよね? (^^)
>集計が絡むのならば、尚更だと思いますけど。

確かに私もそう思ったのですが、帳票の見た目は全てのページを同じにしてなおかつ最終ページだけ金額の合計を出力したいのです。たとえば、ページフッターを最終ページだけ出さないようにしたりできるのでしょうか。もしできればページフッターとレポートフッターを同じレイアウトにすればうまくいきそうな気がするのですが。

編集 削除
じゃんぬねっと  URL  2005-03-28 10:24:26  No: 120473  IP: [192.*.*.*]

レポート フッタが最後に 1 度しか出力されないことはご存知のようですね。

> ページフッターを最終ページだけ出さないようにしたりできるのでしょうか

CrystalReports では各セクションの書式で、非表示にする条件を指定できます。

編集 削除
デンデン  2005-03-29 10:39:13  No: 120474  IP: [192.*.*.*]

じゃんぬねっとさんレスありがとうございます。

>CrystalReports では各セクションの書式で、非表示にする条件を指定できます。

具体的にはどのように記述すればよいのでしょうか。自分でも調べてみたのですがよくわかりませんでした。

かなり手取り足取り的な回答を求めて大変恐縮なのですがよろしくお願いします。

編集 削除
じゃんぬねっと  URL  2005-03-29 13:11:32  No: 120475  IP: [192.*.*.*]

こんにちは、じゃんぬ です。

> 具体的にはどのように記述すればよいのでしょうか。

えっと、[セクションの書式] を見て書く場所はわかったんですね?
条件は最後の 1 件かどうかで良いでしょう。
OnLastRecord() あたりが使えるんじゃないでしょうか?

編集 削除
デンデン  2005-03-29 14:41:14  No: 120476  IP: [192.*.*.*]

レスありがとうございます。

>OnLastRecord() あたりが使えるんじゃないでしょうか?

確かにこの記述でページフッターを非表示にはできましたが、レポートフッターがこの非表示なったページフッターの位置に出力されずに次ページに出力されてしまいました。セクションを隠すというやり方ではなく出力項目に対して、ある項目を最終ページのみ出力させるというやり方はできないのでしょうか。

編集 削除
じゃんぬねっと  URL  2005-03-29 15:06:12  No: 120477  IP: [192.*.*.*]

こんにちは、じゃんぬ です。

> 次ページに出力されてしまいました

ありゃりゃ〜。
でもそれは「出力後に改ページ」のオプションにチェックがついてるからではないでしょうか? (未確認ですが)

# 流石に、そこまでは頭が回らなかったです。(--;)

> セクションを隠すというやり方ではなく出力項目に対して、
> ある項目を最終ページのみ出力させるというやり方はできないのでしょうか。

式フィールドでやる方法はありますが、集計が絡むとなるとお勧めできません。
(先にも書きましたが)

問題は同じレイアウトにしなければならないということなんですが、
「出力後に改ページ」に "同じ条件" を指定することで実現できればそれに越したことはないかなぁ...

編集 削除
じゃんぬねっと  URL  2005-03-29 15:09:20  No: 120478  IP: [192.*.*.*]

式フィールドでやるのならば、

  1. 積算合計フィールドで、その集計したい項目を作成する。
  2. 式フィールドを以下のようにする

------------------------------------
If OnLastRecord Then
    {1.で作った積算合計フィールド}
------------------------------------

こうすれば、最終レコードの時だけ {1.で作った積算合計フィールド} が表示されるハズです。

編集 削除
デンデン  2005-03-29 16:07:32  No: 120479  IP: [192.*.*.*]

じゃんぬねっとさん、何度も回答ありがとうございます。

>でもそれは「出力後に改ページ」のオプションにチェックがついてるからで>はないでしょうか? (未確認ですが)

ページフッターのセクションの書式ですが「出力後に改ページ」がチェックがついた状態で非活性化されていました。

合計値のほうですが、レポートの積算を使用せずにレポート出力用編集テーブルの全レコードに値を入れておいて、その値を最終ページのみ表示させるという手法をとろうと思っています。それがうまくできればレポートフッターは作成せずに、ページフッターに該当項目を貼り付けておいて表示する・しないを制御できないかと思っているのですが、このようなことが可能なのでしょうか。

編集 削除
じゃんぬねっと  URL  2005-03-29 17:53:00  No: 120480  IP: [192.*.*.*]

> 合計値のほうですが、レポートの積算を使用せずにレポート出力用編集テーブルの全レコードに値を入れておいて、
> その値を最終ページのみ表示させるという手法をとろうと思っています。

すいません、私が頑固なばっかりに遠回りさせてしまいましたね。

> ページフッターに該当項目を貼り付けておいて表示する・しないを
> 制御できないかと思っているのですが、このようなことが可能なのでしょうか。

ん? 先の回答でできるはずですが...。(^-^;)
ここで問題としているのは、VB 側から、式フィールドへ値を入れる方法についてでしょうか?

編集 削除
デンデン  2005-03-29 18:25:19  No: 120481  IP: [192.*.*.*]

じゃんぬねっとさん、回答ありがとうございます。

>ん? 先の回答でできるはずですが...。(^-^;)
>ここで問題としているのは、VB 側から、式フィールドへ値を入れる方法につ>いてでしょうか?

・・・そのとおりです。VB側から式フィールドへ値をいれる方法も教えていただけるとありがたいのですが。

本当に1から10まで全てを聞いているようで申し訳ないのですがよろしくお願いします。

編集 削除
じゃんぬねっと  URL  2005-03-29 19:32:34  No: 120482  IP: [192.*.*.*]

こんにちは、じゃんぬ です。

> ・・・そのとおりです。VB側から式フィールドへ値をいれる方法も教えていただけるとありがたいのですが。

じゃあ、そうやって書いておきましょうよ (^-^*)

> 本当に1から10まで全てを聞いているようで申し訳ないのですがよろしくお願いします。

いえいえ、好きで答えているだけですからお気になさらないようにしてください。

さて、式フィールドへの値の挿入ですが、

FormulaFieldDefinition クラス を使います。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfformulafielddefinitionclasstopic.asp

が、これだけじゃわかりませんので、ちょっと静的メソッドを作ってみました。

'/ 面倒なので Cr として省略させてください
Imports Cr = CrystalDecisions.CrystalReports.Engine

'/ あるクラス
Public Class 〜

  #Region "  式フィールドに値をセット  "

    Public Shared Sub SetFormulaFieldsText(ByVal hReport As Cr.ReportClass, ByVal nFieldName As String, ByVal nSetText As String)
        Dim hObject As Cr.ReportObject = hReport.ReportDefinition.ReportObjects(nFieldName)
        Dim hField  As Cr.FieldObject  = DirectCast(hObject, Cr.FieldObject)

        DirectCast(hField.DataSource, Cr.FormulaFieldDefinition).Text = """" & nSetText & """"
    End Sub

  #End Region

End Class

  ・第 1 引数に対象となる、ReportClass (ReportDocument) を指定
  ・第 2 引数に設定したい式フィールドの名前を指定
  ・第 3 引数にセットしたい文字列を指定

# 例外処理とか、整合性のチェックとかやってませんので、適当に改造してください。

編集 削除
デンデン  2005-03-30 09:36:59  No: 120483  IP: [192.*.*.*]

じゃんぬねっとさん、回答ありがとうございます。

早速テスト用に組み込んでみたのですが、

>DirectCast(hField.DataSource, Cr.FormulaFieldDefinition).Text >= """" & nSetText & """"

の部分で「指定されたキャストは有効ではありません」というエラーが発生してしまいました。

テストしたときのソースを以下に記述しておきます。

環境:WinXP、VB.net2003

 Private Sub CrystalReportViewer1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CrystalReportViewer1.Load

        Dim Repo As New CrystalReport2

        Dim ConnectionStr As String

        Dim DataAdapterStr As String

        Dim TblName As String

        Dim DataBaseSet As New DataBaseSet

        Dim DTSET As DataSet

        ConnectionStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                        "Data Source=G:\REPORT\REPORT.mdb;" & _
                        "Persist Security Info=False"

        DataAdapterStr = "select * from "

        'ここでじゃんぬねっとさんのクラスを使用しています
        FormulaTest.SetFormulaFieldsText(Repo, "Field1", "test")


        'データアダプタ構成クラス
        TblName = "WORK_REPO"
        DataBaseSet.DataViewSet(ConnectionStr, DataAdapterStr, TblName)

        'データセット
        DTSET = DataBaseSet.DataSetRe
        'レポートに連結
        Repo.SetDataSource(DTSET)
        'プレビュー
        CrystalReportViewer1.ReportSource = Repo

    End Sub

※クラスのソースはそのまま使用しました。

自分ではNEWしている[CrystalReport2](クリスタルレポート)を第一引数として送っているせいなのかな位しか思いつきませんでした。

引数で送る内容に問題があるのでしたらそのあたりを教えてもらえないでしょうか。

編集 削除
じゃんぬねっと  URL  2005-03-30 09:59:24  No: 120484  IP: [192.*.*.*]

# うーん、私の方では動いてるんですが...

> の部分で「指定されたキャストは有効ではありません」というエラーが発生してしまいました。

ここで、キャストミスですか... その前の段階ならまだしも...
考えられるのは、「式フィールドでない」くらいですかね。
式ウォッチでその辺り (実際の型は何なのか) くらいは解析して欲しかったんですが。。。

編集 削除
デンデン  2005-03-30 10:38:48  No: 120485  IP: [192.*.*.*]

じゃんぬねっとさんレスありがとうございます。

>考えられるのは、「式フィールドでない」くらいですかね。

おっしゃるとおりでした。式フィールドを引数で送りなおしたら希望通りの動きができました。

親身に何度も回答していただいて大変ありがとうございました。

編集 削除