プロが教えるわが家の防犯対策術!

以下のような仕様にて、Access2003で取引案件管理データベースをつくっています。
一案件ごとにA,B,Cと三種類のレポートがあり、それを順番に印刷する機能を追加しようとしているのですが、方法がわからず、アドバイスをお願い致します。


*仕様*

・ユーザはアクセスオープン時に、自身のIDとパスワードを入力
・認証が通ると、総合メニュー画面が起動される。
総合メニューには「入力フォーム起動ボタン」と「レポート印刷ボタン」がある
・DB内部でIDとユーザの所属部署の紐付けを行っており、入力フォームを起動すると、自分の所属部署の担当案件だけが表示される
(フォームのコードで、グループごとにフィルタをかけている)
・レポートは案件ごとにA,B,Cと三枚に分かれている
・入力フォーム内にも、印刷ボタンがあり、それを押すと表示されている案件のレポートがA、B、Cの順番で出力される。
コードは以下の通り

DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"
DoCmd.OpenReport "レポートB", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"
DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件名] ='" & Me.案件名 & "'"

*今回つくりたい機能*

総合メニューの「レポート印刷ボタン」の中身を実装したいと考えています。
これを押すと、案件ID「001」のレポートA→B→C→案件ID「002」のレポートA→B→C→案件ID「003」・・というように、案件ごとにレポートA,B,Cがセット(連続)で印刷できるようにしたいのです。
上の構文と、レコード送りを組み合わせればいいのではないかと予想はついているのですが…緊急対応で、自分でコードを試行錯誤している時間がないもので、コードを上のような機能を実現できるコードを教えて頂けますと幸いです。宜しくお願い致します。

A 回答 (2件)

部署,案件ID順に、Filterで対象を制限してレポートを出力したいということですね。



Set rs = dbs.OpenRecordset("テーブル")
と書きましたが、ここで指定できるのはテーブル名だけではなく、SQLのSELECT文も指定できます。
なので、CaseごとにOpenのしかたを変えてください。

Select Case Group
Case "sda"
Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'xxx' ORDER BY 部署, 案件ID")
Case "sdb"
Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'yyy' ORDER BY 部署, 案件ID")
Case "sdc"
Set rs = dbs.OpenRecordset("SELECT 案件ID FROM テーブル WHERE 部署 LIKE 'zzz' ORDER BY 部署, 案件ID")
Case Else
msgbox "エラー"
Exit Sub
End Select


レポート出力部分は、次のようになります。

DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'"
DoCmd.OpenReport "レポートB", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'"
DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件ID] ='" & rs!案件ID & "'"

この回答への補足

丁寧なご解説ありがとうございます。
アドバイスを元に下記のようにコードを作成したのですが、
一件目の印刷が終わった後に、エラーが出てしまいました。
内容は「このコレクションには項目がありません」というもので、
デバックの画面ではMsgBox rs!項目の部分が黄色くなっていました。

ただ、この「MsgBox rs!項目」の構文を削除して試してみたのですが、
すると一件目だけ印刷して終了してしまいました。

構文の順番が間違っているのでしょうか…?


Private Sub コマンド23_Click()
Dim dbs As Database
Dim rs As DAO.Recordset
Dim stDocName As String
Set dbs = CurrentDb
Select Case Group
Case "sda"
Set rs = dbs.OpenRecordset("SELECT 案件ID FROM 案件マスター WHERE 部署 LIKE 'xxx' ORDER BY 部署,案件ID")
Case "sdb"
Set rs = dbs.OpenRecordset("SELECT 案件ID FROM 案件マスター WHERE 部署 LIKE 'yyy' ORDER BY 部署,案件ID")

Case Else
Exit Sub
End Select

DoCmd.OpenReport "レポートA", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'"
DoCmd.OpenReport "レポート", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'"
DoCmd.OpenReport "レポートC", acViewNormal, WhereCondition:="[案件名] ='" & rs!案件ID & "'"

Do Until rs.EOF
MsgBox rs!項目
rs.MoveNext
Loop
rs.Close
End Sub

補足日時:2009/09/11 15:58
    • good
    • 0

レコードの読み込み方法が分からないのでしょうか。



テーブルのアクセス方法には、ADOとDAOがあります。

(DAOの場合)
Sub レポート印刷()
Dim dbs As Database
Dim rs As DAO.Recordset
Set dbs = CurrentDb
Set rs = dbs.OpenRecordset("テーブル")
Do Until rs.EOF
MsgBox rs!項目
rs.MoveNext
Loop
rs.Close
End Sub

(ADOの場合)
Sub レポート印刷()
Dim cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Set cnn = CurrentProject.Connection
rs.Open "テーブル", cnn
Do Until rs.EOF
MsgBox rs!項目
rs.MoveNext
Loop
rs.Close
cnn.Close
End Sub

この回答への補足

レコードの読み込み方「も」なのですが…仕様についての説明足らずで申し訳ありません。

まず、このレポートのソースとなっているテーブルは(個々のレポートの中だけで複数あります)
また、ユーザに開示するレコードはあくまでそのユーザが所属する部署のものだけとしたいので、入力フォームおよび各レポートに次のようにフィルタをかけています。
Me.OrderBy = "[部署],[案件ID]"
Me.OrderByOn = True

Select Case Group
Case "sda"
Me.Filter = "部署 like 'xxx'"
Me.FilterOn = True
Case "sdb"
Me.Filter = "部署 like 'yyy'"
Me.FilterOn = True
Case "sdc"
Me.Filter = "部署 like 'zzz'"
Me.FilterOn = True
Case Else
End Select

End Sub

ちなみに、案件IDは文字列です。

たりたいことをより正確にかくと、
1.ユーザの部署にフィルタをかけた状態で一番初めに表示される(ソートで一番前になる)案件001のレポートAを印刷
2.001のレポートBを印刷
3.001のレポートCを印刷
2.ソート順2番目の案件002のレポートAを印刷…

となります。

この場合、教えて頂いたコードの

Set rs = dbs.OpenRecordset("テーブル")

の下のところに
Me.OrderBy = "[部署],[案件ID]"
Me.OrderByOn = True

Select Case Group
Case "sda"
Me.Filter = "部署 like 'xxx'"
Me.FilterOn = True
Case "sdb"
Me.Filter = "部署 like 'yyy'"
Me.FilterOn = True
Case "sdc"
Me.Filter = "部署 like 'zzz'"
Me.FilterOn = True
Case Else
End Select
End Sub
という構文を埋め込むようなイメージでしょうか。
また、印刷対象となるのはあくまでレポートなのですが、それはどのタイミングで記述すればよいのでしょうか。
(rs.Open "テーブル", cnn
Do Until rs.EOF
MsgBox rs!項目
という構文はテーブルの全項目を読み出している、という意味と推察しているのですが、テーブルごとにこういった形で指定しなければいけ二のでしょうか…どのテーブルのどの項目をつかう、というのはレポートで設定してあるのでレポートの指定ができたら一発かと思うのですが…)


わかりづらくてすみません;
宜しくお願い致します。

補足日時:2009/09/11 10:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!