マスター・メンテナンス画面を作るコツ

Access 2000 で学ぶ業務アプリケーション開発―経理システムを作ってみよう―
第2回
マスター・メンテナンス画面
を作るコツ
金宏 和實
経理システムを題材に,Access 2000による業務アプリケーシ
ョンの開発に必要な知識やテクニックを学んでいこう,という
この連載。いよいよ第 2回目です。第 1回では,経理システム
ります。リンクを作成せずにプログラムで対応することもでき
にはどんなテーブルが必要か考え,マスターとなるテーブルを
ますが,今回作成するのはスタンドアロンの経理システムです。
作成しました(表 1)
。今回は,それらマスター・テーブルをメ
ややこしいことはしなくてもいいでしょう。
ンテナンスする画面を作っていきましょう。
Access 2000で kei.mdbを開いてください。続いて[ファイル]
第 1 回 を読 んでない方 は,本 誌 Web サイト(http://soft
→[外部データの取り込み]→[テーブルのリンク]で,kei_dt.mdb
ware.nikkeibp.co.jp/)にあるダウンロード・ページから,Access
を開き,すべてのテーブルを選択します。これでリンク終了で
のデータベース・ファイルkei_dt.mdbとkei.mdbをダウンロード
す。リンクされたテーブルには矢印マークが付いていることが
してください。
分かりますね(図 1)
。
「ではマスター・メンテナンスの画面を
作成!」としたいところですが,慌てない慌てない。その前に
まずはクエリーを作る
クエリーを作りましょう。
さて,前回説明したようにkei_dt.mdbにはテーブルのみを作
成し,テーブル以外のオブジェクト(フォームやクエリーなど
のシステム・オブジェクト)は kei.mdbに作成します* 1。その
た め ,kei.mdb で kei_dt.mdb 上 の テ ー ブ ル を 扱 う に は ,
kei_dt.mdbに対して「テーブルのリンク」を設定する必要があ
ワンポイント・レッスン
フォームのレコードソースは全部クエリーにしよう
フォームを作成するとき,そのフォームに何のデータを表示
するか,あらかじめ指定する必要があります。この基となるデ
表 1●経理システムで作成するマスター・テーブル
名前
テーブル名
目的
科目マスター
M_ 科目
科目の定義や属性を格納
相手先マスター
M_ 相手先
相手先コードと名称を格納
摘要マスター
M_ 摘要
摘要コードと名称を格納
消費税率マスター
M_ 消費税率
消費税率や適用開始日などを格納
基本情報マスター
M_ 基本情報
会社名や年度情報などを格納
科目残高マスター
M_ 科目残高
科目別の残高情報を格納
相手先別残高マスター
M_ 相手先別残高
相手先別科目別の残高情報を格納
金宏 和實 (かねひろ かずみ)
イーザー(http://www.easier.co.jp/)代表取締役副社長。業務アプリ
ケーションの開発に携わって17 年。富山県高岡市出身かつ在住。地
方でライター活動ができるのは,宅配便とインターネットの普及のお
陰と感謝している。著書に「Access2000 Client/Serverアプリケーシ
ョン開発テクニック」
(秀和システム発行)など。本誌Webスペシャ
ル(http://software.nikkeibp.co.jp/software/special/special.html)の
「こうしろうのMindStorms日記」もよろしく!
164
H 2000 年 10 月号
図 1● kei.mdb にkei_dt.mdb のテーブルをリンクさせたと
ころ
マスター・メンテナンス画面を作るコツ
ータ群のことを「レコードソ
ース」と呼びます。相手先マ
図 2●相手先マスターのメンテナンス用クエリー「Q_相
手先 _保守」を作成
表 2● Access 2000 のクエリーに対応する SQL ステー
トメント
スターや摘要マスターなどの
種類
SQL ステートメント
単純な構造のテーブルをメン
選択クエリー
SELECT
テナンスするフォームなら,
追加クエリー
INSERT
レコードソースにテーブルを
更新クエリー
UPDATE
削除クエリー
DELETE
直接指定しても問題はありま
せん。しかし,複数のテーブ
ルを連結してレコードソース
図 3●クエリー「Q_ 相手先 _ 保守」のSQL ビュー
として使いたい時や,何らか
の条件で選択したレコードを
フォームに表示させたい場合
はクエリーを作成します。こ
のとき,
「あるフォームはクエ
リーをレコードソースに,別
のフォームはテーブルをレコードソースに」のような作り方を
テーブル「M_相手先」から相手先 CDと相手先名を選択し,並
すると,後でメンテナンスする場合に混乱します。一番いいの
べ替え句のORDER BYを指定していることがわかります。です
は,できるだけシンプルな構造にしておくこと。そこで,フォ
から,この場合は「選択クエリー」に相当するわけです。
ームのレコードソースは,すべてクエリーを指定するといいで
しょう。
ワンポイント・レッスン
SQL は習うより慣れろ
まず,相手先マスター(M_相手先)のレコードをメンテナ
Accessでクエリーを使うとき,必ず SQLビューで SQL 文を
ンス(追加/修正/削除)する処理を作成します。[クエリー]→
確認する癖をつけてください。データベース・プログラミング
[新規作成]で「デザイン・ビュー」を選んでください。
「テーブ
において SQLの理解は必要不可欠です。クエリーを作成して
ルの表示」ダイアログで M_相手先を選択し,図 2のようにフ
SQL ビューに切り替えれば,Accessが自動作成した SQL文を
ィールドは相手先 CD(相手先コード)と相手先名の二つを,
教えてくれます。これを眺めながら少しずつ覚えていくように
並べ替え順序は相手先 CDの昇順に設定します。作成したら,
しましょう。
クエリー「Q_相手先 _保守」という名前で保存してください。
ただしここで一つ注意。データベース製品はそれぞれ一部に
ここで,クエリーについて少し説明しておきましょう。Access
独自仕様を抱えているので,SQL の標準仕様と比べるとどれも
2000のクエリーは,
「選択クエリー」
「追加クエリー」
「更新ク
「なまって」います。Accessも例外ではありません。でも,関
エ リ ー 」「削 除 ク エ リ ー 」に 分 か れ ,SQL * 2 の SELECT や
西弁の人と富山弁の人間が会話をしても,それなりにコミュニ
UPDATEなどの各ステートメントに対応しています(表 2)
。ク
ケーションはとれますよね。SQLも同じです。一つでもデータ
エリー「Q_相手先 _保守」をデザイン・ビューで開いて,SQL
ベース製品の SQLをマスターすれば,ほかのデータベースを扱
ビューに切り替えてみてください(図 3)
。SELECT文を使って,
うことはそんなに難しくありません。
* 1 Accessでデータベース・ファイル
格協会)が標準化している。データ
詳しくは2000年 9月号本連載の183ペ
定 義 言 語 ( DDL: Data Definition
(mdbファイル)を作成するとき,テ
ージ参照。
* 2 SQLは,1970年代に開発された,
Language)と デ ー タ 操 作 言 語
ーブルを格納した mdbファイルとそ
リレーショナル・データベース(RDB) ( DML: Data Manipulation Lanれ以外のオブジェクトを格納したmdb
を操作するための言語。現在は,ISO
guage)とに分かれる。
ファイルを分けたほうが,ファイル
が壊れたときなどの障害対策になる。 (国際標準化機構)や ANSI(米国規
H 2000 年 10 月号
165
Access 2000で学ぶ業務アプリケーション開発
― 経理システムを作ってみよう―
クエリーからフォームを作成する
ドを使用してフォームを作成する]とし,テーブル/クエリで,
Accessには,テーブルのレコードやクエリーで抽出したレコ
Q_相手先 _保守を選択。フィールドは,相手先 CD,相手先名
ードを簡単な操作でフォームに表示できる「フォーム・ウィザ
の二つを選びます。フォーム名を「F_相手先 _保守」として保
ード」という機能があります。このウィザード(魔法使い)に
存してください。テーブルにあらかじめ入力しておいたレコー
は,開発者の気に入るようなフォームを一瞬で作れるほどの
ドが2件表示されることがわかりますね(図 4)
。テーブル定義
「魔力」は残念なが
時にIME入力モードを設定したので相手先 CDの入力時には漢
らありませんが,
図 4●フォーム「F_ 相手先 _保守」を作成
「タタキ台」として
使うなら有効です。
字変換がオフになり* 4,相手先名にフォーカスが移動するとオ
ンになることを確認してください。
「これで相手先マスターの保守フォームは完成!」と言いた
さっそく,ウィザ
いところですが,それではただのAccess入門になってしまいま
ードを使って,ク
す。本連載はシステム開発入門ですから,
「Accessについて何
エリー「Q_相手先
にも知らない人」でもシステムを使えるようにしなければなり
_ 保 守 」を基 に
ません。例えば,ウィザードで作ったフォームに表示されてい
「表 形 式 」 * 3 のフ
るレコードを削除するには,削除したいレコードを選択して[編
ォームを作成して
集]→[削除]とするか,ツールバーの削除ボタンをクリックする
みましょう。[フォ
必要があります。Accessの操作やツールバーのボタンの機能に
ーム]→ [ウィザー
ついて知っていないといけないわけです。でも,経理システム
を実際に運用するユーザーはどうでしょう。Accessを使ったこ
図 5●フォーム「F_ 相手先 _保守」にコマンドボタンとチェックボック
スを二つ追加
とがない人もいれば,
「Accessなんて覚えたくない」と言い張る
人もいるでしょう。そこで,分かりやすいボタンを作ってレコ
ードを操作できるようにします。先ほど作成したフォーム「F_
リスト 1●削除ボタンをクリックしたときのコード
Private Sub btn 削除 _Click()
On Error Resume Next
表 3●フォーム「F_ 相手先 _保守」に追加する三つのコマンドボタン
名前
標題
目的
btn 削除
削除(&D)
現在行のレコードを削除する
btn 追加
追加(&A)
新規レコードに移動する
btn 終了
終了(&X)
現在行のレコードを保存しフォームを閉じる
*3
Accessのフォーム・ウィザードで
は,フォームのレイアウトとして「単
票形式」
「表形式」
「データシート」
「帳票形式」のいずれかを選択でき
る。
* 4 テーブル作成時のIME設定につい
166
H 2000 年 10 月号
ては,2000年 9月号本連載 188ページ
を参照。
If MsgBox("データを削除しますか", _
(vbYesNo + vbDefaultButton2 + vbInformation), _
"削除") = vbYes Then
Me.Undo
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
End If
End Sub
(1)
(2)
(3)
(4)
(5)
(6)
マスター・メンテナンス画面を作るコツ
相手先 _保守」をデザイン・ビューで開き,表 3のコマンドボ
は困りますので,安全な
タンを三つ,さらにチェックボックスを二つ(名前はchkUpdate
方(ここでは「いいえ」
)
とchkClose)
,追加してください(図 5,詳細は後述)
。
をデフォルト・ボタンに
ワンポイント・レッスン
アクセス・キーは忘れずに
表 3 の標題のカッコの中はアクセス・キーです。例えば削除
図 6●デフォルト・ボタンのフォーカ
スは安全な方に設定する
指 定 します。(4)と(6)の
DoCmd.SetWarnings は,
Accessが出すメッセージ
を非表示(False)または
ボタンであれば,Altキーを押しながらD キーを押せば削除ボタ
表 示 (True)する処 理 。
ンをクリックするのと同じ操作になります。経理システムのよ
(5)で実際にレコードを削除します。
うな業務アプリケーションにおいて,マウスでないと操作でき
さて,一番分かりにくいのが(3)の Me.Undoでしょう。Undo
ないボタンは,ユーザーのタイピングのリズムを乱し,入力作
はなんとなく「直前の操作を取り消す」ことだなと推測できま
業の効率を低下させてしまうことがあります。両手をキーボー
す。疑問点は「Meってだれ?」と「どうして削除の前に直前
ドの上に置いたまま使えるように,すべてのボタンにアクセス・
の操作を取り消す必要があるの?」の二つでしょう。
キーを指定するようにしてください。
削除ボタンがクリックされた時のコードを記述していきまし
ワンポイント・レッスン
Me.Undo はなぜ必要か?
ょう。削除ボタンを右クリックし,プルダウンメニューからプ
「ミーざます!」が口ぐせのマンガ・キャクラタ「イヤミ」
ロパティを選択。イベント・タブでクリック時のコードを入力
を思い出す方は,読者の何割ぐらいでしょうか? Meは「ミー」
します(リスト1)
。もちろん言語はVBA(Visual Basic for Appli-
って言っている「イヤミ」自身,すなわちオブジェクト自身を
cations)です。
表します。フォーム・クラス* 5 のモジュールでmeと書くと,フ
コードの中身を説明しましょう。まず(1)のOn Error Resume
ォーム自身を示します。レポート・クラスのモジュールで me
Nextは,実行時にエラーが発生した場合,プログラムを中断さ
と書けば,レポート自身を示します。Me.Undoはフォーム上で
せず,エラーが発生したステートメントの次のステートメント
Escキーを押すのと同様の効果があります。では,どうしてレ
から実行を継続させるように指定するものです。(2)はメッセー
コードを削除する前に,直前の操作を取り消す必要があるので
ジボックスを表示して本当に削除していいかを確認する処理。
しょう?
vbYesNoで「はい」と「いいえ」の二つのボタンを表示して,
例えば,レコードを削除する前にそのレコードを変更してい
vbDefaultButton2で「いいえ」をデフォルト・ボタンに設定して
たとします。それも主キー* 6 の値を消したり,他のレコードと
います。デフォルト・ボタンは点線で囲まれてフォーカスを持
重複する値を入力したような,Accessがエラーと判断するよ
ちます(図 6)
。フォーカスのあるボタンはマウスでクリックし
うな変更だったとします。この場合,いくら削除ボタンを押し
なくても,Enterキーを押すとそのボタンがクリックされたこと
ても,Accessがエラーを出し続ける限りレコードを削除するこ
になります。vbDefaultButton2を省略すると「はい」がデフォル
とはできません。それでは困るので,Undoを実行して変更を
ト・ボタンになってしまいます。ユーザーは開発者が考えるほ
破棄する必要があるのです。
ど丁 寧 にシステムを使 ってはくれません。よそ見 しながら,
Enterキーを「パンパン」と叩いて必要なデータまで削除されて
削除ボタンができたら,追加ボタンをクリックした処理も記
* 5 Accessでは,フォームやレポート
をクラス・モジュールとして定義す
る。
* 6 主キーは,テーブルの行(レコー
ド)をユニークに判別するためのフ
ィールド。
H 2000 年 10 月号
167
Access 2000で学ぶ業務アプリケーション開発
― 経理システムを作ってみよう―
リスト 2●追加ボタンをクリックしたときのコード
Private Sub btn 追加 _Click()
On Error Resume Next
DoCmd.RunCommand acCmdRecordsGoToNew
End Sub
了ボタンの目的は「現在カーソルのある行のレコードを保存し,
フォームを閉じる」ことです。フォームを閉じるだけなら,わ
ざわざ終了ボタンを設ける必要はありません。ウィンドウ右上
の Xボタンで閉じてもらえばいいのです。しかし,レコードを
保存するためには,各項目に適切な値が入力されていなくては
なりません。例えば,相手先名だけを入力して相手先 CDが未
入力のままフォーカスを次のレコードに移動しようとすると,
述 しておきましょう(リスト 2)。DoCmd オブジェクト * 7 の
Accessは「インデックスまたは主キーには,Null値を使用でき
RunCommandメソッドにacCmdRecordsGoToNew(新規レコー
ません」というエラーを表示します。Accessに不慣れなユーザ
ドへの移動を意味する定数)を指定して新規レコードに移動し
ーにとってはギョッとする内容ですよね。ユーザー・インタフ
ています。
ェースというと,
「デザインの統一性」や「Windows標準への
準拠」などが頭に浮かびますが,
「ユーザーがするべきことを,
終了のテクニック
ユーザーにとって平易な言葉で伝える」ことがわかりやすいイ
次に,終了ボタンがクリックされた時の処理を考えます。終
ンタフェースへの第一歩です。
そこで,レコードを更新する前に入力値をチェックする処理
リスト 3●レコードを更新する前に行う処理。未入力の項目がある場合に
メッセージを表示する
Private Sub Form_BeforeUpdate(Cancel As Integer)
[chkUpdate] = True
(1)
If IsNull([相手先 CD]) Or Trim([相手先 CD]) & "" = "" Then
MsgBox "相手先 CD を入力して下さい"
DoCmd.GoToControl "相手先 CD"
DoCmd.CancelEvent
[chkUpdate] = False
Exit Sub
End If
If [相手先 CD] <= 0 Then
MsgBox "相手先 CD には 1 以上の値を入力して下さい"
DoCmd.GoToControl "相手先 CD"
DoCmd.CancelEvent
[chkUpdate] = False
Exit Sub
End If
If IsNull([相手先名]) Or Trim([相手先名]) & "" = "" Then
MsgBox "相手先名を入力して下さい"
DoCmd.GoToControl "相手先名"
DoCmd.CancelEvent
[chkUpdate] = False
Exit Sub
End If
End Sub
* 7 DoCmd オブジェクトのメソッドを
使用すると,VBAから Access固有の
アクションを実行できる。Accessが
出力するメッセージを制御したり,フ
ォームを開いたり,マウス・ポイン
タを砂時計に変更するなどの操作は
168
H 2000 年 10 月号
DoCmdオブジェクトを利用する。
リスト 4●終了ボタンをクリックしたときのコード
Private Sub btn 終了 _Click()
If MsgBox("処理を終了します。よろしいですか", _
(vbYesNo + vbExclamation), "処理終了") = vbNo Then (1)
Exit Sub
End If
[chkUpdate] = True
DoCmd.RunCommand acCmdSaveRecord
If [chkUpdate] Then
[chkClose] = True
DoCmd.Close acForm, ctFormName_M
End If
End Sub
リスト 5● General Section のコード
Option Explicit
Const ctFormName_M = "F_ 相手先 _ 保守"
(2)
(3)
(4)
(5)
マスター・メンテナンス画面を作るコツ
を追加しましょう。レコード更新前には,フォームの Before-
リスト 6●フォームを閉じるときのコード
Updateイベントが発生するので,このイベントにコードを記述
します(リスト 3)
。ここで思い出してほしいのが,図 5で配置
したチェックボックス(chkUpdate)です(1)。このチェックボ
ックスは,入力値が適切かどうか判定するのに使います。具体
的には,入力に漏れがなくレコードが更新可能な場合はchkUpdateにTrueを,更新不可の時はFalseを代入します。
Private Sub Form_Unload(Cancel As Integer)
If Not [chkClose] Then
DoCmd.CancelEvent
MsgBox "終了ボタンを押して下さい"
Exit Sub
End If
End Sub
リスト 3の入力値チェック処理は,相手先 CDのチェックに
二つも If文を使って,ちょっと「くどい」ですね。これは筆者
の性格がくどいからではありません。最初のIf文の,IsNull([相
す。そこで,終了ボタンがクリックされたらレコードを保存す
手先 CD])が真(True)になるのは相手先 CDフィールドに何も
るアクションを起こし,入力値が適切でなければエラー・メッ
入力せずに Tabキーを押した場合です。また,Trim([相手先
セージを出力,入力値が適切でテーブルに保存できた場合だけ
CD]) & " " = " "となるのは,いったん相手先 CDフィールドに値
フォームを閉じるようにします。ここでchkCloseを使うのです。
を入力した後,Deleteキーで削除した場合です。つまり,Null
フォームを閉じる前には,Form_Unloadイベントが発生するの
でも長さ0の文字列でもない値が入力されていることを確認し
で,Form_UnloadイベントでchkCloseの値を評価し,Trueでな
たうえで,次のIf文で0以下かチェックしているのです。
い時(終了ボタン以外の方法でフォームを閉じようとした時)
入力値チェックの処理が記述できたら,いよいよ終了ボタン
をクリックした時の処理です(リスト4)
。(1)でメッセージボッ
にはフォームを閉じるイベントをキャンセルするようにします
(リスト6)
。
クスを表示して確認を求めています。(5)でフォームを閉じま
このようにフォームを閉じるときにチェックボックスを使う
す。CtFormName_Mは General Sectionの宣言部で定数宣言し
テクニックは,テーブルをメンテナンスするときにはよく使う
たフォーム名(F_相手先 _保守)です(リスト 5)
。リスト 4で
のでぜひ覚えておいてください。なお,チェックボックスはユ
分かりにくいのは,(2)(3)(4)でしょう。(2)では,RunCommand
ーザーに見せる必要のない仕掛けですから,非表示に設定(可
メソッドにレコードの保存を意味する定数(acCmdSaveRecord)
視プロパティを「いいえ」に)しておくことをお忘れなく。
を指定して強制的に現在行のレコードを保存しています。レコ
ード更新時には前述の Form_BeforeUpdateイベントが発生し,
入力値の検査が行われます。(3)でchkUpdateチェックボックス
エラー処理を実装しよう
フォーム「F_相手先 _保守」は,ほぼ完成しました。しかし,
がTrueか否か判断しています。(4)ではもう一つのチェックボッ
まだ問題があります。主キーである相手先 CDに重複する値を
クスchkCloseを使用しています。
入力してフォーカスを次のレコードへ移動しようとすると,
「入
適切な値を入力し更新が行われると,chkCloseに Trueが代
力値を変更するか,テーブルの定義を変更しなさい」というエ
入されますが(既定値はFalse)
,なぜここでchkCloseが必要な
ラー・メッセージが表示されてしまうのです。これは,Access
のでしょうか? 「F_相手先 _保守」フォームを閉じる方法を考
のデータベース・エンジンJetが返すエラーです。ユーザーには
えてみましょう。終了ボタンと Xボタンと,フォームのメニュ
見せたくないメッセージですね。アプリケーション側で,重複
ーから「閉じる」を選ぶの,全部で3種類あります。このうち,
する値をチェックしてエラー・メッセージを表示したいと思い
プログラムで制御できるのは終了ボタンが押された場合だけで
ます。どうすればいいのでしょうか? 相手先 CDが入力されるた
H 2000 年 10 月号
169
Access 2000で学ぶ業務アプリケーション開発
― 経理システムを作ってみよう―
びに,入力済みのレコードに同一の相手先 CDが存在しないか
主キー重複のエラー番号は3022です* 8。3022という数値をそ
チェックする方法が考えられますが,データ件数が増えたら効
のまま使うと読みにくいプログラムになってしまうので,General
率の悪い処理になってしまいます。Jetの返すエラーをトラップ
Sectionの宣言部に次の定数宣言を追加してください。
して,Jetが長ったらしいメッセージを出す前にもっとわかりや
すいメッセージを表示すればいいでしょう。
Const ERR_DUPLICATE = 3022
さらに,フォームのErrorイベントに,このエラーが発生したら
「相手先 CDが重複しています」とメッセージを表示し,レコー
ドの更新をキャンセルするコードを記述します(リスト7)
。フ
リスト 7●主キー重複のエラーをトラップするためのコード
Private Sub Form_Error(DataErr As Integer,
Response As Integer)
If DataErr = ERR_DUPLICATE Then
MsgBox "相手先 CD が重複しています"
相手先 CD.SetFocus
[chkUpdate] = False
DoCmd.CancelEvent
Response = acDataErrContinue
End If
End Sub
ォーカスを次のレコードへ移動することで発生する,テーブル
_
更新時の主キー重複エラーはこれでトラップできます。しかし,
終了ボタンをクリックした時の主キー重複エラー処理は,Sub
btn終了 _Click( ) ∼ End Subに記述する必要があります。リスト
4に,
On Error GoTo btn終了 _Click_Error
と,
btn 終了 _Click_Error:
If Err = ERR_DUPLICATE Then
リスト 8●標準モジュール(mdl 標準)に削除/追加処理を集めた
Option Compare Database
Option Explicit
Public Const ERR_DUPLICATE = 3022
Function 明細 _ 削除(FormName) As Integer
On Error Resume Next
明細 _ 削除 = True
If MsgBox("データを削除しますか", _
(vbYesNo + vbDefaultButton2 + vbInformation),
"削除") = vbYes Then
Forms(FormName).Undo
DoCmd.SetWarnings False
DoCmd.RunCommand acCmdDeleteRecord
DoCmd.SetWarnings True
Else
明細 _ 削除 = False
End If
End Function
Function 明細 _ 追加() As Integer
On Error Resume Next
明細 _ 追加 = True
DoCmd.RunCommand acCmdRecordsGoToNew
End Function
* 8 もちろんこの番号はAccess 2000の
エラー番号である。
170
H 2000 年 10 月号
MsgBox "相手先 CD が重複しています"
相手先 CD.SetFocus
[chkUpdate] = False
DoCmd.CancelEvent
End If
という処理を追加しておきましょう。
_
標準モジュールで同一処理をまとめる
やっと相手先マスターをメンテナンスするフォームが出来ま
したね! 摘要マスターは相手先マスターと同じ構造ですから,ク
エリー「Q_摘要 _保守」を作成し,F_相手先 _保守をコピーし
てご自分で作ってください,と言いたいところですが,それで
はダメ,ダメ。
プログラムにはバグがつきものです。人間が作るものですか
ら,バグがない,なんてことはありえません。プログラムをテ
ストしてバグをつぶすのは当たり前のこと。プロを目指すなら,
その前にバグの発生を抑えることを考えましょう。バグの量は
ステップ数(コードの行数)に比例します。ですから,ステッ
マスター・メンテナンス画面を作るコツ
プ数を減らせばバグを減らせるわけです。そこで,
「共通して使
う処理は標準モジュールに作成し,各フォームから呼び出す」
図 7●フォーム「F_ 科目 _保守」でオプション・グループとコンボボッ
クスを配置
ようにしましょう。こうすることで,あっちこっちのモジュー
ルに同じ処理を記述して発生する単純なタイプ・ミスを減らす
ことができます。
まず,標準モジュール(mdl共通)を作成します(リスト8)
。
レコードを削除する処理と新規レコードに移動する処理です。
主キー重複を表すエラー番号も,パブリック定数としてGeneral
sectionの宣言部に記述しました。また,フォーム「F_相手先 _
保守」を次のように修正します。
Private Sub btn削除 _Click()
Dim intRet As Integer
intRet = 明細 _ 削除(ctFormName_M)
End Sub
目マスターの「BSPL区分」というフィールドは,レコードの値
Private Sub btn追加 _Click()
として 0のときは BS(貸借対照表)
,1のときは PL(損益計算
Dim intRet As Integer
書)を表します。これをオプションボタンで簡単に選択できる
intRet = 明細 _ 追加()
ようにするには,VBだと条件分岐文などを使ってコードを記述
End Sub
しなければなりません。でもAccessならウィザードを使ってプ
削除ボタンと追加ボタンのクリック時の処理は,標準モジュー
ロパティを設定していくだけで済みます。実際に,科目マスタ
ルの関数を呼び出すように修正しました。削除の処理では,前
ーの保守フォーム「F_科目 _保守」で,レコードに連結したオ
述のフォームのUndoができるようにフォーム名を引数として明
プションボタンとコンボボックスを作ってみましょう。
細 _削除( )関数に渡しています。フォーム・モジュールに記述
まず,相手先マスターと同様に,クエリー「Q_科目 _保守」
した主キー重複のエラー番号の定数宣言は,標準モジュールと
を作成します。クエリーは科目マスター(M_科目)の全レコ
重複しますので削除しておいてください。
ード,全フィールドを選択し,科目 CDの昇順に並べ替える選
さあ,これでマスター・メンテナンスのコードはグっとシン
択クエリーとして作成します。続いてフォーム・ウィザードで,
プルになったはずです。今までの手順の復習を兼ねて,ぜひ自
フォーム「F_科目 _保守」を作成します。レコードソースはク
分で摘要マスターのメンテナンス・フォームを作成してみてく
エリー「Q_科目 _保守」
,レイアウトは「表形式」を選択して
ださい。クエリーを先に作ることを忘れないでくださいね。
ください。フォームには,削除,追加,終了の三つのコマンド
ボタンと二つのチェックボックスも配置しましょう。実装する
コントロールを使って複雑なフォームを作る
コードも,フォーム「F_相手先 _保守」と同様です。
最後に,マスター・メンテナンス画面にもっと複雑なデザイ
フォーム「F_科目 _保守」では,前述の「BSPL区分」
,科目
ンを実装してみましょう。フォームの作成で,Accessが Visual
の残高を借方残と貸方残のどちらで計算するかを指定するフィ
Basic(VB)より優位なのは,オプションボタンやコンボボック
ールド「借方貸方区分」
,相手先別に残高を管理するか否かを
スを容易にテーブルのレコードと連結できる点です。例えば科
指定するフィールド「相手先有無」の三つを,それぞれオプシ
H 2000 年 10 月号
171
マスター・メンテナンス画面を作るコツ
Access 2000で学ぶ業務アプリケーション開発
― 経理システムを作ってみよう―
ョン・グループとして作成します(図 7)
。ツールボックスから
図 8●完成したフォーム「F_ 科目 _保守」
オプション・グループを選択して,フォームの適当な位置に配
置してください。後はウィザードに従って次のように,プロパ
ティを設定していくだけです。
1)ラベル名はoptBSとoptPLの二つを設定
2)既定のオプションは設定しない
3)optBSの値は0,optPLの値は1とする
4)オプションの値は,「BSPL区分」フィールドに保存
5)オプション・ボタンのスタイルは「枠囲み」とする
6)オプション・グループ名はfraBSPLとする
借方貸方区分(0:借方残,1:貸方残)と相手先有無(0:相
手先無し,1:相手先有り)も同様にオプションボタンとして
作成してください。
「選択可能なフィールド」に列 1を指定したので,科目マス
ター(M_科目)のフィールド「税計算区分」には,クエリー
一方,消費税の計算にかかわるフィールド「税計算区分」と
「Q_科目 _保守」を経由して,0/1/2のいずれかの値(選択され
「税区分」はコンボボックスとして作成します。税計算区分は
た値)が保存されます。また,列幅プロパティで 1列目を 0cm
消費税を「外税で計算する」か「内税で計算する」か,あるい
に設定しているので,コンボボックスに表示される値は 2列目
は「計算しない」という区分です。こちらもオプション・グル
の文字列です。
ープと同じく,ツールボックスからコンボボックスを選択して,
税区分も同様にコンボボックスとして作成しておきましょう。
フォームの適当な位置に配置し,ウィザードに従って次のよう
税区分は伝票入力処理で消費税を計算する時に「仮払消費税」
にプロパティを設定していきます。
として計算するか,
「仮受消費税」として計算するかの区分で
1)「表示する値をここで指定する」を選択
す。経費関係の科目は「仮払」
,売上関係の科目は「仮受」と
2)「リストの列数:」に2を入力
なります。関連付けるフィールドを「税区分」とすることと,
3)「列 1」に0,「列 2」に「計算しない」と入力
値集合ソースを「0;"対象外";1;"仮払";2;"仮受"」とする以外のプ
4) 次行に移動して「列 1」に1,
「列 2」に「外税計算」と入力
ロパティは,税計算区分と同様です。
5) 次行に移動して「列 1」に2,
「列 2」に「内税計算」と入力
フォーム「
「F_科目 _保守」は図 8のようにできましたでしょ
6)「選択可能なフィールド」に列 1を指定
うか。テキストボックスと,コンボボックスやオプションボタ
7)「次のフィールドに保存する」でフィールド「税計算区分」
ン,チェックボックスを使い分けることで,初心者ユーザーで
を選択
も操作しやすいフォームが作成できることが理解できたと思い
オプション・グループと異なるのは,作成したコンボボック
ます。
スのプロパティを開き,さらに細かい値を設定するところでし
ょう。
☆ ☆ ☆
さて,私に割り当てられた誌面の残高が底をついてしまいま
1)「名前」に「税計算区分」と入力
した。次回は,科目マスターと科目残高マスターの関係や,不
2)「列幅」に「0cm;2.542cm」と入力
一致クエリーなどについて触れ,いよいよ伝票入力処理を作成
3)「既定値」に「= 0」と入力
していきましょう。ではまた!
172
H 2000 年 10 月号
A