...

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

by user

on
Category: Documents
18

views

Report

Comments

Transcript

マスター・メンテナンス画面を作るコツ
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
Fly UP