いつもこちらの掲示板にはお世話になっています。
今回クリスタルレポートを使用して請求書の帳票を作成することになりました。項目のほとんどはレポート出力用に作成したテーブルのデータを使用することで表示できたのですが、金額の合計を出力する箇所を帳票の最終ページのみに出力してその他のページには出力しないような手法をとりたいのです。こういう場合はどのようにすればよいのでしょうか。
(環境) WinXP,VB.Net2003,クリスタルレポートヴァージョン9
こんにちは、じゃんぬ です。
式フィールドなんかを使うと、
> 任意項目への値設定
は確かにできますが。
> 金額の合計を出力する箇所を帳票の最終ページのみに出力して
これならば「レポート フッタ」でやるべき内容ですよね? (^^)
集計が絡むのならば、尚更だと思いますけど。
レスありがとうございます。
>これならば「レポート フッタ」でやるべき内容ですよね? (^^)
>集計が絡むのならば、尚更だと思いますけど。
確かに私もそう思ったのですが、帳票の見た目は全てのページを同じにしてなおかつ最終ページだけ金額の合計を出力したいのです。たとえば、ページフッターを最終ページだけ出さないようにしたりできるのでしょうか。もしできればページフッターとレポートフッターを同じレイアウトにすればうまくいきそうな気がするのですが。
レポート フッタが最後に 1 度しか出力されないことはご存知のようですね。
> ページフッターを最終ページだけ出さないようにしたりできるのでしょうか
CrystalReports では各セクションの書式で、非表示にする条件を指定できます。
じゃんぬねっとさんレスありがとうございます。
>CrystalReports では各セクションの書式で、非表示にする条件を指定できます。
具体的にはどのように記述すればよいのでしょうか。自分でも調べてみたのですがよくわかりませんでした。
かなり手取り足取り的な回答を求めて大変恐縮なのですがよろしくお願いします。
こんにちは、じゃんぬ です。
> 具体的にはどのように記述すればよいのでしょうか。
えっと、[セクションの書式] を見て書く場所はわかったんですね?
条件は最後の 1 件かどうかで良いでしょう。
OnLastRecord() あたりが使えるんじゃないでしょうか?
レスありがとうございます。
>OnLastRecord() あたりが使えるんじゃないでしょうか?
確かにこの記述でページフッターを非表示にはできましたが、レポートフッターがこの非表示なったページフッターの位置に出力されずに次ページに出力されてしまいました。セクションを隠すというやり方ではなく出力項目に対して、ある項目を最終ページのみ出力させるというやり方はできないのでしょうか。
こんにちは、じゃんぬ です。
> 次ページに出力されてしまいました
ありゃりゃ〜。
でもそれは「出力後に改ページ」のオプションにチェックがついてるからではないでしょうか? (未確認ですが)
# 流石に、そこまでは頭が回らなかったです。(--;)
> セクションを隠すというやり方ではなく出力項目に対して、
> ある項目を最終ページのみ出力させるというやり方はできないのでしょうか。
式フィールドでやる方法はありますが、集計が絡むとなるとお勧めできません。
(先にも書きましたが)
問題は同じレイアウトにしなければならないということなんですが、
「出力後に改ページ」に "同じ条件" を指定することで実現できればそれに越したことはないかなぁ...
式フィールドでやるのならば、
1. 積算合計フィールドで、その集計したい項目を作成する。
2. 式フィールドを以下のようにする
------------------------------------
If OnLastRecord Then
{1.で作った積算合計フィールド}
------------------------------------
こうすれば、最終レコードの時だけ {1.で作った積算合計フィールド} が表示されるハズです。
じゃんぬねっとさん、何度も回答ありがとうございます。
>でもそれは「出力後に改ページ」のオプションにチェックがついてるからで>はないでしょうか? (未確認ですが)
ページフッターのセクションの書式ですが「出力後に改ページ」がチェックがついた状態で非活性化されていました。
合計値のほうですが、レポートの積算を使用せずにレポート出力用編集テーブルの全レコードに値を入れておいて、その値を最終ページのみ表示させるという手法をとろうと思っています。それがうまくできればレポートフッターは作成せずに、ページフッターに該当項目を貼り付けておいて表示する・しないを制御できないかと思っているのですが、このようなことが可能なのでしょうか。
> 合計値のほうですが、レポートの積算を使用せずにレポート出力用編集テーブルの全レコードに値を入れておいて、
> その値を最終ページのみ表示させるという手法をとろうと思っています。
すいません、私が頑固なばっかりに遠回りさせてしまいましたね。
> ページフッターに該当項目を貼り付けておいて表示する・しないを
> 制御できないかと思っているのですが、このようなことが可能なのでしょうか。
ん? 先の回答でできるはずですが...。(^-^;)
ここで問題としているのは、VB 側から、式フィールドへ値を入れる方法についてでしょうか?
じゃんぬねっとさん、回答ありがとうございます。
>ん? 先の回答でできるはずですが...。(^-^;)
>ここで問題としているのは、VB 側から、式フィールドへ値を入れる方法につ>いてでしょうか?
・・・そのとおりです。VB側から式フィールドへ値をいれる方法も教えていただけるとありがたいのですが。
本当に1から10まで全てを聞いているようで申し訳ないのですがよろしくお願いします。
こんにちは、じゃんぬ です。
> ・・・そのとおりです。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 引数にセットしたい文字列を指定
# 例外処理とか、整合性のチェックとかやってませんので、適当に改造してください。
じゃんぬねっとさん、回答ありがとうございます。
早速テスト用に組み込んでみたのですが、
>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](クリスタルレポート)を第一引数として送っているせいなのかな位しか思いつきませんでした。
引数で送る内容に問題があるのでしたらそのあたりを教えてもらえないでしょうか。
# うーん、私の方では動いてるんですが...
> の部分で「指定されたキャストは有効ではありません」というエラーが発生してしまいました。
ここで、キャストミスですか... その前の段階ならまだしも...
考えられるのは、「式フィールドでない」くらいですかね。
式ウォッチでその辺り (実際の型は何なのか) くらいは解析して欲しかったんですが。。。
じゃんぬねっとさんレスありがとうございます。
>考えられるのは、「式フィールドでない」くらいですかね。
おっしゃるとおりでした。式フィールドを引数で送りなおしたら希望通りの動きができました。
親身に何度も回答していただいて大変ありがとうございました。