在庫管理アプリを作りながら、 AppSheet (アップシート)の使い方を学びましょう。
前回(第2回)は、Googleスプレッドシートのサンプルデータを読み込んで、在庫管理アプリを作成しました。
テーブルを2つ(商品、入出庫履歴)追加して、列設定まで進めました。
今回は、入出庫履歴から商品の在庫量を計算できるようにします。
目次
1. Virtual Columnで在庫量を計算する
AppSheet ではVirtual Columnを活用しよう
第2回で設定した「商品」テーブルには、商品の在庫量を計算する列を用意していませんでした。
在庫量は常に変動しますし、スプレッドシートをその都度上書きするのは少し手間です。
AppSheetなら、このようなデータをVirtual Column(仮想列)で計算して表示するのが便利です。
Virtual Columnには以下のような特徴があります。
- データソース(Googleスプレッドシート)にデータを保存しない
- App formulaに設定した式を自動的に計算する
- アプリを同期する度に最新の計算結果を表示できる
Virtual Columnはデータソースには存在せず、アプリ上でだけ動作する列です。
在庫量が変動する度にデータソースを更新する必要がなく、常に最新の計算結果を表示できます。
例えば、請求書アプリで「小計」「消費税額」「合計」列など、明細行の合計を計算する場合にも使えます。
在庫管理アプリでは、Virtual Columnを使って商品別の在庫量を計算します。
「商品」テーブルに在庫計算用のVirtual Columnを追加しましょう。
アプリエディタ左側メニュー「Data」をクリックします。
Dataナビゲーションで「商品」テーブルを選択して、メインパネル右上にある「+」アイコン(Add virtual column)をクリックします。
新しいVirtual Columnを設定するパネルが開くので、Column nameに「在庫量」と入力します。
次に、App formulaの入力フィールドをクリックします。
SELECT関数で在庫量を計算する
在庫量の計算には、以下の2つの方法があります。
- SELECT関数で取得した「数量の増減」列のリストをSUM関数で合計する
- 「Related 入出庫履歴s」で取得した「数量の増減」列のリストをSUM関数で合計する
はじめに、SELECT関数を使用する方法で在庫量を計算します。
Expression Assistantが開くので、以下の式をコピペします。
1 2 3 4 5 6 |
SUM( SELECT( 入出庫履歴[数量の増減], [商品] = [_THISROW].[JANコード] ) ) |
SELECT関数は、列の値をリストで取得できる関数です。
第1引数にテーブル名と列名を設定し、第2引数に条件式を設定します。
第3引数を「TRUE」にすると重複する値を削除します。第3引数は省略可です。
SELECT( テーブル名 [列目], 条件式) => 条件に合致するレコードの列の値をリストで返す
値のリストというのは、PHPやJavaScriptのようなスクリプト言語でいうところの配列に相当します。
AppSheetには配列(Array)という用語がなく、代わりにリスト(List)という用語を使用します。
上記の式からSELECT関数だけ抜き出すと、
- 第1引数
- テーブル名:入出庫履歴
- 列名:数量の増減
- 第2引数:[商品] = [_THISROW].[JANコード]
1 2 3 4 |
SELECT( 入出庫履歴[数量の増減], [商品] = [_THISROW].[JANコード] ) |
- 「入出庫履歴」テーブルの「商品」列の値(JANコード)が、
- 「商品」テーブルで現在表示している(_THISROW)商品の「JANコード」列と同じ値である
という条件式になっています。
実際のデータで確認してみましょう。
例えば、「商品」テーブル2行目(コカ・コーラ 500ml ペットボトル)のJANコードは「4902102072618」です。
「入出庫履歴」テーブル内で、これと同じJANコード(4902102072618)の「商品」列は以下の通りです。
条件に合致する入出庫履歴レコードの「数量の増減」を抜き出すと以下の通りになります。
SELECT関数で条件に合致する「数量の増減」をリストで取得すると以下のようになります。
- { 5, 5, -10, 6, -6, 21, -15, 4 }
LIST関数で表記すると以下のようになります(意味は同じです)。
- LIST( 5, 5, -10, 6, -6, 21, -15, 4 )
以上、SELECT関数で取得した「数量の増減」リストを合計(SUM関数)すれば商品の在庫量が計算できます。
「商品」テーブル2行目(コカ・コーラ 500ml ペットボトル)の在庫量は10です。
- 5 + 5 -10 + 6 - 6 + 21 - 15 + 4 = 10
式をExpression Assistantに入力したら、「Save」をクリックして保存します。
Related 入出庫履歴s で在庫量を計算する
「入出庫履歴」テーブルの「商品」列は、
- TYPE(データ型):Ref
- Source table:「商品」テーブル
なので、「商品」テーブルと「入出庫履歴」テーブルにはリレーションシップが設定されています。
「商品」テーブルから見ると「入出庫履歴」は関連テーブルとして扱うことができます。
上記の「Ref」を設定した時に、「Related 入出庫履歴s」列が自動的に追加されます。
Dataナビゲーションで「商品」テーブルを選択して、列設定パネルを表示しましょう。
「Related 入出庫履歴s」列があるので、列名の左にある編集アイコンをクリックして設定パネルを開きます。
App formulaにREF_ROWS関数が設定されています。
入力フィールドをクリックして、Expression Assistantを開いてみます。
Testのリンクをクリックします。
商品の(に関連する)入出庫履歴の作成日時(KEY)がExpression Resultにリスト表示されています。
「コカ・コーラ 500ml ペットボトル」の入出庫履歴は8個あることがわかります。
「Related 入出庫履歴s」列には、商品の入出庫履歴(のKEY)がリストで格納されていることが分かりました。
「Related 入出庫履歴s」リストを使用すれば、SELECT関数よりも簡潔に式を書けます。
1 |
SUM([Related 入出庫履歴s][数量の増減]) |
[Related 入出庫履歴s] と [数量の増減] をそのまま繋げます。間に「.」はいりません。
SELECT関数を使用した式を削除して、こちらの式を「在庫量」(Virtual Column)のApp formulaにコピペしても同じ結果になります。
SELECT関数の式よりも、「Related 入出庫履歴s」を使用した方が簡潔に書けます。
以上で、「在庫量」列の設定は終了です。
「Ref」を設定すると関連テーブルから値や値のリストを取得できるようになるので、覚えておくとよいでしょう。
画面右上の「SAVE」をクリックして設定を保存してください。
2. 数量の増減を計算する
次は、「入出庫履歴」テーブルの「数量の増減」列を設定します。
「数量の増減」列は、現在の在庫量からの増減を計算する列です。
入庫なら増、出庫なら減ですが、ポイントは棚卸の時の計算です。
Dataナビゲーションで「入出庫履歴」テーブルを選択して、列設定パネルを表示します。
「数量の増減」列のFORMULAに式を設定するので、入力フィールドをクリックします。
Expression Assistantが開くので、以下の式をコピペします。
1 2 3 4 5 |
IFS( [操作内容] = "入庫", [数量], [操作内容] = "出庫", -([数量]), [操作内容] = "棚卸", [数量] - [商品].[在庫量] ) |
入庫と出庫の時は簡単です。
第2回で、「数量」列のDISPLAY NAMEには式を設定しているので、
- 「操作内容」が「入庫」の時:入庫数量
- 「操作内容」が「出庫」の時:出庫数量
と表示されるので、「数量」列に
- 入庫数量を入力すると、その数値をそのまま「数量の増減」に入力する
- 出庫数量を入力すると、その数値を負の値(マイナス)にして「数量の増減」に入力する
だけなので問題ありません。
棚卸の時はどうなるでしょうか?
例えば、「コカ・コーラ 500ml ペットボトル」の場合、
- 現在の「在庫量」は10個だが、
- 棚卸したら、9個しかなかった(1個紛失)
という例で考えてみましょう。
- 「数量」列(棚卸後の数量)に入力する値:9
- 「数量の増減」列:-1(1個紛失)
になれば辻褄が合います。
よって、「操作内容」が「棚卸」の時は、
- 「数量」列(棚卸後の数量)の数値から、現在の「在庫量」を引く
ことで「数量の増減」が計算できます。
「在庫量」は、「商品」(Ref)列から「商品」テーブル内の「在庫量」列を参照して、
- [商品].[在庫量]
と書くことで現在の在庫量を取得できます。
では、式をExpression Assistantに入力したら、「Save」をクリックして保存します。
以上で、「数量の増減」列の設定は終了です。
画面右上の「SAVE」をクリックして設定を保存してください。
3. AppSheet から商品マスタを追加する
試しに商品マスタにひとつ商品を追加して、入出庫履歴を作成してみましょう。
スキャン機能はプレビュー画面やPC(デスクトップモード)では動作しません。
必ず、スマホかタブレットなどのモバイル端末で操作してください。
はじめに商品マスタを追加します。
タブメニュー「商品」を選択して、「+」ボタン(Add)をクリックします。
商品マスタの入力フォームが表示されるので、上から入力しましょう。
「JANコード」はアイコンをタップすると、カメラが起動してバーコードスキャンができます。
最後に「Save」をクリックして、商品マスタを追加します。
商品マスタが1件、追加されました。
クリックして確認してみます。
商品マスタの詳細画面が表示されます。
4. AppSheet から入出庫履歴を追加する
今、追加した商品マスタの入出庫操作をやってみましょう。
プレビュー画面やPC(デスクトップモード)ではスキャン機能が動作しません。
モバイル端末(スマホかタブレット)で操作してください。
タブメニュー「入出庫履歴」を選択して、「+」ボタン(Add)をクリックします。
入出庫履歴の入力フォームが表示されるので、上から入力しましょう。
「商品」で、先ほど追加した商品のバーコードをスキャンします。
アイコンをタップするとカメラが起動してバーコードスキャンができます。
「操作内容」で「入庫」を選択すると、「数量」の表示が「入庫数量」に変わることを確認します。
「入庫数量」の数値は、そのまま「数量の増減」に入力されます。
最後に「Save」をクリックして入出庫履歴を追加します。
さきほど追加した商品の商品マスタを開いて、在庫量を確認します。
タブメニュー「商品」を選択します。
さきほど追加した商品をクリックして開きます。
下にスクロールすると、
- Related 入出庫履歴s:入出庫履歴のデータが1件追加されている
- 在庫量:入出庫履歴で入力した入庫数量
が表示されます。
同じ要領で、出庫と棚卸をやってみましょう。
在庫量が正しく計算されているか確認してください。
以上、今回は入出庫履歴から商品の在庫量を計算する列を設定しました。
Virtual Columnは計算用の列として使用することが多いので、覚えておきましょう。
ここまでで、在庫管理アプリの基本機能は完成しています。
次回(第4回)からは、画面(ビュー:View)設定や書式設定(Format Rules)で、アプリをカスタマイズしていきます。