AppSheet で請求書アプリ(第3回)Refでリレーションシップを設定

folder_openAppSheet

請求書アプリを作りながら、 AppSheet (アップシート)の使い方を学びましょう。
前回(第2回)は、Googleスプレッドシートのサンプルデータを読み込んで、請求書アプリを作成しました。
今回は、「Ref」を使ってテーブル間のリレーションシップ(親子関係)を設定します。
「明細」テーブルに「Ref」を設定して、「請求書」テーブルとのリレーションシップを設定します。

1. 「明細」テーブルの列を設定する

前回(第2回)に引き続き、テーブルと列の設定を進めます。
「明細」テーブルの列を設定しましょう。

アプリエディタ左側メニュー「Data」をクリックします。
Dataナビゲーションで「明細」テーブルを選択して、中央のメインパネルに「明細」テーブルの列設定パネルを表示します。

「明細」テーブルの列を設定してきましょう。
下の表のように、各列の

  • TYPEをプルダウンから選択する
  • KEY、LABEL、SHOW?などのチェックボックスをON / OFF する

ことで設定してください。

TYPE(データ型)とは列に保存するデータの種類(テキスト型、数値型、日付型など)のことです。
AppSheetがサンプルデータを読み込んだときに自動的に設定してくれますが、

  • 単価、金額、消費税、合計:Price
  • 単位:Text
  • 税区分:Enum

の設定を変更します。
チェックボックスは「ON」のフィールドをチェックして、空欄はチェックを外してOFFにします。

「明細」テーブルの列設定

NAME TYPE KEY LABEL SHOW? EDITABLE? REQUIRE? SEARCH?
_RowNumber Number
ID Text ON ON ON
請求書 Ref ON ON ON ON
商品 Ref ON ON ON ON ON
単価 Price ON ON ON
数量 Number ON ON ON
単位 Text ON ON ON
金額 Price ON ON ON
税区分 Enum ON ON ON ON
消費税 Price ON ON ON
合計 Price ON ON ON

 

「請求書」「取引先」「商品」テーブルと同様に、「ID」列をKEYに設定しています。
「明細」テーブルの各列について、補足解説と設定を続けます。

2. AppSheet では「Ref」でリレーションシップを設定する

請求書に明細を追加するためには、テーブル間にリレーションシップを設定します。
請求書と明細の関係は、請求書が親、明細が子になります。
請求書アプリでは、「請求書」テーブルが親、「明細」テーブルが子になります。

AppSheetではテーブル間の親子関係を設定できる。

請求書

「請求書」列はTYPE(データ型)を「Ref」にしています。
「明細」テーブルを追加した時に、AppSheetが自動的に「Ref」に設定しているはずです。

列名の左にある編集アイコンをクリックして「請求書」列 の設定を確認してみましょう。

Source tableが「請求書」テーブルに設定されています。これは、

  • 「請求書」列は、「請求書」テーブルを参照している

という意味です。

「Ref」型を理解するためには、以下のような公式を考えるとよいでしょう。

「Ref」の公式

「Ref」型の列は、

  • 参照先テーブル(Source table)を参照して、
  • 参照先テーブルのKEY列の値を保存することにより、
  • テーブル間のリレーションシップを設定できる

サンプルデータで確認してみましょう。

「明細」テーブル2〜4行目の「請求書」列には、「6834ad5c」が保存されています。
これは、「請求書」テーブル2行目の「ID」列の「6834ad5c」と同じ値になっています。

「Ref」の公式に当てはめると、

「明細」テーブルの「請求書」列は、

  • 参照先の「請求書」テーブルを参照して、
  • 参照先の「請求書」テーブルの「ID」列(KEY列)の値を保存することにより、
  • 「請求書」と「明細」の間でリレーションシップを設定した

という意味になります。

この「Ref」型の設定によって、請求書に明細行を追加できるようになります。

Ref
  • 別テーブルを参照する
  • テーブル間のリレーションシップを設定する

「請求書」列 の設定を1箇所だけ変更しましょう。Is a part of ? のチェックをONにして、有効にします。

「Done」をクリックして「請求書」列設定パネルを閉じます。

一旦、画面右上の「SAVE」をクリックして、設定を保存しましょう。

「SAVE」ボタンをクリックして保存する。

アプリエディタ右側にあるプレビュー画面を確認します。
タブメニューで「請求書」を選択して、「+」ボタン(Add)をクリックしてください。

請求書を追加する入力フォーム画面が表示されます。
画面を一番下までスクロールすると、「New」というボタンがあるのでクリックしてみましょう。

明細を追加できるようになっています。
「請求書」列には、「請求書」テーブルのLABELである「件名」が表示されます。

このように、Is a part of ? を有効にすると、請求書を追加する時に、明細行も同時に追加できるようになります。
また、請求書を削除した時に、関連する「明細」レコードも同時に削除されます。

「Cancel 」をクリックして、画面をひとつ戻しましょう。

「New」ボタンが表示されている列に「明細 entries that reference this entry in the 請求書 column」と表示されています。
この列は「Related 明細s」という列です。

Dataナビゲーションで「請求書」テーブルをクリックして、「請求書」テーブルの列を表示しましょう。

「Related 明細s」という列があります。
この列は、「Ref」型を設定すると自動的に追加されます。

「明細 entries that reference this entry in the 請求書 column」という説明文が不要なので削除しましょう。
列設定パネルで「Related 明細s」の「Description」フィールドをクリックして、Expression Assistantを開きます。

「明細 entries that reference this entry in the 請求書 column」を削除して「Save」します。

画面右上の「SAVE」をクリックして、設定を保存しましょう。

「SAVE」ボタンをクリックして保存する。

アプリ上の表示が「Related 明細s」に変更されます。

以上、「請求書」列には、「請求書」テーブル(Source table)の「ID」(KEY)を保存して、「請求書」テーブルと「明細」テーブルとのリレーションシップを設定しました。

AppSheetにおけるテーブル間のリレーションシップは以下のように設定します。

テーブル間リレーションシップの設定
  1. 子テーブル内に「Ref」型の列を用意する
  2. 「Ref」列の「Source table」に親テーブルを設定する
  3. 「Is a part of ?」をチェックする

3の「Is a part of ?」にチェックを入れて有効にすると、

  • 親レコードを新規追加する時に、子レコードも同時に追加できる
  • 親レコードを削除した時に子レコードも同時に削除される

という使い方ができます。

請求書を新規で追加する際に、明細行も同時に追加するのが自然な使い方です。
また、親となる請求書を削除した時に、子の明細も削除された方が自然です。
なので、「Is a part of ?」をチェックして有効にしておきましょう。

これで、「請求書」テーブルと「明細」テーブルとの間にリレーションシップを設定できました。

請求書アプリにおける「テーブル間リレーションシップの設定」手順は以下の通りです。

  1. 「明細」テーブル(子テーブル)に「請求書」(Ref)列を用意する
  2. 「請求書」(Ref)列のSource tableに「請求書」(親テーブル)を設定する
  3. 「Is a part of ?」をチェックする

AppSheetではテーブル間の親子関係を列TYPE「Ref」で設定する。

 

3. 「Ref」で「商品」テーブルの値を参照する

商品

「明細」テーブルに戻りましょう。
「商品」列は、TYPEを「Ref」にします。
「明細」テーブルを追加した時に、AppSheetが自動的に「Ref」に設定しているので変更不要です。

列名の左にあるペン型の編集アイコンをクリックして、「商品」列の設定パネルを開きましょう。

Source tableが「商品」テーブルに設定されています。これは、

  • 「商品」列は、「商品」テーブルを参照している

という意味です。
以上、確認だけなので「Done」ボタンをクリックして設定パネルを閉じます。

単価、単位、税区分

「Ref」型に設定した「商品」列を使用することで、「商品」テーブルの

  • 単価
  • 単位
  • 税区分

を「明細」テーブルの単価、単位、税区分に自動的に入力できるようになります。

明細を追加する際に、「商品」列で商品をリストから選択します。
その時に「Ref」を使用して商品の「単価」「単位」「税区分」を自動的に初期値として入力できるようにします。

まずは「単価」列の設定をしてみましょう。
「単価」列のINITIAL VALUEフィールドをクリックします。

Expression Assistant が表示されるので、以下の式をコピペします。

単価のINITIAL VALUE

 

「Ref」を使用した入力方法は、以下の式で行います。

「Ref」を使用した入力[Ref列].[Source table内の列]

「商品」をリストから選択した時に、その商品の「単価」がINITIAL VALUEに自動的に入力されます。
Expression Assistantにコピペして「Save」します。

「単位」「税区分」も同じように設定します。
「単位」「税区分」列のINITIAL VALUEフィールドをクリックします。

Expression Assistant が表示されるので、以下の式をコピペします。

単位のINITIAL VALUE

 

税区分のINITIAL VALUE

 

単位、税区分のINITIAL VALUEが以下のようになっていればOKです。

金額、消費税、合計

「金額」「消費税」「合計」列は、FORMULAに計算式を設定します。
FORMULAフィールドをクリックします。

Expression Assistantが開くので以下の式をコピペします。

金額のFORMULA

 

消費税のFORMULA

 

合計のFORMULA

 

消費税の式では、IFSというAppSheet関数を使っています。
「税区分」の値によって「0.1」「0.08」「0」いずれかの値を消費税率にするようにしています。
このように複数条件で処理を分岐する際に、IFS関数を使用します。

IFS()

IFS(
条件式1, 処理1,
条件式2, 処理2,
条件式3, 処理3,
...)

IFS関数は、()内の条件式が正しいときに、処理を実行します。
条件式1から順に、式が正しいか正しくないか(真か偽か)を判定します。
条件式1が正しい(真)なら、処理1を実行します。正しくない(偽)なら、処理1を飛ばして条件式2の判定に移ります。

式が正しくて処理が実行されたら、そこで処理はストップします。

金額、消費税、合計のFORMULAが以下のようになっていればOKです。

 

税区分

列名の左にあるペン型の編集アイコンをクリックして、「税区分」設定パネルを開きましょう。

はじめに、Typeを「Enum」にします。

続けて、Type Details を以下のように設定します。

  • Values:10%、 軽減8%、非課税、対象外
    • 「%(パーセント)」は全角文字にしておいてください。
  • Allow other values:ON
  • Auto-complete other values:ON
  • Input mode:Dropdown

Valuesの値について、「%(パーセント)」を全角文字にすることに注意してください。

単価、金額、消費税、合計

「単価」「金額」「消費税」「合計」列は、TYPEを「Price」にしています。
AppSheetでは「Price」列の初期設定が米ドルの設定になっているため、日本円に設定し直す必要があります。
列名の左にあるペン型の編集アイコンをクリックして「単価」列 を設定しましょう。

Type Details を以下のように設定します。

  • Decimal digits(小数桁) :「0」
  • Currency symbol:「¥」

「Decimal digits」は初期設定では「2」になっていますが、日本円で小数桁は扱わないので「0」にしましょう。
「$」を「¥」に変更することを忘れずに。

同じように、金額、消費税、合計も設定します。

以上、「Ref」を使用してテーブル間のリレーションシップを設定しました。
テーブル間のリレーションシップは応用が利くので、「Ref」を使ったテクニックをこの機会に習得しておきましょう。

今回(第3回)までテーブルと列の設定を進めてきました。
次回(第4回)は、明細の金額を合計してみます。
AppSheetでは使用頻度が高いSELECT関数とSUM関数で合計する方法を解説します。

Share Me!

前の投稿
AppSheetで請求書アプリ(第2回)スプレッドシートからアプリ作成
次の投稿
AppSheet で請求書アプリ(第4回)SELECT関数とSUM関数で合計を計算

関連記事

メニュー