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

レポートのイベントの発生メカニズムの研究 その2

レポートのイベントの発生メカニズムの研究 の続きです。 今回は、総ページ数を取得するときと、戻り時イベントについての実験です。

難易度:

総ページを取得するとき

前回のサンプルのレポートのページフッターにテキストボックスを配置して、コントロールソースを
=[Pages]
と設定して、総ページ数を表示させてみましょう。プレビューさせた後、イミディエイトウィンドウの出力結果は下記のようになります。

Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Pヘッダー     Format         1 
 1             1            詳細          Format         1 
 1             2            詳細          Format         1 
 1             3            詳細          Format         1 
 1             4            詳細          Format         1 
 1             5            詳細          Format         1 
 1             6            詳細          Format         1 
 1             7            詳細          Format         1 
 1             8            詳細          Format         1 
 1             9            詳細          Format         1 
 1             10           詳細          Format         1 
 1             11           詳細          Format         1 
 1             12           詳細          Format         1 
 1             11           Pフッター     Format         1 
 2             12           Pヘッダー     Format         1 
 2             12           詳細          Format         2 
 2             13           詳細          Format         1 
 2             14           詳細          Format         1 
 2             15           詳細          Format         1 
 2             16           詳細          Format         1 
 2             17           詳細          Format         1 
 2             18           詳細          Format         1 
 2             19           詳細          Format         1 
 2             20           詳細          Format         1 
 2             21           詳細          Format         1 
 2             22           詳細          Format         1 
 2             23           詳細          Format         1 
 2             24           詳細          Format         1 
 2             23           Pフッター     Format         1 
 3             24           Pヘッダー     Format         1 
 3             24           詳細          Format         2 
 3             25           詳細          Format         1 
 3             26           詳細          Format         1 
 3             26           Rフッター     Format         1 
 3             26           Pフッター     Format         1 
Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Rヘッダー     Print          1 
 1             1            Pヘッダー     Format         1 
 1             1            Pヘッダー     Print          1 
 1             1            詳細          Format         1 
 1             1            詳細          Print          1 
 1             2            詳細          Format         1 
 1             2            詳細          Print          1 
 1             3            詳細          Format         1 
 1             3            詳細          Print          1 
 1             4            詳細          Format         1 
 1             4            詳細          Print          1 
 1             5            詳細          Format         1 
 1             5            詳細          Print          1 
 1             6            詳細          Format         1 
 1             6            詳細          Print          1 
 1             7            詳細          Format         1 
 1             7            詳細          Print          1 
 1             8            詳細          Format         1 
 1             8            詳細          Print          1 
 1             9            詳細          Format         1 
 1             9            詳細          Print          1 
 1             10           詳細          Format         1 
 1             10           詳細          Print          1 
 1             11           詳細          Format         1 
 1             11           詳細          Print          1 
 1             12           詳細          Format         1 
 1             11           Pフッター     Format         1 
 1             11           Pフッター     Print          1 

まず、最初から最終レコードまで、フォーマット時イベントのみ発生させてます(赤字部分)。その後、再び、先頭レコードからフォーマット時イベント、印刷時イベントがセットで発生します。これはどういうことでしょう。

これも、推測ですが、総ページ数を計算するために、実際に最終ページまでフォーマットのみ実行させているのでしょう。グループ化されていたり、「印刷時拡大/縮小」が「はい」に設定されていたり、VBAでフォーマットをキャンセルしていたり、・・・などによって必要な印刷領域は変化しますので、レコード数から単純に計算するというわけにはいかないので、本番と同じようにフォーマット時イベントのみ発生させないと正確なページ数が取得できないためだと思われます。

これを考慮せずにコーディングすると期待通りの結果が得られない場合がありますので、注意が必要です。レポートヘッダーのフォーマット時イベントで初期化するなどの対策が必要となるかも知れません。

逆にこれを利用して、先のイベントで起こるであろうことを予測することができます。当ブログのTips、ページの最後の罫線を太線にするレポートでグループ毎に Page/Pages 形式のページ数を表示する、でもこの現象を利用してます。総ページ数取得のためのイベントと本番のイベントの区別は、Me.Pages が 0 かどうかで判断できます。

戻り時イベントはいつ発生する。

セクションには、フォーマット時、印刷時、の他に 戻り時 というイベントがあります。どんなときに発生するのでしょうか。グループ化が関係するので、レコードソースにGroupフィールドを追加して、レポートにはグループヘッダーを追加します。これで、1ページ目をプレビューします。

Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Rヘッダー     Print          1 
 1             1            Pヘッダー     Format         1 
 1             1            Pヘッダー     Print          1 
 1             1            Gヘッダー     Format         1 
 1             1            Gヘッダー     Print          1 
 1             1            詳細          Format         1 
 1             1            詳細          Print          1 
 1             2            詳細          Format         1 
 1             2            詳細          Print          1 
 1             3            詳細          Format         1 
 1             3            詳細          Print          1 
 1             4            詳細          Format         1 
 1             4            詳細          Print          1 
 1             5            Gヘッダー     Format         1 
 1             5            Gヘッダー     Print          1 
 1             5            詳細          Format         1 
 1             5            詳細          Print          1 
 1             6            詳細          Format         1 
 1             6            詳細          Print          1 
 1             7            詳細          Format         1 
 1             7            詳細          Print          1 
 1             8            詳細          Format         1 
 1             8            詳細          Print          1 
 1             9            Gヘッダー     Format         1 
 1             9            Gヘッダー     Print          1 
 1             9            詳細          Format         1 
 1             9            詳細          Print          1 
 1             10           詳細          Format         1 
 1             10           詳細          Print          1 
 1             11           詳細          Format         1 
 1             10           Pフッター     Format         1 
 1             10           Pフッター     Print          1 

これでは戻り時は発生しません。「並べ替え/グループ化の設定」でグループプロパティの「同一ページ印刷」を「グループ全体」に設定します。1ページ目をプレビューした結果です。

Page:         ID:           セクション    イベント:     Format(Print)Count:
 1             1            Rヘッダー     Format         1 
 1             1            Rヘッダー     Print          1 
 1             1            Pヘッダー     Format         1 
 1             1            Pヘッダー     Print          1 
 1             1            Gヘッダー     Format         1 
 1             1            Gヘッダー     Print          1 
 1             1            詳細          Format         1 
 1             1            詳細          Print          1 
 1             2            詳細          Format         1 
 1             2            詳細          Print          1 
 1             3            詳細          Format         1 
 1             3            詳細          Print          1 
 1             4            詳細          Format         1 
 1             4            詳細          Print          1 
 1             5            Gヘッダー     Format         1 
 1             5            詳細          Format         1 
 1             6            詳細          Format         1 
 1             7            詳細          Format         1 
 1             8            詳細          Format         1 
 1             8            詳細          Retreat       -
 1             7            詳細          Retreat       -
 1             6            詳細          Retreat       -
 1             5            詳細          Retreat       -
 1             5            Gヘッダー     Retreat       -
 1             5            Gヘッダー     Format         1 
 1             5            Gヘッダー     Print          1 
 1             5            詳細          Format         1 
 1             5            詳細          Print          1 
 1             6            詳細          Format         1 
 1             6            詳細          Print          1 
 1             7            詳細          Format         1 
 1             7            詳細          Print          1 
 1             8            詳細          Format         1 
 1             8            詳細          Print          1 
 1             9            Gヘッダー     Format         1 
 1             9            詳細          Format         1 
 1             10           詳細          Format         1 
 1             11           詳細          Format         1 
 1             11           詳細          Retreat       -
 1             10           詳細          Retreat       -
 1             9            詳細          Retreat       -
 1             9            Gヘッダー     Retreat       -
 1             8            Pフッター     Format         1 
 1             8            Pフッター     Print          1 

戻り時イベントが発生しました(赤字部分)。この結果からAccessは、下記のようなことをしていると推測されます。

グループプロパティの「同一ページ印刷」を「グループ全体」というのは、あるグループ全体が同一ページに収まらずに2ページ以上に分割されてしまう場合、グループの先頭で改ページして、グループが離ればなれになるのを防ぐ機能です。

まず、ページ内の2つめ以降のグループで、グループ内の最後まで Formatイベントだけを発生させて現ページ内に収まるかテストします。
収まる場合は、戻り時でカレントレコードをグループ内の先頭まで戻して、グループヘッダーでも印字開始位置を戻して、それ後、もう一度、本番の フォーマット時、印刷時 のセットを発生させます。
収まらない場合、戻り時でグループヘッダーまで戻り、そこで改ページして、次ページから、本番のフォーマット時、印刷時のセットを発生させます。

「同一ページ印刷」を「最初の詳細セクション」に設定しているときにも、同様のことが発生します。ただし、グループの最初の1レコード目の詳細セクションだけが対象になります。

累計処理をVBAで行うとき、例えば、F2 フィールドの数値の累計をF2RunSum テキストボックスに表示するという仕様とすると、グループプロパティの「同一ページ印刷」が「しない」に設定してあるとき、下記のコードでいいのですが、

「同一ページ印刷」が「しない」以外に設定してあるとき、戻り時イベントで、フォーマット時イベントと逆の処理を実行する必要があります。

例示した累計計算のような単純な処理は、実際は、テキストボックスの「集計実行」プロパティで簡単にできますのでその方がお勧めです。前後の値が関係するとかの複雑な計算のときなど、どうしても利用するしかない場合は、上記のイベント発生メカニズムを理解して考慮したコードを書く必要があります。

サンプルファイルが下記からダウンロードできます。
RptEvent2_07.zip (Access 2007-2010 形式 - 23kb)
RptEvent2.zip (Access 2002-2003 形式 - 21kb)
RptEvent2_2k.zip (Access 2000 形式 - 21kb)

拍手する

2 Comments

yst_ryu says..."Access2010 Printでグループ化で1ページ目が詳細なしで改ページ"

Access2010でグループ化し同一ページ印刷指定のとき、1ページ目の詳細がページ内に収まらない場合、ヘッダーを印刷後改ページするため、1ページ目が詳細なしになってしまいます。対応策はないでしょうか?
詳細がページ内に収まらない場合でも、印刷位置がページの先頭の場合は改ページしないように本ブログを中心にいろいろ知れべているのですが、イベントがaccessの中なのでどうしようもないのかとほぼあきらめかけています。

2016.10.17 09:21 | URL | #- [edit]
hatena says..."re:Access2010 Printでグループ化で1ページ目が詳細なしで改ページ"

「グループ化し同一ページ印刷指定のとき」というのはどこでどのように設定しまたか。

また、「1ページ目の詳細がページ内に収まらない場合」というのは、1グループの詳細のレコード件数が多くて収まらないのか、詳細セクションそのものの高さが大きくて収まらないのか、どちらですか。

2016.10.17 13:43 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

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