MS Access Tips/Sample and VBA and Blog customize etc...

レポートでグループ毎に上位N件まで表示する

レポートでグループ化しています。グループ毎の件数が多いので、グループ毎の上位5件のみ表示したいです。クエリを使うと、複雑で重くなるので、シンプルな方法はないでしょうか。

レポートのレコードソースのクエリでグループ毎の順位を求めて、順位5位以上を抽出するようにすれば可能です。が、質問でもあるように、DCountやサブクエリで順位を求めることになりますが、結構複雑な式になりますし、件数が多くなるにつれて幾何級数的に重くなります。

そこで、レポート上のイベントプロシージャにシンプルなコードを記述するだけで実現する方法を紹介します。

難易度:

詳細セクションに下記のテキストボックスを配置します。

プロパティ 設定値
コントロールソース =1
集計実行 グループ全体
可視 いいえ
名前 txtCnt

このテキストボックスでグループ内の連番を表示することができます。

詳細セクションのフォーマット時のイベントプロシージャを下記のように記述します。

グループ内連番が5を越える場合は、CancelをTrueにして、フォーマットをキャンセルして出力しないようにします。記述するコードは1行のみです。

別解

上記は非表示のテキストボックスを配置しましたが、これを使わずにコードだけで実現する方法です。

テキストボックスで連番を配置しない代わりに、3つのイベントにコードを記述する必要がありますが、記述するコードは4行のみです。

どちらの方法にしても、クエリで順位を取得するよりは、シンプルかつ高速だと思いますが、いかがでしょう。

拍手する

5 Comments

夏はやっぱりサマー says..."レポートでやるとシンプルそうですね…"

夏はやっぱりサマーことkitasueと申します。
クエリでグループごとに上位n件を出そうとすると嫌になりますが、
レポートだと、シンプルにできそうですね。
大変勉強になりました。

2010.05.13 21:36 | URL | #sPZSG9JY [edit]
さとみ says..."上位N件"

売上げを設備別に上位40件で使用させて貰いました。
説明通りに行い簡単にできました。

縦方向に上位40件の小計を出したかったのですが全体合計で出てしまい
「ページ毎の集計をページヘッダーに表示させる」を併用して試みたのです
が同じ結果になってしまいました。

これはムリなのでしょうか?

2010.09.15 14:25 | URL | #- [edit]
hatena says..."Re: 上位N件"

さとみさん、遅いレスでごめんなさい。

> 縦方向に上位40件の小計を出したかったのですが全体合計で出てしまい
> 「ページ毎の集計をページヘッダーに表示させる」を併用して試みたのです
> が同じ結果になってしまいました。

グループフッターに小計表示用のテキストボックスを配置して、名前を txt小計 とします。
グループフッターのフォーマット時イベントと、詳細の印刷時イベントを下記のように記述します。

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)
  Me.txt小計 = 0
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
  Me.txt小計 = Me.txt小計 + Me.売上額
End Sub

以上です。

2010.12.07 02:57 | URL | #5uE6dEgY [edit]
hokuto_0125 says..."上位n件"

いつも知恵袋でお世話になっております。

上記と同じ件で煮詰まってます。
名前でグループ化
詳細に名前別の獲得点
上上の方法で獲得点の上位4件を表示

グループヘッダーに上位4件の小計とグループ全体の合計を出したい
グループ全体の合計はウィザードで表示
それと並べて上位4件の小計を表示したい

で、上記の通りやってみたのですが
上位4件の小計結果が0になります。

txt小計のコントロールソースは空白で良いのでしょうか?

2015.07.03 18:13 | URL | #Z4XagFYo [edit]
hatena says..."re:上位n件"

グループヘッダーに表示したいのですね。
それはちょっとむずかしいですね。
詳細セクションのイベントで加算していくという方法は使えません。
グループヘッダーのイベントの方が先に発生しますので。

ひとつの方法は、
グループ毎に Page/Pages 形式のページ数を表示する - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-27.html
でも紹介している総ページ数を取得するための予行のフォーマットイベントで集計してそれを配列やディクショナリに格納して、本番のフォーマットでそれを参照するという方法。

あるいは、
レコードソースに連番フィールドを含めることができれば、それを利用するのが簡単です。
連番は、下記で、DCount やサブクエリを利用する方法と、関数でテーブルに書き込む方法を紹介していますので参考にしてください。

グループ毎連番を自動入力する関数 - hatena chips
http://hatenachips.blog34.fc2.com/blog-entry-428.html

連番フィールドができたら、グループヘッダーのテキストボックスのコントロールソースを下記のように設定します。

=Sum(IIf([連番]<=4,[売上額],0))

これで上位4位の計が表示できます。

2015.07.04 11:34 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/268-e6399869
該当の記事は見つかりませんでした。