データドリブン型の印刷メニューを作成するお手本データベース

図1-2-1 レポートに該当する印刷条件のみ使用可能状態にする
このサンプルデータベースは、リストボックスに表示されたレポートをクリックすると、そのレポートに該当する印刷条件のみ自動的に使用可能状態にします。通常、レポートは印刷条件を指定して印刷するのが一般的ですが、データドリブン型の印刷メニューを作成すれば、レポート毎に印刷条件を入力するフォームを用意する必要がありません。
サンプルデータベース(CH1-2.mdb)では、以下のノウハウを習得することができます。
◆ レポートに該当する印刷条件のみ自動的に使用可能状態にする方法
◆ レポートの印刷条件を、レポートヘッダーに印刷する方法
◆ フォーム上の必須項目のコントロールを調べて、未入力のときエラーメッセージを表示する方法
● データドリブン型の印刷メニューを作成するには
1 Accessを起動して作業フォルダに新規データベース CH1-2.mdbを作成します。
2 データベースウィンドウからテーブル
をクリックして、新規作成ボタンをクリックします。テーブルの新規作成ダイヤログが表示されたら、デザインビューを選択してOKボタンをクリックします。テーブルが表示されたら、フィールド名にReportID, ReportTitle, ReportNameを入力します。データ型とフィールドサイズは、表1-2-1のように設定します。
表1-2-1 テーブルtblReportsの構成
|
フィールド名 |
データ型 |
サイズ |
説明 |
|
ReportID(主キー) |
数値型 |
整数型 |
レポートID |
|
ReportTitle |
テキスト型 |
50 |
レポートタイトル |
|
ReportName |
テキスト型 |
50 |
レポート名 |
ReportIDフィールドを選択したら、メニューから主キーのアイコン
をクリックして主キーを設定します。

図1-2-2 テーブル tblReportsを作成
3 テーブルを”tblReports”の名称で保存したら、テーブルを開いて図1-2-3に示すようなメニューアイテムを入力します。ReportIDは、3桁で000-999の数字を入力します。ReportTitleには、レポートのタイトルと用紙サイズを入力します。ReportNameには、レポートの名称を入力します。

図1-2-3 テーブル tblReportsに印刷メニューアイテムを登録
4 データベースウィンドウからフォーム
をクリックして、新規作成ボタンをクリックします。フォームの新規作成ダイアログが表示されたら、デザインビューを選択してOKをクリックします。フォームのデザインビューが表示されたら、詳細セクションにリストボックスと印刷条件を入力するコントロールを作成します。詳細セクションに作成したコントロールのプロパティを表1-2-2のように設定します。

図1-2-4 詳細セクションにリストボックスと印刷条件を入力するコントロールを作成
リストボックスは、ツールボックスから
のアイコンをクリックして作成します。リストボックスの値集合ソース(RowSource)を作成するには、値集合ソースのプロパティをクリックしてクエリビルダボタン
をクリックします。テーブルの表示ダイアログが表示されたら、テーブルタブをクリックしてtblReportsを選択して追加ボタンをクリックします。閉じるのボタンをクリックしてダイアログを閉じます。tblReportsからReportID, ReportTitle, ReportNameのフィールドをダブルクリックしてQBEフィールドに移動します。ReportIDの並べ替えをクリックして、コンボボックスから昇順を選択します。クエリを保存して、値集合ソースを更新します。印刷条件のコンボボックスは、ツールボックスから
をクリックして作成します。コンボボックスの値集合タイプに値リストを設定して、値集合ソースに2列のペアで構成される値を入力します。印刷条件を入力するコントロールのタグ(Tag)プロパティには、該当するレポートのReportIDを格納します。例えば、ReportID(110)が該当するときは、前後にセミコロン(;)を付加して”;110;”のように格納します。ヒントテキスト(ControlTipText)のプロパティには、カーソルを移動したときに表示されるツールチップを入力します。サンプルデータベースでは、ヒントテキストの内容をエラーメッセージとして使用しますので、必須項目のコントロールにのみ設定します。

図1-2-5 リストボックスの値集合ソースのSQL
表1-2-2 詳細セクションに作成したコントロールのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
ラベル |
標題 |
レポート一覧 |
|
リストボックス |
名前 |
lstReortID |
|
値集合タイプ |
テーブル/クエリ |
|
|
値集合ソース |
SELECT tblReports.ReportID, tblReports.ReportTitle, tblReports.ReportName FROM tblReports ORDER BY tblReports.ReportID; |
|
|
連結列 |
1 |
|
|
列数 |
3 |
|
|
列幅 |
0cm;4cm;0cm |
|
|
立体表示 |
なし |
|
|
境界線スタイル |
透明 |
|
|
背景色 |
16777190 |
|
|
ラベル |
標題 |
印刷条件 |
|
コンボボックス1 |
名前 |
cboBankID |
|
ヒントテキスト |
銀行を選択してください! |
|
|
タグ |
;110;120;210;220;230;240; |
|
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
100;東京銀行;200;神奈川銀行;300;埼玉銀行;400;千葉銀行 |
|
|
連結列 |
1 |
|
|
列数 |
2 |
|
|
列幅 |
0cm;4cm |
|
|
コンボボックス2 |
名前 |
cboBrachID |
|
ヒントテキスト |
支店を選択してください! |
|
|
タグ |
;110;120; |
|
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
100;赤羽支店;200;浦和支店;300;大宮支店 |
|
|
連結列 |
1 |
|
|
列数 |
2 |
|
|
列幅 |
0cm;4cm |
|
|
コンボボックス3 |
名前 |
cboTypeID |
|
ヒントテキスト |
納期を選択してください! |
|
|
タグ |
;210;220;230;240; |
|
|
値集合タイプ |
値リスト |
|
|
値集合ソース |
1;通常;2;緊急 |
|
|
連結列 |
1 |
|
|
列数 |
2 |
|
|
列幅 |
0cm;2,5cm |
|
|
テキストボックス1 |
名前 |
txtFromDate |
|
ヒントテキスト |
開始日を入力してください! |
|
|
タグ |
;110;120;210;220;230;240; |
|
|
テキストボックス2 |
名前 |
txtToDate |
|
ヒントテキスト |
|
|
|
タグ |
;110;120;210;220;230;240; |
|
|
ラベル |
標題 |
~ |
|
チェックボックス1 (ストック) |
名前 |
chkStock |
|
タグ |
;410; |
|
|
チェックボックス2 (ノンストック) |
名前 |
chkNonStock |
|
タグ |
;410; |
|
|
チェックボックス3 (印刷プレビュー) |
名前 |
chkPreview |
|
使用可能 |
いいえ |
|
|
四角形 |
立体表示 |
くぼみ |
5 フォームフッターに3個のコマンドボタンを作成して表1-2-3に示すようなプロパティを設定します。

図1-2-6 フォームフッターに3個のコマンドボタン作成
表1-2-3 フォームフッターに作成したコマンドボタンのプロパティ
|
コントロールの種類 |
プロパティ |
値 |
|
コマンドボタン1 |
名前 |
cmdPrintLaserPrinter |
|
|
タグ |
;110;210;220;410;420;430;440;450;460; |
|
コマンドボタン2 |
名前 |
cmdPrintDotPrinter |
|
|
タグ |
;230;240; |
|
コマンドボタン3 |
名前 |
cmdExit |
6 メニューからコードのアイコン
をクリックしてフォームモジュールを表示させたら、CH1-2.mdbを開いて”frmPrintMenu”のフォームモジュールをコピーして貼り付けます。フォームモジュールのリストは、リスト1-2-1を参照してください。また、CH1-2.mdbのレポートから rptSample、モジュール からbasMyLibをインポートしてください。rptSampleは、印刷メニューからレポートをクリックしたときに開かれます。
7 フォームを開いたら、リストボックスから適当なレポートをクリックして印刷条件のコントロールが使用可能/不可に切り替わるか確認します。印刷条件を入力してから、プリンタのコマンドボタンをクリックするとレポートが表示/印刷されます。尚、レポートには、印刷メニューで設定した印刷条件が印字されます。

図1-2-7 レポートに印刷条件が印字された例
8 印刷メニューが正常に動作することを確認したら、フォームを”frmPrintMenu”の名称で保存して、Access を終了します。
Sub Form_Load()イベント処理について
このイベントは、フォームが開かれてデータをロードしたときに実行されます。このイベントでは、フォームに配置されている印刷条件のコントロールを検索して使用可能(Enabled)プロパティを”いいえ”に設定します。フォームに配置されているコントロールが印刷条件用のコントロールかどうかは、タグ(Tag)プロパティを調べて判断します。
Sub lstReportID_AfterUpdate()イベント処理について
このイベントは、リストボックスのアイテムをクリックしたときに実行されます。このイベントでは、選択したレポートに該当する印刷条件のコントロールを検索して使用可能(Enabled)プロパティを”はい”に設定します。レポートに該当しない印刷条件は、使用可能プロパティを”いいえ”に設定します。With Me.lstReportID…End Withでは、リストボックスのカラム1、カラム2からレポートタイトルとレポート名を取得して、モジュールレベルのメモリ変数に退避しています。 For Each ctl In Me.Controls…Nextでは、印刷条件設定用コントロールの使用可能(Enabled)プロパティを更新しています。プレビュー印刷のチェックボックスは、常に使用可能状態とします。
Sub cmdPrintDotPrinter_Click()/Sub
cmdPrintLaserPrinter_Click()イベント処理について
これらのイベントは、印刷用のコマンドボタンをクリックしたときに実行されます。これらのイベントでは、ValidControl()関数を呼び出して、印刷条件の値が入力されているか調べます。印刷条件が入力されていることを確認したら、BuildCriteria()関数を呼び出して、レポートのフィルタ条件を生成します。最後に、DoCmdのOpenReportメソッドを実行してレポートを開きます。OpenReportメソッドの引数として、レポート名、ビュータイプ、フィルタ条件を指定します。
Function ValidControls()関数について
この関数は、フォームの詳細セクションに配置されたコントロールを検索して、印刷条件が入力されていないコントロールを見つけたらエラーメッセージを表示して、そのコントロールにフォーカスを移動します。この関数からは、True/Falseが返されます。
For Each ctl In Me.Section(acDetail).Controls…Nextでは、フォームの詳細セクションに配置された全てのコントロールを検索します。Select Case .ControlType…End Selectでは、コントロールのタイプを調べて、テキストボックスとコンボボックスに対してエラーチェックを行います。コントロールが必須項目かどうかは、ヒントテキスト(ControlTipText)で調べます。必須項目に値が入力されていないときは、MsgBoxでエラーメッセージを表示して、SetFocusメソッドでフォーカスを移動します。尚、エラーメッセージは、ヒントテキストに設定した内容が表示されます。ValidControls()関数をPublic属性にして、引数にフォームを追加すれば、他のフォームからも使用できる汎用関数になります。
Public Function ValidControls(frm As Form) As Boolean
For Each ctl In frm.Section(acDetail).Controls
Next ctl
End Function
Function BuildCriteria() 関数について
この関数は、印刷条件の値を元にレポートのフィルタ条件を生成して返します。例えば、銀行IDのコンボボックスで100を選択したときは、”BankID = 100”が返されます。
Left(strCriteria, Len(strCriteria) - 5)では、メモリ変数から最後の” AND ”を除去します。
フォームのSetCaption()メソッドについて
このメソッドは、フォーム固有のメソッドでレポートの標題を設定します。rptSampleのReport_Openイベントから次のように呼ばれます。
Forms(“frmPrintMenu”).SetCaption Me
フォームのSetCriteria()メソッドについて
このメソッドは、フォーム固有のメソッドでフィルタ条件を設定します。rptSampleのReport_Openイベントから次のように呼ばれます。
Forms(“frmPrintMenu”).SetCriteria Me.lblCriteria
リスト1-2-1 frmPrintMenuのフォームモジュール
|
Option Compare Database Option Explicit Private mstrReportTitle As String Private mstrReportName As String Private mintView As Integer Private mstrCriteria As String Private Sub cmdExit_Click() DoCmd.Close End Sub Private Sub cmdPrintDotPrinter_Click() If ValidControl() Then mstrCriteria = BuildCriteria() On Error Resume Next DoCmd.OpenReport ReportName:=mstrReportName, _ View:=mintView, WhereCondition:=mstrCriteria End If End Sub Private Sub cmdPrintLaserPrinter_Click() If ValidControl() Then mstrCriteria = BuildCriteria() On Error Resume Next DoCmd.OpenReport ReportName:=mstrReportName, _ View:=mintView, _ WhereCondition:=mstrCriteria End If End Sub Private Sub Form_Load() Dim ctl As Control For Each ctl In Me.Controls With ctl If Len(.Tag) <> 0 Then .Enabled = False End If End With Next ctl End Sub Private Sub Form_Open(Cancel As Integer) Call SetAppTitle_FS("Data-Driven Print Menu (C) " _ & Year(Date) & " by Akio Kasai") End Sub Private Sub lstReportID_AfterUpdate() Dim ctl As Control Dim strChoice As String
With Me.lstReportID mstrReportTitle = Nz(.Column(1), "") mstrReportName = Nz(.Column(2), "") End With
strChoice = ";" & CStr(Me.lstReportID) & ";" ' ;999; For Each ctl In Me.Controls With ctl If Len(.Tag) <> 0 Then If InStr(1, .Tag, strChoice) > 0 Then .Enabled = True Else .Enabled = False End If End If End With Next ctl Me.chkPreview.Enabled = True If Me.chkPreview Then mintView = acViewPreview Else mintView = acViewNormal End If End Sub Private Function ValidControl() As Boolean Dim ctl As Control ValidControl = False For Each ctl In Me.Section(acDetail).Controls With ctl Select Case .ControlType Case acTextBox, acComboBox If .Enabled Then If Len(.ControlTipText) <> 0 Then If IsNull(.Value) Then MsgBox .ControlTipText, vbExclamation .SetFocus Exit Function End If End If End If End Select End With Next ctl ValidControl = True End Function Private Function BuildCriteria() As Variant Dim strCriteria As String
With Me.cboBankID If .Enabled Then If Len(.Value) <> 0 Then strCriteria = strCriteria _ & "BankID=" & .Value & " AND " End If End If End With
With Me.cboBranchID If .Enabled Then If Len(.Value) <> 0 Then strCriteria = strCriteria _ & "BranchID=" & .Value & " AND " End If End If End With
With Me.cboTypeID If .Enabled Then If Len(.Value) <> 0 Then strCriteria = strCriteria _ & "TypeID=" & .Value & " AND " End If End If End With
If Me.txtFromDate.Enabled And Me.txtToDate.Enabled Then If Len(Me.txtFromDate) <> 0 And Len(Me.txtToDate) <> 0 Then strCriteria = strCriteria _ & "Date Between #" & Format(Me.txtFromDate, "yyyy/mm/dd") _ & "# And #" & Format(Me.txtToDate, "yyyy/mm/dd") & "# AND " End If End If ‘ 最後の “AND”を除去する If Len(strCriteria) <> 0 Then strCriteria = Left(strCriteria, Len(strCriteria) - 5) End If BuildCriteria = strCriteria
End Function
'--------------------------------------- ' フォーム固有のメソッド
'--------------------------------------- Public Sub SetCaption(rpt As Report) rpt.Caption = mstrReportTitle End Sub Public Sub SetCriteria(lbl As Label) lbl.Caption = "印刷条件(" & mstrCriteria & ")" End Sub |
Tip
|
印刷条件を入力するコントロールのタブ(Tab)プロパティに、ReportIDを設定するとき表1-2-3に示すようなマトリックスを作成すると便利です。 表1-2-3 印刷条件とReportIDのマトリックス (○:該当)
|