フィールドレベルプロパティを使用してアクセスリストコントロールにデータを入力する10の手順 - TechRepublic

フィールドレベルプロパティを使用してアクセスリストコントロールにデータを入力する10の手順 - TechRepublic

リスト コントロールには、ユーザーが選択する複数の値が表示されます。入力を特定のリストに制限することで、入力ミスや無効なデータがなくなり、パフォーマンスが向上する場合もあります。リストによっては、ユーザーが新しい値を入力できるものもあれば、静的なものもあります。たとえば、州の 2 文字の略語のリストは静的です。つまり、すべての値は事前にわかっており、それらの値が変更されることはありません。ユーザーにこれらの値を自分で入力させるのではなく、ルックアップ テーブルと呼ばれる独自のテーブルにこれらの値を保存する必要があります。次に、そのリストを使用してリスト コントロールに値を設定し、ユーザーがこのリストから値を選択できるようにします。この記事では、フィールド (テーブル) レベルでプロパティを設定してルックアップ フィールドを作成し、リスト コントロールに瞬時に値を設定する方法を説明します。ウィザードによってフィールド レベルのプロパティがいくつか設定され、そのテーブルを基にしたフォームによってリスト コントロールに値が自動的に設定されます。

この記事は、テーブル、クエリ、フォームの作成方法、そして正規化とリレーションシップについてある程度の知識があることを前提としています。正規化とリレーションシップはこの記事の完了に必須ではありませんが、プロセスを理解する上で役立ちます。手順は.accdb形式に基づいていますが、.mdb形式を使用している場合でも問題なく実行できるはずです。参考までに、サンプルの.accdbまたは.mdbファイルをダウンロードできます。

背景

メインテーブルとルックアップテーブル間のリンクは有効なリレーションシップです。メインテーブルはルックアップテーブルとフィールドを共有しています。しかし、ルックアップフィールドには、ユーザーにとって意味のない主キー値が表示される代わりに、ルックアップテーブルから取得した意味のある(説明的な)テキスト値が表示されます。例えば、注文書に企業リストが表示されるとします。ユーザーはACME, Inc.のCompanyIDが12であることを知りません。ユーザーはACME, Inc.を選択しますが、テーブルには数値12が格納されています。ルックアップフィールドには、ある値と別の値が表示されます。

このフィールドプロパティはコントロールに継承されるため、この機能は一般ユーザーにとって非常に便利です。フィールドレベルでルックアッププロパティを適用することで、ユーザー側で特別な作業を行うことなく、フォームにリストコントロールを追加できます。

この機能の強力さはデータベース開発者の間で議論を巻き起こしており、多くの人がこれを好んでいません。覚えておくべき重要な点は、ルックアップフィールドは1つの値を表示し、別の値を格納するということです。クエリ、式、フィルター、またはルックアップフィールドを参照するその他のオブジェクトを作成する際は、ユーザーに表示される値ではなく、格納されている値を参照するように注意してください。ルックアップフィールドを実装するかどうかの選択は、その依存オブジェクトすべてに反映されるため、設定を忘れるという選択肢はありません。

組織で将来的にAccessデータベースのサイズを拡張する可能性がある場合は、ルックアップフィールドを使用しないでください。また、セキュリティ保護されたデータベースではルックアップフィールドを使用すべきではありません。これら2つの反対意見は妥当ですが、専門的なITサポートを受けられないほとんどのユーザーには影響しません。念のため、これらの点について言及しました。

私のアドバイスは次のとおりです。

  • ルックアップフィールドが時間を節約できるなら、それを使う
  • リストコントロールの作成にスキルが必要な場合は、ルックアップフィールドを使用します。
  • 基本的なスキルがなく、会社に予算がある場合は、プロのデータベース開発者を雇ってください。
  • 決定事項を文書化し、ルックアップフィールドが他の操作を妨げる可能性があることに留意してください。

1. テーブル

図 A は、サンプル データベース内の 3 つのテーブルを示しています。

図A

PhoneDescriptionLookup の値を使用してリスト コントロールを入力します。

これらのテーブルを作成するには、表Aを参照するか、サンプルファイルをダウンロードしてください。ContactsテーブルとPhoneNumbersテーブルの間には、ContactIDとContactIDFKに基づく1対多の関係があります。

表A

これらのテーブルを作成するためのリファレンスはここです。または、サンプル ファイルをダウンロードしてください。

各連絡先には複数の電話番号を設定できますが、各番号は1つの連絡先にのみ割り当てられます。1つの電話番号は複数の連絡先に割り当てられる場合もありますが、ここでは説明を簡潔にするため、1対多の関係で説明します。各番号は固定電話または携帯電話です。図Aでは、PhoneDescriptionLookupにLandとCellという検索値が含まれていることに注目してください。

2. 関係性

メインテーブルと参照テーブルの間に永続的なリレーションシップを設定する必要はありません。ただし、PhoneNumbersテーブルとContactsテーブルの間に永続的なリレーションシップを作成し、ウィザードを使用してデータ入力フォームを生成できるようにします。リレーションシップウィンドウは、「データベースツール」タブの「リレーションシップ」グループにあります。PhoneNumbersテーブルとContactsテーブルを追加し、「ContactID」を「ContactIDFK」テーブルにドラッグします。図Bに示す「リレーションシップの編集」ダイアログが表示されたら、「作成」をクリックします。ウィンドウを閉じてリレーションシップを保存します。

図B

1対多の関係を作成します。

3. クエリ

手順4で作成するデータ入力フォームは、図Cに示すクエリに基づいています。お好みの方法で、「PhoneNumbers」と「Contacts」の両方のフィールドをすべてグリッドに追加してください。クエリの名前は「ContactsPhoneNumbersQuery」とします。

図C

このクエリに基づいてデータ入力フォームを作成します。

4. フォーム

フォームウィザードを使用して、図Dに示すデータ入力フォームをContactsPhoneNumbersQueryに基づいて作成します。フォームにすべてのフィールドを追加し、リンクフォームではなくサブフォームを選択します。フォームの名前は「Enter Phone Numbers」とします。サブフォームのサイズは変更が必要になる場合があります。

図D

このフォームでは、連絡先の電話番号を入力できます。

5. フォームはそのまま

このフォームでは、連絡先とその電話番号を入力できます。「LastName」テキストボックスに「Smith」と入力すると、Access によって主キー(オートナンバー)の値が生成されます。サブフォームにタブ移動すると、Access によって PhoneID フィールドと ContactIDFK フィールドが更新されます。

次に、Smithの電話番号を入力するかのように、PhoneDescriptionIDFKコントロールにTabキーで移動します。入力する外部キーの値を知っている必要があります。今は、ランドとセルの2つしかないので簡単です。たとえこのデータベースのユーザーがあなただけだったとしても、この方法はお勧めしません。タイプミスや無効なデータが発生する可能性があるためです。可能な限り、すべての入力値を管理するか、検証することをお勧めします。リストコントロールを手動で作成するか、ルックアップフィールドを使用してコントロールを自動的に生成することもできます。

6. ルックアップフィールド

電話番号の説明テキストを表示し、対応する数値を自動的に保存するリストコントロールを作成するには、ルックアップフィールドを使用します。この場合、PhoneDescriptionIDFKを使用してPhoneDescriptionのテキスト値を表示し、数値をPhoneDescriptionIDに保存します(図Aを参照)。これを行うには、デザインビューでPhoneNumbersテーブルを開き、PhoneDescriptionIDFKフィールド行を選択して、以下の手順に進みます。

  1. データ型ドロップダウンからルックアップウィザード(図E)を選択します。
    図E
  2. 値は既にテーブル内に存在しているため、デフォルトのオプションのまま「次へ」をクリックしてください。原則として、値を入力することは避け、可能な限りテーブル内の既存の値を参照することをお勧めします。
  3. 値は PhoneDescriptionLookup にあるので、そのテーブルを選択して [次へ] をクリックします。
  4. 両方のフィールドを「選択したフィールド」コントロールに追加し(図F)、次へをクリックします。
    図F
  5. PhoneDescription で並べ替えて、[次へ] を 2 回クリックします。
  6. [完了] をクリックし、プロンプトが表示されたらテーブルを保存します。

下部のペインにある「ルックアップ」タブをクリックすると、設定したルックアップのプロパティが表示されます。SQL文は

SELECT [PhoneDescriptionLookup].[PhoneDescriptionID], [PhoneDescriptionLookup].[PhoneDescription] FROM PhoneDescriptionLookup ORDER BY [PhoneDescription];

依存リストコントロールに値を入力します。列幅プロパティを0″;1″に設定すると、主キーの値は非表示になります。ユーザーに表示されるのは、PhoneDescriptionのテキスト値のみです。

7. 新しいフォーム

「電話番号入力」フォームは既に存在するため、ルックアップフィールドを継承できません。既存のフォームでコントロールを変更することは可能ですが、そうするとルックアップフィールドの真のメリット、つまりリストコントロールが自動的に構築されるというメリットが損なわれてしまいます。(フォームを作成する前に、ルックアップフィールドの計画を立てておくことをお勧めします。)

手順4を繰り返して新しいフォームを作成し、任意の名前を付けます。図Gに示すように、新しいサブフォームには、PhoneDescriptionIDの主キー値ではなく、PhoneDescriptionの説明テキスト値が表示されます。コントロールにデータを入力する作業は不要です。

図G

リスト コントロールは、フィールドのルックアップ プロパティを継承します。

8. ルックアップ値を変更する

ルックアップ値は通常は固定ですが、場合によってはリストを変更する必要があります。変更するには、ルックアップテーブルを開いて変更を加えます。依存するすべてのクエリとコントロールがそれに応じて更新されます。追加の作業は必要ありません。この動作を確認するために、図Hに示すように、PhoneDescriptionLookupを開いて新しいレコード(Fax)を追加してみましょう。テーブルを保存して閉じます。

図H

ルックアップ テーブルに新しい値を追加します。

9. 更新されたリストを使用する

作成した 2 番目のフォームを開き、PhoneDescriptionIDFK のドロップダウン リストをクリックして、図 Iに示す更新されたリストを確認します。

図I

コンボ ボックスは自動的に更新されます。

10. 結果

ルックアップフィールドは他の操作の妨げになる可能性があると述べ、手順6では暗黙的なリスト(ルックアップウィザード実行時の手順2)を避け、代わりにルックアップテーブルを使用することを推奨しました。ルックアップテーブルに値を設定すると、後続のクエリやレポートの定義がはるかに簡単になります。図Jは、電話番号を固定電話、携帯電話、FAX番号の種類ごとにグループ化したシンプルなレポートを示しています。レポートウィザードを使用することで、このレポートの作成にはわずか数分しかかかりませんでした。

図J

このレポートでは、電話レコードをタイプ (参照値) 別にグループ化します。

警告!

リストコントロールに手動で値を入力する場合、コントロールの「値集合ソース」プロパティを設定して、基になるテーブルから値を取得します。ルックアップウィザードは、フィールド(テーブル)レベルでこの処理を自動的に実行します。プロの開発者からの厳しい警告にもかかわらず、この機能は、#10 に従う限り便利です。プロの開発者が分散データベースでルックアップフィールドを使用することを推奨しているわけではありません。ユーザーには便利な機能を活用してほしいと提案しているだけです。この意見に賛同する人は必ずしもいないことは承知しています。

Officeに関するご質問をお送りください

読者からの質問には可能な限りお答えしますが、必ずお答えできるとは限りません。ご連絡の際は、できるだけ具体的にご記入ください。例えば、「ワークブックのトラブルシューティングをして、問題点を修正してください」といった質問ではおそらく回答が得られないでしょうが、「この数式が期待どおりの結果にならない理由を教えていただけますか?」といった質問であれば、回答が得られるかもしれません。ご使用のアプリとバージョンを明記してください。TechRepublicから私の時間や専門知識に対する報酬は支払われておらず、読者から料金を請求することもありません。お問い合わせは[email protected]までお願いいたします。

Tagged: