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
© Copyright 2024 Paperzz