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

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

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

データコントロールを使えば、プロパティの設定と簡単なコード入力だけでデータベースを操作できるようになります。
前回は、データコントロールを使ったデータベース・アプリケーションの基礎として、シンプルな住所録を作ってみました。今回はそれを発展させ、レコードの追加や一覧表示ができるようにしてみます。



レコードを追加できるようにする

前回紹介した住所録では、レコードの追加ができませんでした。住所を確認するだけで追加のできない住所録は、実用的ではありません。新しいレコードを追加できるようにしてみましょう。


- プロパティを変えるだけ -

VBを起動して前回作成したプロジェクトをオープンし、手を加えます。
レコードを追加できるようにするのは非常に簡単です。フォームに貼り付けたデータコントロール(Data)の"EOF Action"プロパティを"2 - 新しく追加"に設定するだけです(画面1)。
これでレコードの追加ができるようになりました。実行してみましょう。
起動すると先頭レコードが表示されるので、[>|]ボタンをクリックして終端のレコードを表示させます(画面2)。ここでさらに[>]をクリックすると画面3のようになり、空白のレコードが表示されます。これが挿入された新規レコードで、テキストボックスに氏名、読み、電話番号を入力してレコードを追加できます。

画面1:データコントロールの"EOF Action"プロパティを変更する
画面2:終端のレコードを表示する
画面3:新規レコードが表示され、データが入力できる



- "EOF Action"プロパティ -

前回作成したアプリケーションでは、"EOF Action"プロパティが"0 - 最終レコード"となっていました。EOFとはEnd Of Fileの略で、「ファイルの終端」という意味です。つまり"EOF Action"プロパティでは、データコントロールに接続されているテーブルの終端(最後のレコード)を表示しているとき、さらに「次のレコード」への移動を行った場合、どのように振る舞うかを設定することになります。
標準では"0 - 最終レコード"となっており、次のレコードへの移動を示す[>]ボタンをクリックしても、一番最後のレコードを表示したままとなります。
"1 - EOF"を指定すると、データコントロールのValidateイベントが発生するので、そこに適切な処理を記述します。詳しくはコラムをご覧ください。
"2 - レコードの追加"を指定すると、先述したようにテーブルの最後に新規レコードが挿入され、データを入力できる状態となります。



- コード入力は1行だけ -

このサンプルでは氏名と読み以外には電話番号しか入力できないようにしていますが、住所などその他の情報をすべて表示させれば、これだけでも「それなりに使える住所録」が作れます。
このように、データコントロールを使うと、非常に簡単な操作でデータベースを扱えます。前回説明したように、このアプリケーションでは[閉じる]ボタンをクリックした際の振る舞いとして"cmdClose_Click"プロシージャに"End"の1行を入力しただけでした。あとはデータコントロールのプロパティを設定し、テキストボックスを連携させだけなのです。



データベース・アクセスの基本

ここで、データコントロールと他のコントロールとの連携の仕組みを説明しておきましょう。前回紹介したデータコントロールとテキストボックスのプロパティ設定を、もう一度確認してください。表1がデータコントロールdbAddress、表2が「氏名」を表示するテキストボックスtxtNameのプロパティです。


- データコントロールのプロパティ -

データコントロールの利用で重要なプロパティは、以下の2つです。
・DatabaseName
 データベースの名前を指定する
・RecordSource
 DatabaseNameで指定したデータベース内のレコードソースを指定する

レコードソースとは、一般にテーブルまたは選択クエリーとなります。つまりDatabaseNameでデータベースファイルを、RecordSourceでその中のテーブルやクエリーを指定することで、Dataコントロールがデータベースと接続され、RecordSourceで指定したレコードソースにアクセスできるようになるのです。



- コントロールとの連携 -

データコントロールは、レコードソースをアクセスするだけです。アクセスした結果を表示したり、別の所に入力されたデータをレコードソースに反映したりするためには、テキストボックスなど入力や表示の可能なコントロールの助けを借りることになります。
テキストボックス、リストボックス、コンボボックスなどのコントロールには、以下の2つのプロパティが用意されています。

・DataSource
 レコードソースを提供するデータコントロールを指定する
・DataField
 DataSourceで指定されたデータソース内のフィールドを指定する

データソースとは、データベース内の特定のレコードソースと接続されたオブジェクトです。データコントロールを使う場合、正しく設定されたデータコントロールがデータソースとなります。
データソースには、先にデータコントロールを設定してレコードソース(テーブルまたはクエリー)を接続してあるので、レコードソースのフィールドをDataFieldに指定してやれば、コントロールとテーブル(またはクエリー)内の特定のフィールドとが結び付けられます。
例えば"C:\Db\Addr.mdb"内のテーブル「T_住所録」にある「氏名」フィールドは、図1のような形でテキストボックスtxtNameと結び付いています。データコントロールでファイルとテーブルまでを指定し、個々のフィールドはテキストボックスなどのコントロールの側で指定する――という形を覚えておきましょう。

図1:データコントロールとテキストボックスの結び付き

表1:データコントロールdbAddressのプロパティ設定


プロパティ 設定
Caption 住所録
DatabaseName C:\Db\Addr01.mdb
DefaultType 2 - Jet
Enabled True
RecordsetType 1 - ダイナセット
RecordSource T_住所録
Visible True

表2:テキストボックスtxtNameのプロパティ設定

オブジェクト名 プロパティ 設定
txtName DataSource dbAddress
DataField 氏名


住所を一覧表示する

今度は、住所録のすべてのデータを一覧表で表示してみましょう。一覧表示にはDBグリッドコントロールを使用します。グリッド(grid)とは網目や格子模様のことで、文字通りデータを格子状に区切って表示するためのコントロールです。


- DBグリッドを追加する -

DBグリッドコントロールは、標準状態ではツールボックスには登録されていません。コントロールはプロジェクト単位に追加するので、最初にプロジェクトを新規作成してDBグリッドコントロールを登録します。手順は以下のようになります。

(1)メニューから「プロジェクト(P)」→「コンポーネント(C)」を選択する
(2)「コントロール」パネルで、コントロールの一覧からMicrosoft Data Bound Grid Control 5.0(SP3)を選択してチェックマークをONにします(画面4)
これで[OK]をクリックすると、画面5のようなデータコントロールのボタンがツールバーに登録され、使用できるようになります。

画面4:一覧からDBグリッドコントロールを選んで追加する
画面5:ツールバーに登録されたDBグリッドコントロールのアイコン


- フォームのデザイン -

フォームの基本デザインは、先に作成したアプリケーションと同じです。但しテキストボックスは使用しません。テキストボックスの代わりに、DBグリッドを用います。従って、データコントロールdbAddressと[閉じる]ボタンcmdCloseのプロパティ設定は、これまでとまったく同じで構いません。
[閉じる]ボタンcmdCloseのClickイベントに設定するイベントプロシージャも、これまでと同じです。
一覧は横に長くなるのでフォームを横長にし、画面6のようにDBグリッドを貼り付けます。

画面6:フォームにDBグリッドを貼り付ける



- プロパティの設定 -

貼り付けたDBグリッドを選択し、表3のようにプロパティを設定しましょう。
テキストボックスの場合と同じように、DataSourceプロパティで連結するデータコントロールを指定します。テキストボックスの場合はDataFieldプロパティで連結するフィールドを指定しましたが、DBグリッドではDataSourceに指定したデータコントロールに接続されているすべてのフィールドが表示されるので、フィールドを指定するプロパティはありません。
表3行と列の対応関係 :DBグリッドコントロールのプロパティ設定

プロパティ 設定
オブジェクト名 dbgAddress
AllowAddnew True
AllowDelete True
AllowUpdate True
Caption 住所録
ColumnHeaders True
DataMode 0 - Bound
DataSource dbAddress


- 追加と削除を可能にする -

AllowAddnewは追加を許可、AllowDeleteは削除を許可するためのプロパティで、既定値はFalseになっているため、標準状態ではレコードの書き換え(更新:AllowUpdate)のみが可能です。
ここではAllowAddnewとAllowDeleteをTrueにするので、追加と削除もできるようになります。DBグリッドでAllowAddnewをTrueにしてレコードを追加できるようにする場合、それに連結するデータコントロール(dbAddress)のEOF Actionを"2 - 新しく追加"にしておかなければなりません。



- スクロールして一覧できる -

これでひとまず完成です。フォームのデザイン段階ではDBグリッドのセル(マス目)が1行2列しか表示されていませんが、実行すればテーブル「T_住所録」のすべてのフィールドが表示され、スクロールバーで一覧できるようになります。
フィールドの数が多いので、住所など右端の情報は水平スクロールバーを操作しなければなりません。



列幅を調整する

アプリケーションを実際に動かせばすぐに分かりますが、これだけではすべてのフィールドの幅が同じなので、「ID」や「年賀状」には広すぎ、「住所」には狭すぎます。フィールドの幅をデータに合わせて調整しておきましょう。


- 行と列の対応関係 -

レコードソースのフィールドは、DBグリッドの列(Column)に対応します。
レコードソース DBグリッド
レコード 行(Row)
フィールド 列(Column)

という関係です。従ってフィールドの表示幅を変更するには、DBグリッドのColumnsコレクションにあるWidthプロパティを設定すればよいことになります。


- 列幅の変更タイミング -

データが表示される前に列幅を調整しても、正しく反映されません。アプリケーション開始時にForm_Loadプロシージャで設定しても無意味です。DBグリッドに実際のデータが表示され、状態が変更された直後に行います。
DBグリッドには、「行と列の状態が変化した」場合にRowColChangeイベントが発生します。このイベントプロシージャで、フィールドのデータに合わせて列幅を変更します。ソースコードは、リスト1のようになります。

リスト1:列の幅をフィールドのデータに合わせる

Private Sub dbgAddress_RowColChange _
  (LastRow As Variant,
  ByVal LastCol As Integer)
  With dbgAddress
    .Columns(0).Width = 500
    .Columns(1).Width = 1200
    .Columns(2).Width = 1500
    .Columns(3).Width = 500
    .Columns(4).Width = 1200
    .Columns(5).Width = 1500
    .Columns(6).Width = 1000
    .Columns(7).Width = 4000
    .Columns(8).Width = 3000
    .Columns(9).Width = 500
  End With
End Sub



- Withステートメント -

Withステートメントは、直後に指定した文字列をそれ以降End Withまで省略できるという命令です。ここでは
With dbgAddress
としているので、それ以降DBグリッドコントロールの名前dbgAddressを省略できます。

Columns(0).Width = 500

は、
本当は

dbgAddress.Columns(0).Width = 500

とするところですが、先頭の"dbgAddress"が省略されているのです。
複数のプロパティを一度に設定するような場合、Withステートメントを使うと便利です。



- サイズ指定はtwipで -

Columnsコレクションでは、左端から0で始まるインデックスによって列を指定します。ここでは10個のフィールドが存在するので、Columnsも(0)~(9)まで指定します。
VBでは、サイズをtwip(トゥイップ)という単位で指定します。twipはフォントのサイズ指定に用いられる「ポイント」を基準とした単位で、画面解像度に関わらず印刷した際の実寸を指定できるようになっています。1cmは567twip、1インチは1,440twip、1ポイントは1/72インチです。
各オブジェクトのScaleModeプロパティを変更すれば、twip以外の単位を用いることも可能です。しかし文字を表示するコントロールでは、画面解像度やフォントの種類によって同じフォントサイズでも表示に必要な横幅が異なってくるため、twipを使うのが最も安全です。



- 一覧表示で追加と削除も可能 -

これで、アプリケーションを実行すると画面7のように列幅の整った状態で住所の一覧が表示されます。データコントロールで[>|]をクリックしたあと[>]をクリックすると、新規レコードが追加されてデータが入力できます(画面8)。  DBグリッド左端のレコードセレクタをクリックしてレコードを選択し、[Delete]キーを押せばレコードが削除されます。Accessのテーブル操作と同じ要領です。

画面7:表形式で表示される
画面8:新規レコードを追加



テキストボックスを使ったフォームでレコードの追加ができるようにし、さらに一覧表示とレコードの削除もできるようにしてみました。これで、ずいぶん住所録らしくなったはずです。
次回は、テキストボックスを使ったフォームに[追加][削除]などのボタンを設け、さらに住所録らしいデザインにしてみます。



Downloadテキストボックスを使い、レコード追加を可能にしたサンプル(4.63KB)


DownloadDBグリッドで一覧表示を行うサンプル(7.38KB)


Downloadサンプルデータベース(19.2KB)
データベースは"C:\Db\Addr.mdb"をアクセスする設定となっています



データコントロールのValidateイベント

データコントロールのEOF Actionプロパティで"1 - EOF"を指定すると、最終レコードを超えた場合に、Validateイベントが発生します。このイベントに対するプロシージャを用意すれば、ユーザーに対してメッセージを表示するなど、レコードの追加以外の処理が設定できます。
データコントロールをダブルクリックすると、コードウィンドウがオープンして以下のようにValidateイベントに対するプロシージャの入力ができるようになります。

Private Sub dbAddress_Validate(Action As Integer, Save As Integer)
End Sub

このプロシージャの引数の意味は、以下の通りです。

action
このイベントが発生した操作を示す数値です。
ValidateイベントはEOF以外の操作でも発生するので、どの操作によってこのプロシージャが呼び出されたかが、この引数によって示されます。値は、以下のような記号定数として参照できます。

vbDataActionMoveFirst:
先頭レコードへ移動したとき(MoveFirstメソッド)
vbDataActionMovePrevious:
前のレコードへ移動したとき(MovePreviousメソッド)
vbDataActionMoveNext:
次のレコードへ移動したとき(MoveNextメソッド)
vbDataActionMoveLast:
最終レコードへ移動したとき(MoveLastメソッド)
vbDataActionAddNew:
レコードが追加されたとき(AddNewメソッド)
vbDataActionDelete:
レコードが削除されたとき(Deleteメソッド)
vbDataActionClose:
データベースがクローズされたとき(Closeメソッド)

save
データコントロールに接続されているデータ(テーブルやクエリー)の内容が書き換えられたかどうかを示します。
True:データが変更された
False:データは変更されていない

このように、データコントロールのValidateイベントは連結されたレコードソースに対する操作のメソッドと連動しているので、これを処理するとユーザーのレコード操作に柔軟に対処できるようになります。具体例は、回を追って紹介しましょう。
Copyright © MESCIUS inc. All rights reserved.