Visual Basic 業務アプリ構築法 第10回

データベース操作の基礎 簡易住所録を作る(3)
長谷川裕行
1998/11/24

長谷川 裕行 (はせがわ ひろゆき)
有限会社 手國堂 代表取締役
http://www.hirop.com/
テクニカルライターとして活躍。プログラミングに関する著書多数、DB Magazineなどにも多くの記事を提供している。

VBではデータベースを簡単に扱えますが、それでもDataコントロールやテキストボックスなどの設定と連携を適切に行うには、データベースにアクセスする仕組みを理解していなければなりません。
実はVBには、もっと簡単にデータベースを扱うアプリケーションを作る手段が用意されています。データフォームウィザードです。難しい仕組みを一切気にかけることなく、データベースにアクセスできます。



データベースとユーザーインタフェース

どのような場合も、ユーザーインタフェースの設計は非常に重要です。データベース・アプリケーションでもそれは変わりません。しかし単純な処理に、設計の手間をかけたくはないものです。


- ポイントはフォームのデザイン -

住所録のデータベースを使い、簡単なアプリケーションを作る工程を2回にわたって紹介してきました。VBでデータベースを扱う場合、Accessのmdbファイルなら、Dataオブジェクトを使って手軽にアプリケーションを作れます。
データベース・アプリケーションの重要なポイントは、つまるところユーザーインタフェース――つまりフォームのデザインです。テキストボックスやDBGridなどのコントロールとコマンドボタンをうまく配置し、DataFieldプロパティを設定しさえすれば、後はどうにでもなってしまいます。
特にサンプルとして取り上げた住所録のような単純な構造のデータベースでは、フォームの設計がすべてと言っても過言ではないでしょう。



- フォームの自動生成 -

これを逆に見れば、いくら内部の処理がうまくできていても、フォームのデザインで失敗すると使いにくいアプリケーションになってしまう、ということです。
このことはデータベースに限らず、どんなアプリケーションにも言えます。が、特にデータベースのようにたくさんのフィールドを1画面に表示し、それらを提示したりユーザーに内容を書き換えさせたりする処理では、ユーザーに対する親和感が非常に重要になってきます。
これまでは、テキストボックスなどのコントロールを逐一フォームに貼り付け、プロパティを設定してコードを記述する、という手法を紹介してきました。が、実はVBには、もっと簡単にデータベース・アプリケーションのフォームを作る機能が用意されています。「データフォームウィザード」です。



データフォームウィザード

データフォームウィザードは、その名のとおりデータベースを操作するためのフォームを、ウィザード形式で簡単に生成するための機能です。住所録テーブルで試してみましょう。


- データフォームウィザードの組み込み -

データフォームウィザードはVBのアドインツールなので、VBのインストール時に、アドインツールとしてインストールしておかなければなりません。その後、アドインマネージャによって組み込みます。操作は、以下のとおりです。
(1) メニューから「アドイン(A)」→「アドインマネージャ(A)」を選択する
(2) 利用可能なアドイン」から"VB6 データフォームウィザード"を選択する(画面1)
(3) ロード方法を指定する
ロード方法のグループでは「ロード/アンロード(L)」「起動時にロード(S)」「コマンドライン(C)」が選択できます。違いは以下のとおりです。
ロード/アンロード(L):ダイアログボックスを閉じた直後に、選択したアドインが読み込まれる
起動時にロード(S):次回VBを起動したときから、起動のたびに選択したアドインが読み込まれる
コマンドライン(C):VBをコマンドラインまたはスクリプトから実行させた場合に、選択したアドインが読み込まれる
ここではその場で実行させたいので、「ロード/アンロード(L)」をチェックして[OK]をクリックします。
これで、データフォームウィザードが利用できるようになりました。

画面1:データフォームウィザードを選択する


- データフォームウィザードでフォームを作る -

データフォームウィザードを使って、住所録を表示するアプリケーションを作ってみましょう。プロジェクトを新規作成します。プロジェクトを新規作成すると、無地のフォーム"Form1"が表示されますが、ここではウィザードでフォームを作るので、このフォームは使用しません。
元になるデータベースはこれまで同様"C:\Db"フォルダに保存した"Addr01.mdb"で、その中の「T_住所録」テーブルをアクセスすることにします。

(1) メニューから「アドイン(A)」→「データフォームウィザード...」を選択する
画面2のようにデータフォームウィザードが起動します。データフォームウィザードでは、データベースの設定などをプロファイルとして保存し、再利用できます。この画面で、既存のプロファイルを読み込むこともできますが、最初は既存プロファイルが存在しないので、(なし)と表示された状態のまま[次へ]をクリックします。

画面2:データフォームウィザードが起動する
 
(2) 画面3のようになるので、リストからアクセスするデータベースの種類を選択する
mdbファイルをアクセスするので、ここでは"Access"を選択して[次へ]をクリックします。

画面3:データベースの種類を選択する
 
(3) 画面4のようになるので、「データベース名(D):」にアクセスするデータベース・ファイルの名前を入力する
[参照]ボタンをクリックし、リストから選択すると便利です。ここでは"C:\Db\Addr01.mdb"を選択して[開く]をクリックし、[次へ]をクリックします。

画面4:データベース・ファイル(mdbファイル)を指定する
 
(4) 作成するフォームの名前、表示形式(レイアウト)などを指定する
「フォームの名前を指定してください。(W)」に、フォーム名を入力します。ここでは"frmAddress"とします。
「フォームレイアウト(F)」では、レコードセットの表示形式を指定します。単一レコードは1画面1レコードの形式、グリッドは一覧表形式です。販売記録や見積データなど複雑な構成のレコードセットなら、「マスター/詳細」形式も指定できます。
ここでは「単一レコード」を選択します。
「連結の種類」では、データベースとの接続をどの形態で行うかを指定します。「ADO データ コントロール(D)」は、ADODataコントロールを使ってデータベースにアクセスします。「ADO コード(O)」では、ADOを介してデータベースにアクセスするコードを生成します。「クラス(C)」では、データクラスを使用して、データベースにアクセスします。
ここでは「ADO データ コントロール(D)」をONにして[次へ]をクリックしましょう。

画面5:フォーム名や表示形式などを指定する
 
(5) レコードソースとフィールドを指定する(画面6)
「レコードソース(R)」には、[▼]をクリックして表示されるレコードソース(テーブルまたは選択クエリー)の一覧から、アクセスしたいレコードソースを選択します。ここでは「T_住所録」しか存在しないので、それを選択します。
「使用できるフィールド(A):」にレコードセット内のフィールド一覧が表示されるので、そこからフォームに表示させたいフィールドを選択して[>]をクリックし、「選択されたフィールド(S):」に移動させます。「選択されたフィールド(S):」の一覧は、[↑][↓]をクリックして順序を変更できます。
「並べ替えに使用する列(C):」でフィールドを指定すると、レコードソース内のレコード群が指定したフィールドを基準に並べ替えられます。ここでは「読み」フィールドを選択し、氏名の読みの五十音順で並べ替えます。
設定を終えると画面6のようになります。[次へ]をクリックします。

画面6:レコードソース.、フィールドなどを指定する
 
(6) フォームに配置するボタンを指定する
フォームには、画面7のように追加や削除のボタンが配置できます。表示したいボタンをチェックして[次へ]をクリックします。
ここでは、すべてのボタンを選択しています。ボタンを選択すると、そのボタンの機能を実現するコードも生成されます。

画面7:配置したいボタンを選択する

これで[次へ]をクリックすると、プロファイルを保存する画面になります。今回の設定を保存して再利用したい場合は、プロファイル名を入力して保存しておきます。ここでは保存しないで[完了]をクリックします。
最後に画面8のようにメッセージが表示されるので、[OK]をクリックすれば完了です。

画面8:フォームが生成された
フォームの手直しと実行

こうして出来上がったフォームのデザインは、画面9のようになります。フォーム最下部に見えるデータコントロールはADODataコントロールです。先の(6)で指定したボタンが、データコントロールの上に配置されています。


- プロパティを変更する -

フォームの高さを変更しても、ADODataコントロールとボタン群は常にフォームの最下部に配置されます。コマンドボタンは、ピクチャボックス上にグループ化されて配置されています。ボタン背景の灰色の部分をクリックすれば、ボタンをまとめているピクチャボックスのプロパティを操作できます。
また、個々のボタンのプロパティも変更できるので、サイズや位置、キャプションなどを調整できます。ただし、オブジェクト名を変更するとコードとの整合性がなくなるため、オブジェクト名は変更しないようにします。
ADOコントロールも選択してプロパティを変更できますが、オブジェクト名を変更してはいけません。

画面9:でき上がったフォームのデザイン画面



- ライブラリの組み込み -

これで一応でき上がりましたが、まだ完全ではありません。ADODataコントロールを使っているため、ADOを制御するためのライブラリを組み込む必要があります。それをしないでアプリケーションを実行すると、プロシージャ"MoveComplete"のところで「データ型未定義」のコンパイルエラーが発生します。
ライブラリは、以下の手順で組み込みます。

(1) 「メニューから「プロジェクト(P)」→「参照設定(N)」を選択する
(2) 「参照設定」ダイアログボックスの「参照可能なライブラリファイル(A):」から
 Microsoft Active Data Objects 2.0 Library
 Microsoft Active Data Objects / Recordset 2.0
の2つをチェックする(画面10)


- 旧バージョンに注意 -

これで[OK]をクリックすれば、ADOのためのライブラリが組み込まれます。VB5.0からアップグレードした場合、先に
 Microsoft Active Data Objects 1.0 Library
 Microsoft Active Data Objects / Recordset 1.0
が組み込まれている場合があります。これらは同じ名称のファイルでバージョンが異なるため、後から組み込もうとした2.0のライブラリは組み込まれずエラーとなります。その場合、「参照設定」ダイアログボックスでいったん1.0のライブラリを削除(チェックを外す)してから、2.0をチェックして組み込みます。

画面10:ADOのライブラリを組み込む



- コントロールの調整 -

これで実行すれば、テーブル「T_住所録」のレコードがフォームを通して表示され、データの書き換えや削除、追加(新規入力)などが行えるようになっています。フォーム下部のADODataコントロールに付いているレコード移動ボタン[|<][<][>][>|]をクリックすればレコードが移動し、「読み」の五十音順に並んだ状態であることが分かります。
しかしこの状態では、テキストボックスの長さがどれも同じで、少し不格好です。テキストボックスのサイズや位置を調整しておきましょう。自動生成されたとはいえ、すべて一般のコントロールを使っているだけなので、プロパティは自由に変更できます。
ここでは、オートナンバー型の「ID」フィールドが書き換えられないよう、テキストボックスtxtFields(0)のLockedをTrueにしておきましょう。加えて、カーソルが移動しないようにEnabledをFalseにしておきます。
このフィールドが入力不要であることを示すために、BackColorとForeColorも変更しておくとよいでしょう。



- スタートアップの設定 -

最後に、メニューの「プロジェクト(P)」→「Project1のプロパティ(E)」で「全般」パネルから、「スタートアップの設定(S)」を"frmAddress"に指定しておきましょう。これでアプリケーションを実行すれば、今自動生成されたフォーム"frmAddress"がオープンします(画面11)。
レコードの移動、[削除][追加]などのボタンの動作を確かめておきましょう。

画面11:フォームを調整して実行させた



コードの修正

データフォームウィザードでは、コマンドボタンのイベントプロシージャなども生成されます。かなり良くできていますが完全ではない部分もあるため、手直しをしておきましょう。


- テーブルの保守処理に便利 -

データフォームウィザードを使えば、このように面倒な設定を一切することなく、コードの記述も一切不要でデータベースにアクセスするアプリケーションが作れます。もちろん、複雑な処理を行なうアプリケーションはこんなに単純な形では済まないので、まったく手間いらず、というわけにはいきません。
が、大規模な業務用アプリケーションでも、顧客データ、商品台帳などの基本的なテーブルの保守処理(変更、追加、削除など)は、データフォームウィザードによって作ったフォームでも十分に対応できます。



- 削除処理を改造する -

ただ、[削除]ボタンがクリックされたときの処理が気になります。自動生成される削除処理のプロシージャcmdDelete_Clickは、リスト1のようになっています。このコードでは、[削除]をクリックしたら、表示されているレコードが即座に削除されてしまいます。
そこでリスト2のようにコードを追加し、画面12のようなメッセージボックスで確認を行い、[はい]がクリックされたときだけレコードが削除されるように改造しておくことにします。

画面12:メッセージボックスで確認する

リスト1:データフォームウィザードで生成される削除処理のプロシージャ


Private Sub cmdDelete_Click()
 On Error GoTo DeleteErr
 With datPrimaryRS.Recordset
  .Delete ←カレントレコードを削除
  .MoveNext ←次のレコードに移動
  If .EOF Then .MoveLast ←次のレコードがなけれ
 End With            ば最終レコードへ移動
 Exit Sub
DeleteErr:
 MsgBox Err.Description
End Sub

リスト2:メッセージボックスで確認を求めるようにコードを付け足した

Private Sub cmdDelete_Click()
 On Error GoTo DeleteErr
  ↓メッセージボックスで削除の確認を行う
  If MsgBox("削除してもよろしいですか?", _
       vbYesNo + vbQuestion, _
       "レコード削除") = vbNo Then ExitSub
  ↓[はい]がクリックされたときだけこれ以降の処理を行なう
 With datPrimaryRS.Recordset
  .Delete
  .MoveNext
  If .EOF Then .MoveLast
 End With
 Exit Sub
DeleteErr:
 MsgBox Err.Description
End Sub

データフォームウィザードを使って、データベースにアクセスするためのフォームを作る方法を紹介してきました。データフォームウィザードを使えば、基本的なテーブルの操作はほとんど手間を書けることなく実現できます。
フォーム上のコントロールに手を加えたり、コードを書き直したりすることも可能です。テキストボックスやコマンドボタンを貼り付け、何もないところからすべてを作り上げるより、はるかに簡単で便利です。
しかし、前述のようにこの方法はあくまでも単純なテーブルの保守処理に向いたものであって、複雑なデータ処理を行わせるには無理があります。さらに細かな制御を行いたいなら、「連結の種類」で「ADO コード(O)」を指定してすべてをコードとして生成するようにしても構いません。ただしその場合、手を加えるにはADOに関する知識が必要になります。
ここで紹介した例のように、ADODataコントロールを使って単純なテーブルの保守用としてうまく利用すれば、開発工程は大きく効率化できるでしょう。テーブルだけではなく選択クエリーを指定することもできるので、複数のテーブルを関連付けたクエリーをフォームに表示させることも可能です。但しその場合、レコードの追加や削除にはクエリーの結び付き方による制限が発生するため、単一のテーブルの場合のようにすべての操作がうまく機能するとは限りません。この問題は、Accessでフォームを作る場合とまったく同じです。


- ご注意 -

サンプルを試すには、あなたのマシンのハードディスクの"C:\Db"フォルダに、ダウンロードしたデータベース・ファイル"Addr01.mdb"を保存しておいてください。


DownloadVBプロジェクトファイルのダウンロード
(LZH形式 9.59KB)



Downloadサンプルデータベース(LZH形式 19.2KB)
Copyright © MESCIUS inc. All rights reserved.