MS-Accessでのレポート印刷について
MS-Access97を使用しております。早速質問させていただきます。
売上データから請求書を発行するシステムを作っているのですが、たとえば
請求書をページプリンタへ印刷する場合、1枚目を「請求書」2枚目を「同控え」3枚目を「納品書」としたいのですが・・・。それぞれ3種類のレポートを作成し、請求書を発行するフォームから発行する条件をあたえ、コマンドボタンに3枚を順に印刷するコードを書いたのですが、これでは最初に1枚目をすべて印刷し、次に2枚目、次に3枚目という順序で印刷されてしまいます。
発行する客先が多くなるほど、印刷された用紙を手作業で並べかえなければならず大変不便です。
そこで、最初の1件目(お客)を1、2、3枚印刷し、続けて2件目(次のお客)を1、2、3と印刷(以後繰り返し)できるようにするにはどうしたらよいのでしょうか?
投稿日時 - 2002-03-06 18:09:54
こんにちは。
yoishoさんのおっしゃる通り、ADOは97では使えません。
質問文を見落としてました。
次のようにDAO版に修正して下さい。
まず、VBEの参照設定で「Microsoft DAO 3.6 Object Library」にチェックがなければ、チェックします。
cnとrsのかわりに、dbとrsを使います。
宣言を入れかえます。
Dim db As DAO.Database
Dim rs As DAO.Recordset
レコードセットの作成を入れかえます。
Set db = CurrentDb()
Set rs = db.OpenRecordset("顧客テーブル", dbOpenDynaset)
抽出条件はそのままでいいです。
検索部分を次のようにします。
'1回目の検索
rs.FindFirst criteria
If rs.NoMatch Then
'終了
Exit Sub
Else
Do Until rs.NoMatch
*** ここに印刷処理を書く(Forループの中身だけ) ****
Filterの抽出条件は、"顧客ID = " & rs!顧客ID
(印刷処理)
************************************************
'2回目以降の検索
rs.FindNext criteria
Loop
End If
rs.Close: Set rs = Nothing
db.Close: Set db = Nothing
投稿日時 - 2002-03-08 16:22:50
ご連絡が遅くなりました。
早速ためしてみます。いろいろありがとうございました。
投稿日時 - 2002-03-11 10:47:21
このQ&Aは役に立ちましたか?
0人が「このQ&Aが役に立った」と投票しています
回答(5)
再びmaruru01です。
ADOのレコードセットを使用しましょう。
元のテーブルを[顧客テーブル]、その中にフィールド[顧客ID](数値型)、[日付](日付型)があるとします。
[印刷]ボタンのクリックイベントに、
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim condHiduke As String
Dim condKyakuID As String
Dim criteria As String
'抽出条件の設定
condHiduke = "(日付 BETWEEN #" & [Forms]![条件フォーム]![開始日] & "# AND #" & [Forms]![条件フォーム]![終了日] & "#)"
condKyakuID = "(顧客ID BETWEEN " & [Forms]![条件フォーム]![開始客先] & " AND " & [Forms]![条件フォーム]![終了客先] & ")"
criteria = condHiduke & " AND " & condKyakuID
'レコードセットの作成
Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
rs.Open "顧客テーブル", cn, adOpenKeyset, adLockReadOnly
'1回目の検索
rs.Find criteria, 0, adSearchForward
If rs.EOF Then
'終了
Exit Sub
Else
Do Until rs.EOF
*** ここに印刷処理を書く(Forループの中身だけ) ***
Filterの抽出条件は、"顧客ID = " & rs!顧客ID
(印刷処理)
************************************************
'2回目以降の検索
rs.Find criteria, 1, adSearchForward
Loop
End If
rs.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
レコードセットのOpenやFindメソッドについては、ヘルプを参照して下さい。
なお、私はAccess2000で、しかも試していないので、動作するかどうかはわかりません。
では。
投稿日時 - 2002-03-07 12:07:12
丁寧にご説明いただきありがとうございます。
ここまで書いていただければなんとかできそうです。
早速ためしてみます。
投稿日時 - 2002-03-07 13:05:25
こんにちは。maruru01です。
毎回客一人だけを抽出してレポートのソースに設定して、Forループで回せばいいと思います。
客総数をAllCountとして、
For i = 1 To AllCount
1枚目用レポート名.Filter = "(抽出条件)"
1枚目用レポート名.FilterOn = True
DoCmd.OpenReport 1枚目用レポート名, acViewNormal
2枚目用レポート名.Filter = "(抽出条件)"
2枚目用レポート名.FilterOn = True
DoCmd.OpenReport 2枚目用レポート名, acViewNormal
3枚目用レポート名.Filter = "(抽出条件)"
3枚目用レポート名.FilterOn = True
DoCmd.OpenReport 3枚目用レポート名, acViewNormal
Next i
このままだと、紙は3枚目が一番上になると思うので、プリンタのオプションで変えるなり、上のコードの順番を変えるなりして下さい。
では。
投稿日時 - 2002-03-06 18:32:43
おはようございます。
早速ためそうとやりかけたのですが、ちょっと上記コードで質問なんですが、
1枚目用レポート名.Filter = "(抽出条件)" ←この抽出条件の具体的な記述はどう書けばよいのでしょうか?ちなみに、請求書の元になるクエリーに以下の抽出条件を設定います。
「日付」・・・Between[Forms]![条件フォーム]![開始日]AND[Forms]![条件フォーム]![終了日]
「客先」・・・Between[Forms]![条件フォーム]![開始客先]AND[Forms]![条件フォーム]![終了客先]
条件フォームに日付、客先(コード番号)をそれぞれ設定し、レポートを印刷するスタイルです。
ご教授いただければ幸いです。
投稿日時 - 2002-03-07 09:49:02
ご連絡ありがとうございます。
早速ためさせていただきます(結果は明日になると思います)。
取り急ぎ御礼まで。
投稿日時 - 2002-03-06 18:40:06