Accessのレポートでは、「レコードソースとなっているテーブルやクエリのレコードがすべて印刷されるとそれ以降は空白となる」という特性があります。

一方、データがなくなったあとも、用紙の一番下まで罫線だけは印刷したいという場合があります。それを実現する方法として、レポートのモジュールを使ってレポート独特のプロパティやレコードを操作するという方法もありますが、少々複雑ですので、ここでは”作業テーブル”を使った方法を紹介したいと思います。
ここでは、現在「rpt受注明細」というレポートが、「qsel受注明細」というクエリをレコードソースとしているものとして、そこからカスタマイズしていく手順を説明します。
- まず、qsel受注明細から出力されるフィールドとまったく同じ構造を持った作業テーブルを作成します。ここではそれを「wtbl受注明細」とします。
このテーブルは手作業で作ってもかまいませんが、選択クエリを一時的に”テーブル作成クエリ”に変更して実行すると、フィールド数が多い場合などは楽に作成できます(ただしそのあと部分的にデザイン変更が必要な場合があります)。
qsel受注明細:

wtbl受注明細:

- 次に、レポートのレコードソースプロパティを上記の作業テーブルに変更します(ここで同じ結果が出力されるか一度動作確認をしておくとよいでしょう)。
- 次に、このレポートを印刷実行するフォーム上のボタンなどのイベントプロシージャを書き換えます。
これまではDocmd.OpenReportで単にレポートを開いていたのに対して、事前に、当初レコードソースとなっていたクエリ(ここではqsel受注明細)からレコードを読み込んで、その全レコードを作業用テーブル(ここではwtbl受注明細)に書き出すという処理を追加します。
そのサンプルは次の通りです。ここでは実レコード数に関わらず、20行分の罫線を書き出すようにしています。
Dim dbs As Database
Dim rstin As Recordset
Dim rstout As Recordset
Dim intRecCnt As Integer
Dim iintLoop As Integer
Set dbs = CurrentDb
'出力先の作業テーブルを空にする
dbs.Execute "DELETE * FROM wtbl受注明細"
'元のレコードソースのクエリを開く
Set rstin = dbs.OpenRecordset("qsel受注明細")
'出力先の作業テーブルを開く
Set rstout = dbs.OpenRecordset("wtbl受注明細")
'出力レコード数を初期化
intRecCnt = 0
'クエリの全レコードを読み込んで作業テーブルに追加するループ
With rstin
Do Until .EOF
rstout.AddNew
rstout!受注コード = !受注コード
rstout!商品コード = !商品コード
rstout!単価 = !単価
rstout!数量 = !数量
rstout.Update
'実際に出力されたレコード数をインクリメント
intRecCnt = intRecCnt + 1
.MoveNext
Loop
.Close
End With
'所定の行数になるまで空レコードを追加
For iintLoop = 1 To 20 - intRecCnt
rstout.AddNew
rstout.Update
Next iintLoop
rstout.Close
'レポートを開く
DoCmd.OpenReport "rpt受注明細", acViewPreview
準備ができたら、上記のプロシージャを実行してみます。この例では次のような結果になります。

なお、このときの作業テーブルの中味は次のようになっています。クエリにあったレコードの後ろに、トータル20行になるまで空のレコードが保存されていることが確認できると思います。

|