複数のテーブルを持つアプリでは、アプリのテーブル間に参照と呼ばれる接続を作成すると便利です。
たとえば、注文取得アプリに次のようなテーブルが含まれていたとします。
注文
: 注文ごとに 1 行。注文の詳細
: 項目ごとに 1 行。商品
: 販売される商品ごとに 1 行。顧客
: 顧客ごとに 1 行。
この注文取得アプリには、次のような参照が含まれているかもしれません。
注文
の各行は、その注文を行った顧客の顧客
行を参照します。注文の詳細
の各行は、親である注文
行を参照します。注文の詳細
の各行は、対応する商品
行を参照します。
参照には以下の 3 つの目的があります。
- 関係性を表します。たとえば、
注文
行と顧客
行の間の参照により、注文と、その注文を行った顧客との関係を取得できます。 - 別のテーブルにある関連行の情報を簡単に取得できます。たとえば、
注文の詳細
行と商品
テーブルの間の参照により、個別の注文の詳細
行から関係する商品
行の名前、画像、価格の列の値を取得できます。 - 使用すると、ある行から別の行に移動できます。たとえば、特定の
注文の詳細
行を取得してから、関連する注文
行に移動し、さらに関連する顧客
行に移動できます。
参照を定義した後で、参照されているテーブルから列の値を取得するには、式の逆参照を使用します。
以下のセクションでは、テーブル間の参照について詳しく解説します。
参照の基本
以下で説明するように、動画を見るかサンプルアプリを使用して参照の基本を学びます。
動画
次の動画では、AppSheet でテーブル間に参照を作成する方法について学べます。
サンプルアプリ
注文取得の方法に関する機能サンプルを使用して、アプリのテーブル間の参照を使用する方法の基礎をご確認ください。
参照の作成
参照をテーブルに追加する方法は 2 つあります。
- AppSheet では、テーブルを生成または再生成するとき、自動的に参照が追加されます(システムによる追加)。
- 手動で参照を追加できます(ユーザーによる追加)。
システムにより追加された参照
ユーザーがアプリを最初に作成するとき、またはテーブルの列構造を再生成するとき、AppSheet はテーブル間の参照を自動的に推定しようと試みます。たとえば、顧客
テーブルにキーとして Name
列があり、注文
テーブルに Customer Name
という列があるなら、Customer Name
列が Ref
列と推定されます。
ユーザーにより追加された参照
参照を作成するには、タイプ Ref
の列をテーブルに追加し、関係するテーブルの名前を指定します。たとえば、注文
テーブルに、顧客
テーブルへの Ref
を追加します。注文の詳細
テーブルに、注文
テーブルへ 1 つ、商品
テーブルへも 1 つの Ref
を追加します。
参照は次のように追加できます。
- ワークシートに、参照を格納する列があることを確認します。
- 参照を格納する新しい列をワークシートに追加する必要があるなら、テーブル スキーマを再生成します。これにより、新たに追加されたワークシートの列がテーブルに含められます。
- [データ] に移動し、編集するテーブルをリストから選択します。
アプリエディタを強化しました。
デフォルトでは新しいエディタが有効になっていますが、いつでも以前のエディタに戻すことができます。以前のエディタを使用する場合
[Data] > [Columns] に移動し、編集するテーブルを展開します。 - [Type] プルダウンで、[Ref] を選択します。
- [Source table] プルダウンで、参照されるテーブルを選択します。
- [Done] をクリックします。
- 次のいずれかを選択して変更を保存します。
- Save - アプリを保存します。
- Save & verify data - アプリを保存し、外部依存関係に基づいてアプリが実行可能であるかどうかを確認します。
逆参照
追加した Ref
のそれぞれについて、システムは反対の方向に逆参照を自動的に追加します。これは、ユーザーとシステムのどちらにより追加された参照についても行われます。逆参照の仮想列にはデフォルトの名前が付けられますが、変更することもできます。
たとえば、注文
テーブルから顧客
テーブルに Ref
を追加するとき、システムは顧客
テーブルから注文
テーブルへ自動的に逆参照を追加します。
逆参照には以下の 3 つの目的があります。
- 逆参照は、ある行から関連するすべての行に移動できます。
- 逆参照は、ユーザー インターフェースで行とともに表示されます。これにより、別のテーブルにある関連する行をすべて簡単に確認できます。
- 逆参照は、顧客の注文の数や合計金額のような集計を計算できます。
逆参照の仮想列には、特別な関数 REF_ROWS()
を使用するアプリ数式が割り当てられます。REF_ROWS()
はバックグラウンドで複雑な SELECT()
動作を行います。
参照と逆参照の両方について、参照のアイコンが表示されます。
参照と逆参照に含まれるキーの値
Ref
列には常に、参照されている行のキー列の値が格納されます。たとえば、顧客
行のキー列の値が Ann Adams
なら、関連する注文
行の Ref
フィールドには値 Ann Adams
が含まれます。テーブルのキー列の値は、そのテーブルの各行を一意に識別します。キー列の値のコピーが Ref
列にあるため、システムは参照されているテーブルの正しい行を曖昧さなしに取得できます。キーとはをご覧ください。
システムにより追加される逆参照の列は、関連する行のキー列の値のリストです。たとえば、顧客
レコードである Ann Adams
の逆参照には、1003
、1005
、1010
が含まれます(これらが Ann の関連する注文
レコードのキー列の値である場合)。個々の行を表示する際に、関連する逆参照はカスタマイズ可能なインライン ビューとして表示されます。
テーブル間の所有関係を示す
参照は、2 つのテーブルが関連していることを示せるだけでなく、1 つのテーブルの行が、他のテーブルの行によって所有されるべき(またはその一部とみなされるべき)であることを示すこともできます。このことは、Ref
列構造の IsAPartOf オプションを有効にすることによって実現できます。通常これは、Ref
列を含む行が、参照されるテーブルの行と関連付けられたときにのみ意味を持つ場合にだけ行われるべきです。たとえば、注文
を参照する項目に関して別個の注文の詳細
テーブルがあるかもしれません。しかし、概念上は各エントリが注文
の一部とみなされるべきであって、独立して存在するべきではありません(言い換えると、注文
レコード行がそれを参照する注文の詳細
を所有している)。
この所有関係を有効にすることは、以下のことを意味します。
- フォームビューでは、ユーザーはフォームを離れることなく、ある行の一部である関連する行の追加と更新を行える必要がある。
- 複数行から成るフォームは、単一の更新として扱われる必要がある。
- 行が削除される場合、その一部である関連する行も削除される必要がある(単一の更新として扱われる必要がある)。
これらのうち、最初に有効になるのは 1 番目のものです。IsAPartOf
とマーク付けされた Ref
列に関連付けられた、システム生成された逆参照列がフォームビューに表示され、ユーザーはフォームビュー内で項目の表示、追加、編集を行えるようになります。これらのオプションが利用できるかどうかは、テーブルまたはスライスのアクセス許可によって決まります(最終のフォームが保存されるまでは、テーブルで更新が許可されていない場合でも、保留中の追加を修正できます)。
以下の制限にご注意ください。
- テーブルで
IsAPartOf
とマーク付けできるRef
列は 1 つだけです(1 つの行が属することができるのは、他の 1 つの行のみです)。 - フォーム内ではアクションはサポートされていません。フォーム内の逆参照に基づくインライン ビューは、ビューイベントに基づいてアクションを表示したりアクションをトリガーしたりしません。
- 項目の追加または編集が保留されているフォームをキャンセルすると、それらの追加または編集もキャンセルされます。