首都圏コンピュータ技術者協同組合
秋月 巌 AKIZUKI,Iwao
●配布用アプリケーションを作成する
エンドユーザーにアプリケーションを配布するには,MDEファイルを作成します.MDEファイルはMDBファイルから編集可能なモジュールを削除し,コンパイル済みのコードだけで構成されています.MDBファイルよりもサイズが小さくなり,メモリの管理も最適化されるので性能も向上します(図1).
ただし,モジュールの変更や追加といった操作はできなくなります.エンドユーザーに配布するときにMDEファイルに変換して渡せば,プログラムの改ざんなどを防ぐことができます. Office Developer Editionに付属しているようなランタイム版は付属していないので,実行には Access97本体が必要です.
図1
|
「データベースユーティリティ」メニューの 「MDBファイルの作成」を選択 |
作成されたMDEファイル |
●他のフォームを閉じるには
フォームを閉じるには,フォームを開くとき同様,DoCmdオブジェクトを利用します.他のフォームを閉じるには次のようなコードを記述します.
Private Sub Command1_Click() DoCmd.Close acForm,"Form2" End Sub
表1
| 定数 | 意味 |
|---|---|
| acDefault (デフォルト) | アクティブなウィンドウ |
| acForm | フォーム |
| acMacro | マクロ|
| acModule | モジュール |
| acQuery | クエリー |
| acReport | レポート |
| acTable | テーブル |
図2
|
|
|
●フォームを開くときにデータの抽出条件をつける
新しいフォームを開くときに,指定した条件にあったデータだけを表示したいことがあります.フォームのRecordSourceプロパティにSQL文を使う方法もありますが,OpenFormメソッドの引数に条件を指定するだけで,簡単に抽出条件を設定できます.サンプルの「FormSyohin」フォームのRecordSourceプロパティには,テーブル名が指定されています.
「フォームを開く」ボタンのClickイベントプロシージャは次のようなコードが記述されています.
Private Sub Command1_Click() txtSyohin.SetFocus DoCmd.OpenForm "FormSyohin", , , "category='" & txtSyohin.Text & "'" End Sub
DoCmdオブジェクトのOpenFormメソッドの4番目の引数に条件を指定することで,該当するデータだけがフォームに表示されます(図3).条件の指定の仕方はSQLのWHERE条件の指定と同様です.
図3
|
抽出する条件を入力 |
「Category」項目が「クッキー」のものだけを抽出 |
抽出する条件を入力
「Category」項目が「クッキー」のものだけを抽出
●抽出条件をつけたレポートの印刷
前のサンプルと同様の方法を使って,抽出条件を指定してレポートを作成することができます(図4).
「レポートのプレビュー」ボタンのClickイベントプロシージャでは次のように条件を指定しています.
Private Sub cmdPrev_Click() txtSyohin.SetFocus DoCmd.OpenReport "ReportSyohin", acPreview, , "category='" & txtSyohin.Text & "'" End Sub
図4 抽出条件に「クッキー」を指定
条件に合致するデータだけをレポート
●リストをクリックして,カード形式で表示
リスト形式のフォームは複数のデータを参照するには便利ですが,スペースの関係でレコードの詳細データを見るには不便です.リスト形式で選択してからカード形式で参照編集するのは,データベースプログラムの標準的なインターフェイスアーキテクチャです.
カード形式で表示するにはデータをひとつに絞りこんで表示するスタイルがシンプルですが,それだとカード式で表示した後で,移動ボタンを使ってレコードを移動することができません.ここで紹介する方法はフォームを表示した後で該当のレコードに移動しています(図5).
図5
|
リストからレコードを選択してダブルクリック |
クリックされたレコードの詳細を表示 |
次のイベントプロシージャでは,リストフォームの(FormList)商品名をダブルクリックすると,詳細情報を表示した別なフォーム(FormSyosai)を開いています.
Private Sub txtSyohin_DblClick(Cancel As Integer) DoCmd.OpenForm "FormSyosai" End Sub
Private Sub Form_Activate() txtSyohin.SetFocus DoCmd.FindRecord [Forms]![FormList]!txtSyohin.Text, acStart, True, acSearchAll, True End Sub
| 定数 | 意味 |
|---|---|
| acAnywhere | 条件の文字列が,項目のどこかに含まれていれば一致 |
| acEntire (デフォルト) | 条件の文字列と項目の内容が完全に一致 |
| acStart | 条件の文字列と項目の先頭が一致 |
| 定数 | 意味 |
|---|---|
| acDown | 後方向に検索 |
| acSearchAll (デフォルト) | すべてを検索 |
| acUp | 前方向に検索 |
Private Sub Form_Activate()
If [Forms]![FormList]!txtSyohin.Text <> "" Then
txtSyohin.SetFocus
DoCmd.FindRecord [Forms]![FormList]!txtSyohin.Text, ⇒
acStart, True, acSearchAll, True
Else
Dim rs As Recordset
Set rs = Me.RecordsetClone
rs.AddNew
rs.Update
Me.Bookmark = rs.LastModified
rs.Close
End If
End Sub
図6
|
追加用のブランクレコードをクリック |
新しいレコードを作成して移動 |
●フォーム間のレコードセットの同期をとる
2つのフォームが同じデータを参照している場合,特に処理を行なわなくても,片方の変更はただちにもう一方に反映されます(図7).しかし,新しくデータを追加したような場合には,同期をとるために明示的にRequeryメソッドを実行する必要があります
次のイベントプロシージャでは,カード形式のフォーム(FormSyosai)の非アクティブ時に,リストフォーム(FormList)のリクエリーをしています.この処理により,2つのフォームを常に同じ状態に維持することができます.
Private Sub Form_Deactivate() [Forms]![FormList].Requery End Sub
|
カード形式のフォームに新しいデータを入力 |
リストフォームにフォーカスを移動すると変更の内容が反映 |
●フォームの印刷
レポートばかりでなく,フォームも印刷する機能がAccessには用意されています.印刷専用のフォームを作成することで,レポートにもまけないような帳票の作成が可能です(図8).
フォームの印刷にはDoCmdオブジェクトのPrintOut acPagesメソッドを使用します.「印刷」ボタンのイベントプロシージャには次のようなコードが記述されています.
Private Sub cmdPrint_Click() txtSyohin.SetFocus cmdPrint.DisplayWhen = 2 DoCmd.PrintOut acPages, 1, 2, acHigh End Sub
|
図8a 印刷するフォーム |
図8b 印刷されたフォーム |
●テーブルの値を一括して更新する
価格の一律値上げなどの変更は,Data Access Objectを用いてSQLのUPDATE文を実行します.このサンプルでは「更新」ボタンを押すと,テキストボックスに入力された割合だけ商品テーブルの価格をひきあげます(図9).
ボタンのイベントプロシージャには,次のような処理が記述されています.
Private Sub Command1_Click() Dim db As Database Dim wariai As Integer Dim param As String Set db = CurrentDb txtWariai.SetFocus wariai = IIf(txtWariai.Text = "", 0, txtWariai.Text) param = "update Syohin set kouri_kakaku = kouri_kakaku * " & (100 + wariai) / 100 MsgBox "商品テーブルの小売価格を" & (100 + wariai) / 100 & "倍します." db.Execute param End Sub
|
|
|