オートルックアップクエリの利用

 通常、選択クエリはデータを抽出するために用いますが、クエリにおいても一定の条件を満たせばデータの追加・更新を行うことは可能です。
 また、複数のテーブルに基づくクエリを編集することも可能です(くどいですが一定の条件があります)。このとき、ある列に入力した値に基づいて、テーブルに記録されている他の列の値を自動的に表示させることができ、見やすいデータの編集が可能となります。これがオートルックアップクエリです。
 ただし、アクションクエリのように特段そのためのコマンドがあるわけではありません。条件を満たせば満たせば自動的に働く、選択クエリの機能の一部といえます。

f:id:accs2014:20170615001832p:plain:right:w500

 さて、例として用いるのは社員テーブルと…


f:id:accs2014:20170615001828p:plain:right:w600

 それぞれの社員が起こした事故を記録する事故テーブルです。このテーブルには「社員番号」列があり、その値と社員テーブルの内容をもと、それぞれの事故をどの社員が起こしたのかを知ることができます。しかし、事故テーブルに新たな行を追加しようとしても、社員テーブルを一緒に開かないと社員番号の何番が誰を指しているのかわかりません。
 テーブルの正規化を行うとこのように情報が各テーブルに分割され全体像がつかみにくくなってしまいますが、事故テーブルを編集するときにも、社員テーブルに記録されている氏名等の情報が確認できると便利です。
 
 フォームを用いてそれぞれのテーブルの情報を表示し、各テーブルのデータを同時に編集することも可能ですがことも可能ですが、オートルックアップクエリを使えばそこまでせずとも、クエリ上で関連するテーブルのデータ内容を確認しながら編集を進められます。


f:id:accs2014:20170615001822p:plain:right:w600

 まずオートルックアップクエリの実際の動作をご覧いただきます。
 新たな事故の記録を入力するにあたり、事故IDを入力し、次に事故を起こした社員の社員番号を入力すると…


f:id:accs2014:20170615001817p:plain:right:w600

 社員テーブルの内容にもとづき、氏名と住所が表示されます。
 これがオートルックアップの働きです。


f:id:accs2014:20170615001918p:plain:right:w600

 さて、このクエリを作るためのデータシートビューです。
 両方のテーブルに含まれる列を表示しているだけですが、社員番号列については社員テーブルのものではなく、事故テーブルの社員番号を表示する必要があります。ここで社員テーブルの社員番号を表示させると、選択クエリとしては同じ内容が表示されますがますが、新たなデータの入力(行の追加)ができなくなってしまいます。なぜそうなるのかの詳細は省略しますが、もともと「事故テーブルの編集を行うにあたって社員テーブルの値も見られたら便利だな」という発想からスタートしていることを思い出せば、編集の対象となる事故テーブルの列を表示させておくべきことは理解しやすいと思います。

 なお、社員番号を主キーとして設定していないと、オートルックアップは機能しませんので注意してください(重複しないインデックスでもOKです)。
 ただし、リレーションシップの設定は不要です。通常であれば参照整合性まで含め、リレーションシップの設定まで行うところですが、設定しなくともオートルックアップが機能することを示すため、ここでは設定を行っていません。


f:id:accs2014:20170615001913p:plain:right:w600

 さて、このクエリによる社員テーブルへの行の追加(削除)はできませんが、実は値の更新は可能です。
 試しに社員番号1の社員の住所を「東京都杉並区○○」から「東京都新宿区☆☆」に変更すると…


f:id:accs2014:20170615001909p:plain:right:w600

 レコードの確定時に社員テーブルの値が更新され、表示されている社員番号1の社員の住所が全て書き換わります(1行目と3行目の値を確認ください)。


f:id:accs2014:20170615001902p:plain:right:w500

 このようにして事故テーブルへの行の追加、社員テーブルの値の変更を行った後の、各テーブルの様子です。


f:id:accs2014:20170615001906p:plain:right:w500

 お気づきのことと思いますが、オートルックアップクエリを利用するにあたっては主キーの設定や更新可能なクエリについてなど、意外に多くの知識が求められます。どんなクエリを作ってもうまい具合に関連するテーブルを編集してくれるというわけではありませんのでご注意ください。


f:id:accs2014:20170615001825p:plain:right:w500

 さて、補足ですが、関連する複数のテーブルの情報を確認しながらデータの入力を進めたいという場合は、ルックアップ列を用いるという方法もあります。また、サブデータシートの利用も考えられます。
 後者の例を示しますが、この例では、社員テーブルのサブデータシートとして事故テーブルを設定することにより、社員テーブル側から事故テーブルを開きデータの追加・更新・削除を行っています。もちろん、社員テーブルのデータの追加・更新・削除も可能です。
 いずれの方法も一長一短ありますが、オートルックアップクエリと違って新たなオブジェクトを作成する必要がなく、便利な機能ですのでご検討ください。