DOBON.NET DOBON.NETプログラミング掲示板過去ログ

VB.NET内からクリレポ上のフィールドを参照したい

環境/言語:[VB.NET 2003 + くりれぽ]
分類:[.NET]

こんにちは。いつもお世話になっております。

前回の問題が解決したばかりなのでアレなのですが、
またもや、ぶちあたってしまいました・・・(汗
今回は、クリスタルレポート+VB.NETです。

1つのフォームに、
・検索条件を入力するためのオブジェクトがいくつか
・検索ボタン
・レポートを表示するためのビューア(クリレポについてくるやつ)
・表示されたレポートのページを移動するためのボタン2つ(前・次ページ)
が設置してあります。

検索ボタンのクリックで、
・条件を判断、SQLの生成
・レポートを作成、表示
の一連の処理が流れます。

レポートの表示まではすんなりと行くのですが、問題は・・・
前ページ・次ページのボタンの制御なのです。

1ページ目を見ているときは、前ページボタンは押下不可。
逆に、最後のページを見ているときは、次ページボタンは押下不可。
・・・としたいのです。

前ページボタンの制御は、
[ 現在のページが1ページ目かどうか ]
で判断できるのですが、最後のページの判断の方法に困っています。

クリレポ内に、総ページ数を吐き出すフィールドを置いてみたのですが、
VB.NETのコード内からの参照ができません。
色々なところを漁ってみたのですが、見つけることが出来ませんでした。
(クリレポに値を渡す・・・ならあるのですが・・・)

こんな方法で成功した、こんな方法でできそうだ・・・などを教えて頂きたく、
今回もまた書き込みました。

よろしくお願いいたします_(._.)_


/*
 現在は、ビューアに表示すると同時に、
 無理やり最終ページへ移動させ、そのページのページ数を保存し
 使用しています。
 これだと、思ったとおりの動きはしてくれるのですが、
 画面がチラチラしてしまうのが気になるし、
 方法としては微妙な気がしたので・・・。
*/
こんにちは、じゃんぬねっと です。
タイトルと質問内容が一致してないような... (^-^;)
CrystalReports のバージョンを書いておいた方が良いでしょうね。

■No8513に返信(あのねさんの記事)
> レポートの表示まではすんなりと行くのですが、問題は・・・
> 前ページ・次ページのボタンの制御なのです。
> 1ページ目を見ているときは、前ページボタンは押下不可。
> 逆に、最後のページを見ているときは、次ページボタンは押下不可。
> ・・・としたいのです。

TotalPageCount について調べてみてください。
但し、合計ページのカウントは非同期に行われるので、正しい値が返らないかもしれません。



   /*******************************************
     * @Remarks    じゃんぬねっと
     * @Homepage  http://f57.aaa.livedoor.jp/~jeanne/
     * @Blog        http://www.ailight.jp/blog/jeanne/
     *******************************************/
おはようございます。

> タイトルと質問内容が一致してないような... (^-^;)
う・・・うわぁ(汗
フィールドの値を参照できたらすぐなのに・・・とモヤモヤしながら
書いたらこんな題名に^^;
お恥ずかしい限りです(-"-;)


> CrystalReports のバージョンを書いておいた方が良いでしょうね。
CrystalReports9です。
(参照の追加で見えるバージョンで良いのでしょうか?)


> TotalPageCount について調べてみてください。
> 但し、合計ページのカウントは非同期に行われるので、
>正しい値が返らないかもしれません。

TotalPageCountに関しては見つけていましたが、
詳しい使い方が分からず四苦八苦しています。
クリレポの中(rptファイル)では、関数として使えるし
正しい値も取れています。
・・・が、.NETのコードから、プロパティや関数として
使用することができていません。

色々と用語を組み合わせながら、あちこちで検索をかけてみたのですが、
分かりやすい解説に出会えず・・。

参考となるサイト等ををご存知でしたら、是非教えて頂きたいです。

よろしくお願いします_(._.)_
じゃんぬねっと です。

■No8521に返信(あのねさんの記事)
> CrystalReports9です。
> (参照の追加で見えるバージョンで良いのでしょうか?)
ええ、十分だと思いますよ。

> クリレポの中(rptファイル)では、関数として使えるし正しい値も取れています。
> ・・・が、.NETのコードから、プロパティや関数として使用することができていません。
RPT ファイル と .NET からのソースは切り離して考えてください (^-^*)

> ----------------------------------------------------
> > TotalPageCount について調べてみてください。
> > 但し、合計ページのカウントは非同期に行われるので、
> > 正しい値が返らないかもしれません。
> ----------------------------------------------------
特殊フィールドの総ページ数を配置しておいて、
そのフィールドを取得するという手もあります。

> 色々と用語を組み合わせながら、あちこちで検索をかけてみたのですが、
> 分かりやすい解説に出会えず・・。
> 参考となるサイト等ををご存知でしたら、是非教えて頂きたいです。
確かに、参考になるサイトはないですね... (^-^;)
ありがとうございます。

> 特殊フィールドの総ページ数を配置しておいて、
> そのフィールドを取得するという手もあります。

これは色々と試してみたのですが、やり方が悪いのか
取得できませんでした(-"-;)
>--------------------------------------------------
> クリレポ内に、総ページ数を吐き出すフィールドを置いてみたのですが、
> VB.NETのコード内からの参照ができません。
> 色々なところを漁ってみたのですが、見つけることが出来ませんでした。
> (クリレポに値を渡す・・・ならあるのですが・・・)
>--------------------------------------------------
の部分がこれにあたります。

取得できるような事をちらほらと見かけたりはするので、
やり方が間違ってるんだろうなぁ・・・。
もうちょい探してみます(´・ω・`)

引き続き、助言等、お待ちしております_(._.)_
じゃんぬねっと です。

■No8523に返信(あのねさんの記事)
> これは色々と試してみたのですが、やり方が悪いのか
> 取得できませんでした(-"-;)

こちらも参照したのでしょうか?
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfspecialvarfielddefinitionclasstopic.asp
> こちらも参照したのでしょうか?
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfparameterfielddefinitionsclasstopic.asp

もちろん見ました。
(というか、検索したらココしか・・・(泣))

これの使い方が分からず、色々と試してるところでした^^;
じゃんぬねっと です。

■No8526に返信(あのねさんの記事)
> もちろん見ました。
> (というか、検索したらココしか・・・(泣))
> これの使い方が分からず、色々と試してるところでした^^;

あ、パラメタフィールドではなく、特殊フィールドの方ですね。
サンプルコードもついてますが、如何でしょう? (^-^;)
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfspecialvarfielddefinitionclasstopic.asp
ありがとうございます。

以下の要領で無事出力されました。
'↓----------------------------------------------------------
 '----------------------------------------------------------
  ・クリレポに[特殊フィールド]から、[合計ページ数]をそのまま貼りつける
  ・[合計ページ数]のプロパティで、名前を"TotalPageCnt"に設定
 '----------------------------------------------------------

 '----------------------------------------------------------
  Dim field As CrystalDecisions.CrystalReports.Engine.FieldObject
  Dim specialField As CrystalDecisions.CrystalReports.Engine.SpecialVarFieldDefinition
  Dim intPageCnt As Integer

  field = crHogeReport.ReportDefinition.ReportObjects.Item("TotalPageCnt")

  specialField = field.DataSource

  intPageCnt = CInt(specialField.SpecialVarType.TotalPageCount)
 '----------------------------------------------------------
'↑↓----------------------------------------------------------


問題は、
>[特殊フィールド]から・・・
の部分でした。

今まで、
 ・式フィールドを作成
 ・その中に"TotalPageCount"関数を指定
 ・それの名前を変更
して取得しようとしていました。
特殊フィールドの値は、妙なことをしなくても、そのまま扱えるんですね^^;
驚きです・・・。

>intPageCnt = CInt(specialField.SpecialVarType.TotalPageCount)
の部分、Cintがなかったら、"TotalPageCount"という値が出力されました。
無理やり変換させてよいものなんでしょうか??
じゃんぬねっと です。

■No8528に返信(あのねさんの記事)
> intPageCnt = CInt(specialField.SpecialVarType.TotalPageCount)
> の部分、Cintがなかったら、"TotalPageCount"という値が出力されました。
> 無理やり変換させてよいものなんでしょうか??

ん? SepecialVarType は列挙体ですぞ (w
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfspecialvartypeenumerationtopic.asp

それだと、ページ数ではなく、TotalPageCount の定数が返ってきますぞ。(^-^;)

要するに、

Private Enum EnumHoge
  Foo = 1
  TotalPageCount = 100
End Enum

だとする場合、いつも 100 が返ってくるわけでして... (^-^A)
> ん? SepecialVarType は列挙体ですぞ (w
> http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfspecialvartypeenumerationtopic.asp
>
> それだと、ページ数ではなく、TotalPageCount の定数が返ってきますぞ。(^-^;)

ぎゃ!?本当だ・・・。
別のテストデータでも同じ値出た・・・(ノ_・、)

『特殊フィールドのタイプを指定します。』
ってなってるけど、
『TotalPageCount フィールドは、レポートの総ページ数を返します。 』
って書いてあるから、返してくれるんだと・・・。


少しパニック状態に陥っております(-"-;)
じゃんぬねっと です。

■No8534に返信(あのねさんの記事)
> 少しパニック状態に陥っております(-"-;)

色々弄りまわしておいて、こんなことを言うと失礼かと思いますが、
そもそも、CrystalReports にあなたが指定した何か (Dataset とか) を出力するわけなのですから、
そっち (Dataset とか) を参照しちゃった方がスマートで、安全なような気がします。
どうでしょう? (^-^*)

# もし Table でバウンディングしているのならば Transaction 処理を入れておかないと、同期が取れませんが。
何度もありがとうございます。

>そっち (Dataset とか) を参照しちゃった方が
残念ながら、DBには総ページ数項目は持たせてないんです。
データも多く処理も重たいため、出来ればレポートから
取得したいと思っていたのですが、コードからの参照は
できないんでしょうか・・・?

無理なら次の手、考えないとなぁ^^;
■No8537に返信(あのねさんの記事)
> 残念ながら、DBには総ページ数項目は持たせてないんです。
そうですね、単票形式でない場合は単純に計算できませんものね。
グループのヘッダ項目や、プリンタドライバによっては、
1 ページで納めることができるレコード数も変わるでしょうから... (^-^A)

> データも多く処理も重たいため、出来ればレポートから
> 取得したいと思っていたのですが、コードからの参照は
> できないんでしょうか・・・?
> 無理なら次の手、考えないとなぁ^^;

じゃあ、当初の TotalPageCount の方法にしましょうか。

 ・レポートフッタ (ページフッタではないですよ) に、式フィールドを追加する。
 ・その式フィールドに「TotalPageCount」をセット。
 ・以下の URL を参考に Text を取得する。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/crystlrf/html/crlrfformulafielddefinitionpropertiestopic.asp

# ただ、この方法だと非同期になるので、正しい値が返ってこない恐れがあるんですよね。
# その辺りは、CrystalReports でもある程度の「出力状況」が扱えるので、それでカバーしてください。
2005/01/19(Wed) 15:27:51 編集(投稿者)

ありがとうございます。

途中経過ですが・・・。

>  ・レポートフッタ (ページフッタではないですよ) に、式フィールドを追加する。
>  ・その式フィールドに「TotalPageCount」をセット。
>  ・以下の URL を参考に Text を取得する。


これだと・・・、
『文字列。式のテキストを取得または設定します。』
とあるように、
『WhilePrintingRecords;
 TotalPageCount    』
とフィールドの式が返ってきますよね?(´・ω・`)

この式を使って、更に処理が要るのかな・・・。

ごそごそ・・・。
■No8542に返信(あのねさんの記事)
> 『文字列。式のテキストを取得または設定します。』
> とあるように、
> 『WhilePrintingRecords; TotalPageCount』
> とフィールドの式が返ってきますよね?(´・ω・`)

うわっ... 式自体が返ってきちゃうんですね... orz
私の方には CrystalReports が実行できる環境がないものですから、
手探り状態で回答しちゃったりしてます... (←最低ですね...)
大変失礼しました。m(_ _)m

こちらの記事を見る限り、私と同じ様な回答になってますね...
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5611&forum=7&2

しかしそれができないとなると、

> 無理やり最終ページへ移動させ、そのページのページ数を保存し使用しています。

これしか解決方法がないかもしれませんね。

# 現在の CurrentPage は取得できて、TotalPage が取得できないのは何故? って感じですが。

> これだと、思ったとおりの動きはしてくれるのですが、
> 画面がチラチラしてしまうのが気になるし、

画面のチラツキは描画を無効にするか、Hide() しておくことで防げそうですね。

> 方法としては微妙な気がしたので・・・。

ユーザーに悟られないように、非表示状態でこっそり Load しておき、
最終ページへ移動 -> ページ番号取得 -> 最初のページへ移動 -> それから表示
のようにすれば良いかと思われます。

# CrystalReportsViewer を使っているとのことですので。
いつもありがとうございます。

> こちらの記事を見る限り、私と同じ様な回答になってますね...
> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5611&forum=7&2

私も以前、この記事を見たことがありまして、
『おぉ、参照できるのかっ(`・ω・´)』
と色々模索していたのです(笑


> # 現在の CurrentPage は取得できて、TotalPage が取得できないのは何故? って感じですが。

ものすごーく不思議ですよね・・・orz


> 画面のチラツキは描画を無効にするか、Hide() しておくことで防げそうですね。

最終手段発動ですね(゚□゚*)
結果としては『参照できない』となりましたけど、
これ関係の調査の間にも、知らなかった事やもっと楽な記述方法なんかが
色々見つかったので(クリレポに限らず)、勉強になりました。

沢山の助言、ありがとうございました_(._.)_
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板