ナッキーの「Turbo Delphiはじめて奮戦記」 - 第19回 アンケートプログラムで参照データを使う

By: Hitoshi Fujii

Abstract: アンケートプログラムでSQLを使ったデータベース操作を学びました。今回は別のテーブルを使ったデータの参照を学びます。

Hide image
nacky75

ナッキー

前回はSQLを使ったアクセスをして、データベースの新しい扱い方を勉強しました。なんだかデータベースをバリバリ使えそうです。

 

Hide image
takahashi75b

高橋先生

SQLはデータベースの扱い方の一種だよ。今回は、ほかのテーブルのデータを参照してみよう。1つのデータを表すのに、2つのテーブルを使うんだ。

    住所テーブルを作成する

もうアンケートプログラムでは、加える機能ってないような気がするなぁ。

ナッキー:あれ、高橋先生、めがね変えました?

高橋先生:ははは、気がついた?いいでしょ、これ。職人さんの手作りなんだよ。

ナッキー:高橋先生、おしゃれなんですね。イガーイ。

高橋先生:ゴホン、さぁ、今日はテーブルをもう1つ増やしてみるよ。現在のアンケートプログラムでは、住所一覧は「Items」プロパティに設定している。もしも住所の項目を増やしたくなったら、プログラムは作り直しだね。住所一覧用のテーブルを作って呼び出すようにすれば、プログラムをいじらなくても項目を増やしたり変更したりできるよ。

ナッキー:住所一覧を変更するには、プログラムに変更を加える、というのはわかります。テーブルにした場合は、どうやって変更するんですか?

高橋先生:データベースのツールを使えばいいよ。PROFILEテーブルを作成した「IBConsole」で追加や変更ができる。プログラムが動いていないときに変更してね。

ナッキー:手間を考えると、プログラムを変更したとしてもそれほど大変じゃないように思うんですけど。

高橋先生:ユーザーが1人の場合は、プログラムの変更も大変ではないかもしれない。それでも、うっかりコンポーネントやコードを削除したり、コンパイルし忘れたりといった間違いが起こることだってある。ユーザーが複数のときは、それぞれでプログラムを更新するタイミングがずれてしまうと、データの不具合が出るかもしれない。だからプログラムの変更は極力しないほうがいいんだ。

ナッキー:じゃあ、変更しそうなところはプログラムの外、今回の場合はテーブルにしておくほうがいいんですね。アンケートプログラムでは住所テーブルのデータを使うことができるんですか?

高橋先生:データの使い方はあとでじっくり説明するとして、まずはテーブルを作成しよう。IBConsoleを使って、「ID」フィールドと「ADDR_NAME」フィールドを持つ「ADDR」テーブルを作る。

ナッキー:手順は以前PROFILEテーブルを作ったときと同じですね。


まずはInterBase サービスマネージャーを使ってInterBaseサーバーを起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「InterBase サービスマネージャー [instance = gds_db]」をクリックします。「ステータス(T)」欄に、「InterBaseをWindowsサービスとして起動する」にチェックが付いていないことをを確認して、「InterBaseサーバーは停止中」となっていれば、[起動(S)]ボタンをクリックして起動します。「InterBaseサーバーは稼動中」と変化したのを確認して[閉じる](×)ボタンで終了します。

Hide image
01サービスマネージャー

図01 InterBaseサービスマネージャー

次に「IBConsole」を起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「IBConsole」を起動します。

起動できたらテーブルを作成します。データベースを開きます。「Local Server-gds_db」をダブルクリックします。

ここで、「サーバーログインダイアログボックス」が表示された場合は、[ユーザー名(U)]に「SYSDBA」、[パスワード(P)]に「masterkey」と入力して、[パスワードの保存]にチェックをつけて、[ログイン]ボタンをクリックします。

次に「PROFILE.DB」をダブルクリックします。そうして、「PROFILE.DB」の下にある「Tables」を選択して、画面右側の空欄で右ボタンクリックをします。「作成(C)…」メニューをクリックします。

Hide image
02テーブルの作成

図02 テーブルの作成

そうすると、「テーブルエディタ」を表示します。「テーブル名(T)」欄に「ADDR」を入力して、右側の[フィールドの追加(A)]ボタンをクリックします。

次は「フィールドプロパティエディタ」ダイアログボックスが表示されます。

この画面でフィールドを1つずつ追加します。まず「名前」欄に「ID」を入力して、「フィールドの種別」に「特定のデータ型(T)」を選択します。新たに表示される[データ型の編集]ボタンをクリックします。「データタイプ」ダイアログボックスが表示されます。「SQLタイプ」のコンボボックスで「INTEGER」が選択されていることを確認して[OK]ボタンをクリックします。

Hide image
03データタイプの設定

図03 データタイプの設定

「フィールドプロパティエディタ」の画面に戻ったら、画面左下の「NOT NULL」にチェックをつけて、IDの値入力を必須とします。完成したら[OK]ボタンをクリックします。

「テーブルエディタ」ダイアログボックスに戻ったら、プライマリキーを設定します。「ID」が選択されていることを確認して、画面右下の[現在のフィールドを追加(A)]ボタンをクリックします。

Hide image
04プライマリキーの設定

図04 プライマリキーの設定

次は「ADDR_NAME」フィールドです。「テーブルエディタ」ダイアログボックスで、右側の[フィールドの追加(A)]ボタンをクリックします。「フィールドプロパティエディタ」ダイアログボックスの「名前」欄に「ADDR_NAME」を入力して、「フィールドの種別」欄で「特定のデータ型(T)」をクリックします。表示される[データ型の編集]ボタンをクリックして「データタイプ」ダイアログボックスを表示します。「SQLタイプ」欄は「VARCHAR」を選択します。

Hide image
05データタイプ文字列

図05 データタイプ、文字列の場合

キャラクタセットは「S JIS_0208」を選択して、文字長を「32」にします。確認して、[OK]ボタンをクリックします。「フィールドプロパティエディタ」ダイアログボックスに戻ったら「NOT NULL」はチェックをつけずに[OK]ボタンをクリックします。

「内容」欄を確認して、[OK]ボタンをクリックします。もしも、どこか間違っていたり確認したい場合はフィールドを選択して、画面右側の[Edit Field]ボタンをクリックして設定を確認します。

Hide image
06フィールドの完成

図06 フィールドの完成

IBConsoleの画面左側のツリーで「Tables」を選択し、右側に表示されたテーブルの一覧から「ADDR」を選択します。次に「ADDR」をダブルクリックして、「Properties for: ADDR」ダイアログボックスでデータを入力してみます。「データ」タブをクリックして表示を切り替えます。1行目にフィールド名が並び、下に「<null>」と書かれた枠が並びます。

Hide image
07データページ

図07 データページ

「<null>」をクリックして、カーソルが表示されたら文字を入力することができます。「ID」フィールドには「1」から順に番号を入力して、「ADDR_NAME」フィールドには地名を入力します。図を参考に入力してみます。

Hide image
08データ入力

図08データ入力

これで住所テーブルが完成しました。「Properties for: ADDR」ダイアログボックスは[閉じる](×)ボタンで閉じてしまいます。

高橋先生:次にPROFILEテーブルにフィールドを追加してね。

ナッキー:え?何を追加するんですか?

高橋先生:住所IDを格納する「ADDR_ID」フィールドを作ろう。ADDRテーブルには「ID」フィールドと「ADDR_NAME」フィールドを作ったね。PROFILEテーブルには都道府県名の「ADDR_NAME」ではなくて「ID」のほうを格納するフィールドを作るんだ。「東京」の場合は「6」と入力するよ。

ナッキー:番号じゃあ、どこのことだかわからないじゃないですか。

高橋先生:ちゃんと「東京」と表示できるように加工するから心配しないで。今後、町名や番地を入力するかもしれないから、「ADDRESS」フィールドはそのまま残しておこう。

ナッキー:どうなっちゃうのか、めちゃめちゃ心配です。


番号を入力しただけで都道府県名が表示できるんでしょうか?とにかく、PROFILEテーブルにフィールドを追加します。

IBConsoleの画面で左欄の「PROFILE.DB」の下にある「Tables」項目が選択されていることを確認して、右欄のテーブル名「PROFILE」をダブルクリックします。「Properties for: PROFILE」画面が表示されたら、ツールバー左から2番目の[選択された項目の変更]ボタンをクリックします。

Hide image
09選択された項目の変更ボタ

図09 [選択された項目の変更]ボタン

「テーブルエディタ」で[フィールドの追加(A)]ボタンをクリックします。

まず「名前」欄に「ADDR_ID」を入力して、「フィールドの種別」に「特定のデータ型(T)」を選択します。新たに表示される[データ型の編集]ボタンをクリックします。

「データタイプ」ダイアログボックスが表示されます。「SQLタイプ」のコンボボックスで「INTEGER」が選択されていることを確認して、[OK]ボタンをクリックします。「フィールドプロパティエディタ」に戻ったら、同じく[OK]ボタンをクリックしてダイアログボックスを閉じます。

Hide image
10フィールドの追加

図10 フィールドの追加

位置を移動します。追加した「ADDR_ID」を選択して、[上へ(U)]ボタンをクリックします。「ADDRESS」フィールドの上まで移動します。

Hide image
11フィールドの移動

図11 フィールドの移動

設定できたら、[OK]ボタンをクリックします。「Properties for: PROFILE」ダイアログボックスは、[閉じる](×)ボタンで閉じます。

    住所テーブルを活用する

住所テーブルはできたけれど、これをどうやって使うんだろう?コードで1レコードずつ読み込むのかな?教えて、高橋先生!

高橋先生:コンポーネントのプロパティを設定するだけで利用できるんだ。操作自体は難しくないよ。新しく追加した「ADDR」テーブルと既存の「PROFILE」テーブルをどのように関連付けるかが大切だ。

ナッキー:「ADDR」テーブルの中から希望のデータを検索して表示するんですか?

高橋先生:それじゃあ、手間がかかるよね。リレーショナルデータベースを使えば、「キー」となるフィールドの情報を元に、ほかのテーブルのフィールドを参照することができるんだ。

ナッキー:わぁ、「キー」とか「参照」とかよくわかりません。

高橋先生:例えば、社員の情報を管理するデータベースに、給与テーブルと社員テーブルがあったとしよう。給与テーブルには、社員番号フィールドと給与フィールドがある。この給与テーブルをこのまま印刷するとき、社員番号と給与だけしか印刷できない。社員の住所までは不要だけれど、名前や所属が載っていたほうがわかりやすいね。

一方、社員テーブルには、社員Noフィールドと社員名フィールド、所属フィールド、住所フィールドなどが入っている。給与テーブルを印刷するとき、もし社員テーブルの社員名フィールドと所属フィールドが使えたら、社員番号、社員名、所属、給与を載せられる。

このように、異なるテーブルのデータを持ってきたいとき、両方のテーブルに共通するフィールドが必要なんだ。テーブルとテーブルの間に共通する値を持つフィールドを「キーフィールド」とか「キー」という。今回の給与テーブルと社員テーブルの場合は「社員番号」フィールドと「社員No」フィールドだね。キーフィールドが同じになるレコードを引っぱってくることができる。

Hide image
12キーフィールド

図12 キーフィールド

ナッキー:番号が飛んでいたり、並んでいる順番が違っているけれど大丈夫なんですか?

高橋先生:キーフィールドで並べ替えされているほうが、処理は早くなるけれど、このままでも大丈夫。飛んでいても問題ないよ。レコードごと読み込むから、必要なフィールドの値を使うことができる。このようにほかのテーブルのデータを読み込むことを「参照」というよ。読み込むフィールドは「参照フィールド」と呼んでいる。

キーフィールドと参照フィールドを決めれば、レコードを読み込んだり、探したりするのはデータベースでやってくれるからコードを書く必要はないんだ。必要なのは、表示しているテーブル(ここでは給与テーブル)と、そのテーブルのキーフィールド(ここでは社員番号フィールド)、参照したいテーブル(ここでは社員テーブル)と、そのテーブルのキーフィールド(ここでは社員Noフィールド)、参照フィールド(ここでは社員名フィールドと所属フィールド)だけ。コンポーネントのプロパティに、それぞれセットするだけで参照することができる。

参照するだけだから、社員名などの文字列が給与テーブルに格納されることはない。給与テーブルに格納されるのはキーの「社員番号」フィールドだけ。参照フィールドはフォームの上や、印刷用に表されるだけなんだ。

Hide image
Click to see full-sized image

図13 データの参照

ナッキー:でも、名前と所属くらいなら、給与テーブルに最初から入れておけばいいのに。

高橋先生:名前だって結婚すれば変わってしまうことがあるし、所属なんかは頻繁に変わることもあるよね。ここでは給与テーブルと、社員テーブルの関係だけ紹介したけれど、社員名や所属が必要なテーブルが、ほかにもたくさんある場合はどうだろう?名前や所属が変わるたびに、すべてのテーブルを書き直さなければならない。変更し忘れなんかが出てもおかしくはないね。そんなデータの不整合が起こらないような、テーブルの作り方をする必要があるよ。

社員テーブルに名前や所属を入れておいて、ほかのテーブルにはキーとなる社員番号だけを入れておくようにする。そうすると、変更があっても社員テーブルさえ正しく書き換えれば、参照しているすべてのテーブルで、正しい社員名や所属が使えるんだ。

ナッキー:すべてのデータをテーブルに盛り込むより、参照したほうが管理しやすいってことなのね。

高橋先生:でも、あまりにも細かくテーブルを分けてしまうと処理が遅くなってしまうことがあるから、気をつけてね。

ナッキー:何事もほどほどが肝心ってことかぁ。ほかのテーブルからデータをちょっと借りてくるのが参照フィールドで、両方のテーブルに共通するキーフィールドが必要だってことまでは、なんとなくわかりました。参照フィールドを、フォーム上に表示する操作自体は簡単だっていうことでしたよね。

高橋先生:参照フィールドを表示する方法を2つ紹介しよう。ひとつはTDBLookupComboBoxコンポーネントを使う方法。もうひとつは参照項目コンポーネントを使った方法だ。TDBLookupComboBoxコンポーネントは通常のコンポーネント。操作はプロパティを設定するだけだよ。ただプロパティ名が似通っているから、どのテーブルの値を入れるのか注意してね。


まずは、プロジェクトを開きます。Turbo Delphiを起動して、画面中央の「ホームページ」で「ProfileDB.bdsproj」を選択。一覧に表示されていなければ、ツールバーの[プロジェクトを開く(Ctrl+F11)]ボタンをクリックします。「プロジェクトを開く」ダイアログボックスから「ProfileDB.bdsproj」を探します。

画面上部の「FormProfileDB」タブを選択して、画面をフォームデザイナに切り替えます。フォーム上に前回作ったデータが表示されていなければ、「SQLConnection1」コンポーネントを探して「データベース」カテゴリで「Connected」プロパティを「True」にします。さらに「sdsProfile」コンポーネントを選択して、「その他」カテゴリの「Active」プロパティを「True」にしておきます。

コンポーネントを追加します。テーブルのコンポーネントを配置します。画面右下のツールボックス「dbExpress」カテゴリの「TSimpleDataSet」コンポーネントをフォームの邪魔にならない場所に配置します。さらにツールボックス「Data Access」カテゴリの「TDataSource」コンポーネントを適当な位置に配置します。どちらも、非ビジュアルコンポーネントですから、ほかのコンポーネントと重なっても実行時には表示されません。

Hide image
14コンポーネントの配置

図14 コンポーネントの配置

配置できたら、配置した「SimpleDataSet1」コンポーネントを選択して、プロパティを設定します。コンポーネント名は手順によって「SimpleDataSet2」や「SimpleDataSet3」となる場合もあります。ここでは「1」から順に呼びます。

「Connection」プロパティから設定します。画面左下のオブジェクトインスペクタ、プロパティページの「リンク」カテゴリで「Connection」プロパティを探して、「SQLConnection1」を選択します。次に「リンク」カテゴリの「DataSet」で[+]をクリックして展開します。「CommandType」プロパティに「ctTable」、「CommandText」プロパティに「ADDR」を設定します。次に、「Name」プロパティを設定します。「その他」カテゴリで「Name」プロパティを「sdsAddr」に設定します。ここまで設定できたら「その他」カテゴリで「Active」プロパティを「True」にします。

SimpleDataSet1

カテゴリ名

プロパティ名

設定値

リンク

Connection

SQLConnection1

リンク・DataSet

CommandType

ctTabel

リンク・DataSet

CommandText

ADDR

その他

Name

sdsAddr

その他

Active

True


次に「DataSource2」のプロパティを設定します。プロパティページの「リンク」カテゴリで「DataSet」プロパティに「sdsAddr」を設定します。

DataSource2

カテゴリ名

プロパティ名

設定値

リンク

DataSet

sdsAddr


今度は参照フィールドを表示するコンポーネントを配置します。配置する場所を空けます。性別のdbrgpMaleラジオグループと、並べ替えのcmbSortコンボボックスを移動して、間に隙間を作ります。ツールパレットの「Data Controls」カテゴリで「TDBLookupComboBox」を選択して、空けた隙間に1つ配置します。似た名前のコンポーネントがあるので、気をつけてくださいって高橋先生が言ってました。

15TDBLookupComboBox

図15 TDBLookupComboBox

Hide image
16TDBLookupComboBoxの配置

図16 TDBLookupComboBoxの配置

プロパティを設定します。先に項目コンポーネントを追加します。「sdsProfile」コンポーネントをダブルクリックして「項目の設定」ダイアログボックスを表示します。「項目の設定」ダイアログボックスの上でマウスの右ボタンをクリックしてショートカットメニューを表示します。メニューから「項目の追加(A)...Ctrl+A」を選択して、「項目の追加」ダイアログボックスを表示します。「ADDR_ID」を選択して[OK]ボタンをクリックします。

Hide image
17項目の追加

図17 項目の追加

設定できたら、「項目の設定」ダイアログボックスは閉じておきます。

次に配置した「DBLookupComboBox1」を選択して、プロパティページの「リンク」カテゴリで「DataSource」プロパティに「DataSource1」、「ListSource」プロパティに「DataSource2」を設定します。「データベース」カテゴリの「DataField」プロパティに「ADDR_ID」を選択します。これが実際に表示したり格納したりするフィールドになるんですって。そして、「データベース」カテゴリの「KeyField」プロパティに「ID」を設定します。ここに設定するのは参照するADDRテーブル側のフィールド名です。最後に「ListField」プロパティに「ADDR_NAME」を設定します。画面に表示するためのフィールド名になります。「その他」カテゴリの「NAME」プロパティに「dblcmbAddr」を入力します。

DBLookupComboBox1

カテゴリ名

プロパティ名

設定値

リンク

DataSource

DataSource1

リンク

ListSource

DataSource2

データベース

DataField

ADDR_ID

データベース

KeyField

ID

データベース

ListField

ADDR_NAME

その他

NAME

dblcmbAddr


設定できたら保存して実行してみましょう。

ツールバーの[すべて保存]ボタンをクリックし、次に [実行]ボタンをクリックしてプログラムを実行します。最初「ADDR_ID」フィールドの値は空ですから、「ADDRESS」フィールドの値を参考にして実行テストのときに入力します。実行できたら、新しく追加した住所のdblcmbAddrコンポーネントで、プルダウンで一覧からデータを選択します。以前配置した住所のコンボボックスdbcmbAddressコンポーネントの値を参考にして設定します。

Hide image
18データの入力

図18 データの入力

すべてのレコードで設定できたら、[保存(S)]ボタンをクリックして、ADDRテーブルの値を確認してみましょう。

「IBConsole」を表示します。すでに閉じてしまった方は「IBConsole」を起動します。Windows OSのスタートメニューで「Borland InterBase 7.5 Developer [instance = gds_db]」の「IBConsole」を起動します。「Local Server-gds_db」-「Database」-「PROFILE.DB」-「Tables」とたどって、「PROFILE」テーブルをダブルクリックします。

「Properties for: PROFILE」画面を表示して「データ」タブを選択します。「ADDR_ID」フィールドを見ると住所の文字列ではなくて、数値が入力されています。確認できたら「Properties for: PROFILE」画面を閉じて「IBConsole」は終了します。

Hide image
19ADDR_IDフィールドのデータ

図19 ADDR_IDフィールドのデータ

    参照項目コンポーネント

フォーム上の入力では「東京」などを選択しましたが、実際には「6」とか「7」とかの数値が入っているんですね。なんだか不思議な感じ。そういえば高橋先生は2つの方法を紹介してくれるって言ってたわね。もう1つの方法ってどうやるんだろう?教えて、高橋先生!

高橋先生:もう1つの方法は「参照項目コンポーネント」を作る方法だ。TSimpleDataSetコンポーネントをダブルクリックして表示する「項目の設定」ダイアログボックスで項目コンポーネントを追加したのは覚えている?フィールドをコンポーネントとして扱えて、プロパティを設定できるんだよね。同じように参照フィールドもコンポーネントにしてしまうことができるんだ。

ナッキー:テーブルに参照フィールドを追加するんですか?

高橋先生:データベースやテーブルに実際にフィールドを追加するわけではないよ。作っているプログラムの中で項目コンポーネントと同様に扱える、参照フィールドということになる。実際にはテーブルになくても、そういうフィールドを持っているみたいに使えるんだ。格納されるデータも「ADDR_ID」の数値であって、「東京」とか「神奈川」といった文字列にはならない。

ナッキー:さっきのTDBLookupComboBoxコンポーネントを使う場合と、参照項目コンポーネントを使う場合、どう使い分ければいいんですか?

高橋先生:表示する箇所が複数ある場合は参照項目コンポーネントのほうがいいだろう。フォーム上に表示する方法を紹介する前に、参照項目コンポーネントの設定をしておこう。設定はダイアログボックスで行う。その途中で[Enter]キーなどを押してしまうと、設定が終わってしまうことがあるから気をつけてね。プロパティページでも設定を続けられるけれど、ダイアログボックスを使ったほうがわかりやすい。もしも間違って設定を終了した場合は、参照項目コンポーネントを[Delete]キーで削除して、はじめから作り直そう。


はじめに「PROFILE」テーブルを閉じます。フォームデザイナの画面で「sdsProfile」コンポーネントを選択してオブジェクトインスペクタ、プロパティページの「その他」カテゴリで「Active」プロパティを「False」にします。次に「sdsProfile」コンポーネントをダブルクリック、もしくは右ボタンクリックして[項目の設定(T)...]を選択します。表示される「項目の設定」ダイアログボックスの上でマウスの右ボタンをクリックしてショートカットメニューを表示します。ショートカットメニューから[項目の新規作成(N)...Ctrl+N]を選択し、「項目の新規作成」ダイアログボックスを表示します。

Hide image
20項目の設定

図20 項目の設定ダイアログボックス

「項目のプロパティ」枠の「名前(N):」欄に「住所」と入力します。これは「Name」プロパティになるわけではないんですって。次に「コンポーネント(O):」は「sdsProfileADDR_NAME」とします。これが「Name」プロパティになるのだそうです。「型(T):」欄は表示する「ADDR_NAME」フィールドにあわせて「String」、サイズは「16」にします。「項目の種類」枠では「参照(L)」を選択します。次に「参照の定義」枠です。「キー項目(K):」はPROFILEテーブル側のキーフィールドを選びます。ここでは「ADDR_ID」とします。「データセット(A):」欄は「sdsAddr」を選択します。「参照側のキー(U):」にはADDRテーブルのキーフィールドを設定します。ここでは「ID」とします。「値を返す項目(R):」はフォーム上に表示したいフィールドです。一覧から「ADDR_NAME」を選択します。すべて設定できたら[OK]ボタンをクリックします。

Hide image
21項目の新規作成rep

図21 項目の新規作成

これで参照項目コンポーネントができました。「項目の設定」ダイアログボックスは[閉じる](×)ボタンで閉じます。次に、「PROFILE」テーブルを開きます。「sdsProfile」コンポーネントを選択してプロパティページの「その他」カテゴリで「Active」プロパティを「True」にします。

    フォームに参照項目を表示する

次は参照項目コンポーネントを使ってフォームに表示するのね。教えて、高橋先生!

高橋先生:TDBLookupComboBoxなら、ほかの項目コンポーネントと同様、フォームにドラッグして配置することができるよ。TDBGridの場合、「カラムエディタ」で項目を追加することで列を追加できる。

ナッキー:設定は簡単そうですね。


住所のコンポーネントばかりが、たくさん合ってもしかたないので、削除しておきます。先ほど配置した「dblcmbAddr」コンポーネントと、以前からある「dbcmbAddress」コンポーネント、それから「住所」のラベルは削除します。次に「dbcmbAddress」コンポーネントがあった場所に「項目の設定」ダイアログボックスから「住所」項目コンポーネントをドラッグして置きます。そうすると、プルダウンのボタンがついた「TDBLookupComboBox」コンポーネントが配置できます。

Hide image
22参照項目コンポーネント

図22 参照項目コンポーネント

「項目の設定」ダイアログボックスは[閉じる](×)ボタンで閉じます。「性別」のラジオグループと「並べ替え」のコンボボックスの間を詰めて元の状態に戻します。

次に「dbgrdProfile」DBグリッドをダブルクリック、もしくはもしくは右ボタンクリックして[カラムエディタ(L)...]を選択します。「カラムエディタ」ダイアログボックスのツールバーで[すべての項目の追加]ボタンをクリックします。

Hide image
23すべての項目の追加

図23 すべての項目の追加

「入力済みの項目を削除してもよいですか?」という確認のメッセージボックスが表示されます。[はい(Y)]ボタンをクリックします。そうすると、すべての列が再配置されます。「ADDRESS」列は不要なので選択して[Delete]キーで削除します。「住所」と「ADDR_ID」列を上に移動します。マウスでドラッグして「FULLNAME」の次に「ADDR_ID」、その次に「住所」、その次に「BIRTHDAY」となるように移動します。

Hide image
24カラムエディタ

図24 カラムエディタ

次に「dbgrdProfile」DBグリッドですべての列が表示できるように幅調整します。タイトルの入った灰色の部分の境界線をドラッグすると幅が調整できます。

設定できたら保存して実行します。ツールバーの[すべて保存]ボタンをクリックします。次にツールバーの[実行]ボタンをクリックして、実行します。「dbgrdProfile」DBグリッドの住所列でクリックを2回するとプルダウンのボタン(▼)が表示されます。どれかひとつレコードを選択して変更してみます。変更を保存する場合は[保存(S)]ボタンをクリックします。

Hide image
25完成図

図25 完成図

ナッキー:データは「PROFILE」テーブルの「ADDR_ID」フィールドなんだけど、表示しているのは「ADDR」テーブルの「ADDR_NAME」だなんて、妙な感じです。

高橋先生:参照フィールドは、違うテーブルのデータをちょっと見ているだけなんだ。参照フィールドをうまく作れると、データベースもスマートに作ることができるよ。まずは、参照フィールドが使えればOK。

ナッキー:データベースの効率がよくなると、プログラムも使いやすくなるんですよね。

高橋先生:処理に時間がかかったり、間違ったデータを入力しやすかったりすると、データベースが使えなくなってしまうからね。データベースの効率はプログラムにとっても重要だよ。

ナッキー:データベースを使うにもいろいろあるんだな。

高橋先生:次回でデータベースは終わり。データを確実にデータベースへ登録する方法を紹介するよ。次回もがんばってね。


ナッキーの「Turbo Delphiはじめて奮戦記」

Prev | Next | Index


Server Response from: ETNASC03