Visual Basic 6.0 データベース講座
VB6対応

 

Visual Basic 中学校 > VB6 データベース講座 >

第2回 データの登録

 

今回はデータの登録の説明をします。このデータベース講座は連載の形を取りますので前回の分を読まれていない方は先にそちらを読まれていください。

なお、前回(第1回)に「4.修正」を加筆してデータの修正方法を解説しましたので2001年10月13日以前に前回分を読んだ方はこの部分だけもう一度読んでいただけると幸いです。

 

1.リュウグウノツカイ

 

みなさんはリュウグウノツカイという謎めいた動物をご存知でしょうか?体長は10mを超える細長い動物で海を泳いでいます。深海魚ということのようです。最近まで生きたリュウグウノツカイの遭遇例はほとんどなかったのですがこのほどついにリュウグウノツカイが生け捕りにされたようですね。今はどこかの水族館にいるそうです。

では、このリュウグウノツイカイをデータベースに登録してみましょう。

前回作ったプログラムでは新しく生物を登録することはできません。そこで登録できるように新しいプログラムを作ります。

作成の手順は大きく次の3つに分かれます。

A.VBでテキストボックスなどを用意してデータベースの中身を表示できる準備をする。

B.データベースに接続する。

ではこの手順にくわしく解説しましょう。

A.VBでテキストボックスなどを用意してデータベースの中身を表示できる準備をする。

A1.VBを起動します。

A2.フォームにテキストボックスを5つ配置します。

これらのテキストボックスには動物ID、名前、目、画像、説明をそれぞれ表示するのでわかりやすくラベルをつけておくといいと思います。

画像1:フォームに5つのテキストボックスを配置したところ。各テキストボックスの内容がわかるようにラベルも配置した。

 

B.データベースに接続する。

B1.Adodcをフォームに配置します。

この手順は前回のB1〜B3と同じです。

念のために少し書いておくと、コンポーネントを新規追加してからフォームに配置するのでした。

B2.Adodcをデータベース「Animals.mdb」に接続します。

この手順は前回のB4〜B9と同じです。

B3.Adodcのレコードソースに「T1_動物マスタ」を指定します。

この手順は前回のB10〜B13に似ています。

画像2:前回と違ってこの画面では「T1_動物マスタ」を指定する。

 

B4.フォームに配置したテキストボックス・ADODCのプロパティを次のように変更します。

コントロール プロパティ 解説
txtID DataSource adodc1 txtIDの値はadodc1から受け取ることになります。
  DataField 動物ID txtIDの値は「動物ID」となります。
txtName DataSource adodc1 txtNameの値はadodc1から受け取ることになります。
  DataField 名前 txtNameの値は「名前」となります。
txtMoku DataSource adodc1 txtMokuの値はadodc1から受け取ることになります。
  DataField txtMokuの値は「目」となります。
txtPicture DataSource adodc1 txtPictureの値はadodc1から受け取ることになります。
  DataField 画像 txtPictureの値は「画像」となります。
txtExplanation DataSource adodc1 txtExplanationの値はadodc1から受け取ることになります。
  DataField 説明 txtExplanationの値は「説明」となります。
  MultiLine True txtExplanationに複数行表示できるようになります。
adodc1 EOFAction 2 - adDoAddNew 新しいレコードを登録できるようになります。

以上で完成です。多分前回の手順を見ながら一つ一つ設定して言うことになったと思いますが、前回の手順さえマスターしていれば驚くほど簡単だということもわかっていただけるでしょう。

 

2.実験

 

それでは、完成したプログラムを実行してみてください。新しいレコードを追加するには一番最後のレコードに移動してから次のレコードへ移動するボタンをクリックします。そうすると何も表示されない状態になるのでここに登録したい内容を書きます。今回は次のように記述しました。

画像3:adodcの各ボタンの意味

txtName    リュウグウノツカイ

txtMoku    59

txtExplanation    深海魚。10mを超える長細い体を持つ。

画像4:リュウグウノツカイを登録しているところ

書き終わったら、前のレコードへ移動するボタンをクリックしましょう。そしてプログラムをいったん終了させます。これで登録完了です。

もう一度プログラムを実行して確認してみるとリュウグウノツカイが登録されているのがわかるでしょう。

ここで注意してほしいのは、「リュウグウノツカイ」は一番最後に登録されているわけではないということです。驚くべきことにデータベースでは特に指定しない限りレコードの順番はランダムです。一番最後に登録したからといって一番最後に配置されるわけではないのです。ですから、リュウグウノツカイが登録されているかどうか調べるには一つ一つレコードを確認していく必要があります。

リュウグウノツカイのところを確認すると、「動物ID」の欄に自動的に 101 という数字が表示されていることでしょう。この「動物ID」はこのように自動的に数字が割り振られるように私がAnimals.mdbで設定しておいたものです。他の名前や説明などのフィールド(「項目」)とはことなって自動的に値が決まるこのようなフィールド(「項目」)のことを「オートナンバー型」と呼びます。

今の説明の中で「フィールド」という用語を使いましたが、mdbファイルの専門用語でレコードを構成する項目のことを「フィールド」と呼びます。この用語を使うと、『「T1_動物マスタ」には「動物ID」、「名前」、「目」、「画像」、「説明」の5つのフィールドがある』といえます。今後この「フィールド」という用語も普通に使っていくので注意してください。なお、「レコード」と「フィールド」はExcelのような表を想像した場合の「行」と「列」に当たります。

さて、他にも注意すべき点はいくつもありますね。ひとつひとつあげていきましょう。

まず、登録するときに「オートナンバー型」のフィールドに値を入力しようとするとエラーになります。これは説明したようにオートナンバー型のフィールドには自動的に値が割り振られるので自分では指定できないということです。

次に、「画像」の欄です。このフィールドには何でも入力できるのですが現時点では画像が表示されることはありません。この部分は次回かその次あたりでプログラムするつもりですので今回は特に意味のないものとして扱ってください。

そして、「目」の項目に注目してください。この「目」に関してはちょっと長い説明が必要なので節を改めて解説します。

 

3.目ID

 

前回作ったプログラムでは「目」の欄には「霊長目」だの「有袋目」(ゆうたいもく)だの文字が表示されていましたが、今回作ったプログラムでは 1 や 2 のように数字が表示されています。これはどういうことでしょうか。

これは前回のプログラムがデータを「見る」ものだったのに対して、今回のプログラムがデータを「登録する」ものであるという違いにも関係します。

Animals.mdbの中では「目」は「T4_目マスタ」というテーブルに登録されています。この目マスタには「目名」の他に「目ID」というものが登録されています。目ID 1 は「霊長目」、2 は「翼手目」(よくしゅもく)といった具合です。そしてデータを表示するときには文字である「目名」を、登録するときには数字である「目ID」を使っているのです。

表示するときと登録するときとでこのように分けるのはわかりにくくて不便だと思われるかもしれませんが、実はちゃんとした理由があるのです。というのも「目名」だけで登録もできるようにしてしまうと同じ名前で内容が違う「目」が存在した場合に困ってしまうからです。たとえば、哺乳綱(ほにゅうこう)にはコウモリなどが属している「翼手目」という目がありますが、昆虫などが属している昆虫綱(こんちゅうこう)に、もし同じ名前の「翼手目」という目があった場合、登録するときに「翼手目」と書いただけでは哺乳綱の翼手目なのか昆虫綱の翼手目なのか区別できません。

ところが、目にひとつづつ数字がついていれば、同じ「翼手目」でも、2番の「翼手目」、54番の「翼手目」のように番号で区別できることになります。

こういうわけで、データベースでは「同じ名前」が存在したときのためにレコードごとに番号をふることが多いのです。このような番号のことを「ID」と言います。この「名前を区別する」というIDの性格からいって同じ番号のIDは入力できないようにするのが普通です。そのためIDをあらわすフィールドはオートナンバー型で自動的に値を決定することが多いのです。「T1_動物マスタ」に出てきた「動物ID」もこれと同じです。

なお、念のために書いておきますが、実際には昆虫綱には「翼手目」という名前の目は存在しません。説明のための例であげただけです。また、同じ名前の目が本当にあるのかないのかは私は知りません。私がすべての「目」を知っているわけではないからです。とはいえ、同じ名前の目が存在する可能性がまったく否定できない以上は目IDを設けて数字で区別するということは意味のあることでしょう。

もし、同じ名前の目は存在しないということになれば目IDの意味はほとんどなくなります。登録した順番が記録されるとか、数字で扱ったほうが処理が早いとかそういった点はありますが、なくてはならない重要なものという意味合いはなくなります。どちらにせよ今回の動物データベースは勉強用なのですから世間で多く使われているIDの性質を理解するためにも目IDや動物IDの要不要は特に気にせず使いこなせるようになりましょう。

そいうはいっても数字で登録するというのは実際わかりにくいものです。そこで普通の市販されている製品では内部ではIDであつかっていても使う人(ユーザー)には名前で選択できるようにするなどの便宜を図っています。このデータベース講座でもいずれそのような技を紹介するつもりですが、今回はちょっとした改造で我慢しておくことにします。

目IDを入力すると「目名」が表示されるようにプログラムを改造します。

まず、目IDの近くに目名を表示するためのラベルを追加して名前を lblMokuName としてください。

そして、txtMokuをダブルクリックしてChangeイベントに次のようなプログラムを追加します。

Private Sub txtMoku_Change()

    Dim rs As New Recordset                                                           'A

    On Error Resume Next

    rs.Open "T4_目マスタ", Adodc1.ConnectionString, adOpenDynamic     'B
    rs.Find "目ID=" & txtMoku.Text                                                    'C

    lblMokuName.Caption = rs.Fields("目名")                                       'D

    rs.Close                                                                                   'E

End Sub

 

これで、lblMokuNameには目IDに応じて目名が表示されることになるでしょう。

画像5:目の右には目の名前が表示されている。

このようなプログラムの意味は次回から詳しく解説していくつもりですが一応ざっとはご説明しましょう。

まず、「目」が登録されている「T4_目マスタ」を開きます。これがBの行です。そして、表示されている目IDのレコードに移動します(Cの行)。移動したら「目名」を表示します(Dの行)。最後に「T4_目マスタ」を閉じます(Eの行)。

本当はこのプログラムにはちょっとまずい点もあるのですが、初めてのデータベースプログラミングですから簡潔さを優先させたものとして目をつむってください。

しかし、このようにプログラムしたところで数字で目を指定する不便さはあまり変わりません。というのもこのプログラムでは目IDを入力すると目名が表示されるだけで、たとえばリスなどが属している「齧歯目」(げっしもく)が何番なのかはわかりません。あくまで気休め程度のものと勉強をかねたものと考えてください。

 

4.テーブルとクエリ

 

さて、もう一度はじめに戻りましょう。今回作ったプログラムでは新しく登録ができるようにするためにadodc1のEOFActionプロパティ(イーオーエフアクション)を 2 - adDoAddNew にしたのを覚えているでしょうか?

ここでちょっと前回作ったプログラムに細工をして、同じように adodc1のEOFActionプロパティを 2 - adDoAddNewにしたらどうなるのでしょうか?登録できるようになるでしょうか?

実は前回のプログラムではいくらこのプロパティをいじっても登録できるようにはなりません。

原因はadodc1のRecordSourceプロパティ(レコードソース)にあります。RecordSourceプロパティなど設定した覚えはないという思うかもしれませんがプロパティページで行った設定により自動的に設定されています。見てみてください。前回のプログラムではRecordSourceプロパティは 「Q1_動物一覧」でした。今回は「T1_動物マスタ」です。「Q1_動物一覧」も「T1_動物マスタ」も私があらかじめ作っておいたものですがこの2つには決定的な違いがあります。「Q1_動物一覧」はクエリと呼ばれるもので、「T1_動物マスタ」はテーブルとよばれるものなのです。「クエリ」と「テーブル」は前回も出てきましたがここでも説明しましょう。

「テーブル」とはデータベースの本体のようなもので実際にデータが登録されているものです。そして、1つのデータベース内には普通、複数のテーブルが存在します。Animals.mdbの中には「T1_動物マスタ」、「T2_門マスタ」、「T3_綱マスタ」、「T4_目マスタ」の4つのテーブルが存在します(実はこのほかにもシステムテーブルと呼ばれる特殊なテーブルが存在するのですが普通それらは数に入れません)。

一方の「クエリ」はデータの見せ方を定義しているもので実際にはデータは登録されていません。たとえば前回利用した「Q1_動物一覧」は「T1_動物マスタ」をメインとして目名や綱名などを「T4_目マスタ」などから探して表示するように「見せ方を定義したもの」です。クエリの詳しい使い方や作成法はそのうち桑行く説明することになるでしょう。

このような理由で「クエリ」は今現に表示されているデータを修正することができたとしても、新しくレコードを追加することまでできるとは限らないのです。・・・ちょっと不親切な表現ですね。理論的には新しくレコードを追加することも可能なのですが、それには「見せ方の定義」を逆に解釈して「登録の仕方の定義」を割り出す必要があります。そして、そのようの機能は現在のデータベースにはあまりないということです。

今、「限らない」とか「あまりない」とか一部あいまいな表現を使いましたが、中にはできる場合もあるということです。しかし、残念ながら「Q1_動物一覧」はこの場合に相当しません。

なお、「クエリ」にはさまざまな機能があり中にはここで説明したことがまったく当てはまらないものもあります。今回説明したのは「選択クエリ」と呼ばれるものです。

 

5.用語の整理

 

前回と今回とでいくつかデータベース用語が登場しましたので簡単に整理しておきます。

テーブル 実際にデータが登録されている部分。1つのデータベース内に複数存在する。
クエリ 「選択クエリ」に限って言えば、「データの見せ方を定義したもの」
レコード テーブルを構成するデータの単位。表で言うところの「行」に相当する。
フィールド テーブルを構成する項目。表で言うところの「列」に相当する。
ID 名前を区別するためなどにふられる重複しない数字。
オートナンバー型 自動的に値が割り振られるフィールドの型。IDなどに使う。

 

 

6.感想

 

このデータベース講座は「勉強」「練習」のための講座であることをいいことに、前回と今回はかなり使えないプログラムを作ってきました。なるほど、データを見たり、修正したり、登録したりはできるようになりました。でもこれが使いやすくてかっこいい動物図鑑だと思いますか?

次回からは市販されている製品には及ばないかもしれませんがそれなりに使いやすくてかっこよく、素人の(またはプロの)友達に見せてもほめてもらえるようなプログラムを作っていくつもりですのでお楽しみにしてください。

前回と今回の復習・練習をしたい方は「T4_目マスタ」を見るプログラム、修正するプログラムを作ってみるとよいと思います。

それでは、今回は失礼します。