AppSheet実践編シリーズ㉕~AppSheetで本格的な採番要件にチャレンジしてみた(後編)~
はじめに
こんにちは。ソシオネットの髭晩酌です。
突然ですが、秋が来ました。
何となくですが、年々秋の期間が短くなっている気がするのは私だけでしょうか。暑いのが終わったと思ったらすぐ寒くなる気がする。。
貴重な秋を計画的に過ごしたいものです。スポーツするとか、紅葉を愛でるとか、酒を飲むとか。。
さて、今回のテーマは前回に引き続き「採番」です。
改めて説明の流れを再掲しておきます。前編では「採番テーブルから請求書番号を採番する」まで説明しましたので、後編は「採番したら採番テーブルに1を加算する」から再開です!
データの取り込み
Data設定
View設定
採番テーブルから請求書番号を採番する
採番したら採番テーブルに1を加算する ←後編はここから
採番ヘッダ欄は新規作成時にだけ表示する
請求書番号を重複させないために
なお、本ブログの画面説明は「improved editor」モードにて説明していきます。
早速アプリを作ってみよう(続き)
採番したら採番テーブルに1を加算する
前回のブログと繰り返しになりますが、前回まで作ったアプリだと、請求書番号を採番して登録しても採番テーブルの連番が変わらず、毎回同じ請求書番号が生成されてしまいます。
ということで、請求書テーブルに保存したタイミングで採番テーブルの連番に1を加算する処理をここでは作っていきます。前回も載せていますが以下の絵の③の処理です。
ちなみに、この部分は超難しいのでよく読んでください!!おそらく今回のブログの中で一番の山場と思います。
さて早速ですが、ここで何を実装しなければいけないかを整理するために、「請求書テーブルに保存したタイミングで採番テーブルの連番に1を加算する」という文章を2つに分けて考えてみます
「請求書テーブルに保存したタイミングで」→データ保存のタイミング(トリガ)で処理を動かす必要がある。つまり、Automationが必要!
「採番テーブルの連番に1を加算する」→もともと保存したテーブル(請求書テーブル)とは別のテーブル(採番テーブル)を更新する必要がある。つまり、Automationのタスクカテゴリは「Run action on rows」にした上で、そこから呼び出すActionの作成も必要!
どうでしょう?難しいですよね。
細かいことはさておき、ここでは「保存のタイミングで別のテーブルも更新したい場合は、AutomationとActionの2つが必要なんだ」ってくらいの認識で全然OKと思います。
ということで、ここで改めて実装するものと処理の流れを整理したのが以下の図です。AppSheet上での処理の流れとブログ上の説明の流れが逆になっていますが、ご了承ください。
まずは、Automationから呼び出されるActionから説明していきます。
【Action設定】
早速、左側のActionメニューを選択し、採番テーブルに対してAdd Actionを押下していきます。
続く画面では、「Create a action for the 採番」という青いボタンを押下します。
そうするとAction設定画面が開きますので、以下の図の通り設定をしてください。
・Action name:任意のAction名をつけてください。ここでは「採番インクリメントaction」としました。
※ちなみに、インクリメントとはプログラミング用語で変数の値を1増やすという意味です
・For a record of this table:更新対象のテーブルです。このアクションは採番テーブルを更新するので、「採番」を設定します。
・Do this:テーブルのデータを更新したい場合はこのタイプを選択します。ちなみに直訳すると「この行のいくつかの列の値を設定します」となります。
・Set these columns:左辺は設定対象の列名なので「連番」を設定します。右辺は設定値なので、以下の式を設定します。
[連番]+1
・Position:このActionは次に設定するAutomationから呼ばれるだけで画面に表示する必要はありません。よって「hide」を選択してください。
それ以外の項目はデフォルトでOKです。これでActionの設定は完了です。
【Automation設定】
今度はAutomationです。左側のAutomationメニューを選択し、Create a new Botを押下していきます。
続く画面では、「Create a new Bot」という青いボタンを押下します。
さらに次の画面ではまずBot名を変更しましょう。3点リーダー>Renameを押下して、任意の名前を付けてください。ここでは「採番インクリメントbot」にしました。
次にEventを作ります。画面中央のConfigure eventボタンを押下し、次の画面でCreate a new eventを押下してください。
すると、右側にEventの設定画面が表示されるので、以下の図の通り設定をしてください。
・Event name:任意のEvent名をつけてください。ここでは「採番インクリメントevent」としました。
・Event source:イベントのトリガの種類です。今回はアプリでのデータ新規登録がトリガとなるので「App」を選択します。
・Table:どのテーブルのデータ更新をトリガにするか、を設定します。今回は「請求書」を選択します。
・Data change type:トリガにするデータ更新の種類を選択します。採番テーブルに1を加算するのは請求書番号を採番した時、つまり、請求書テーブルにデータを新規登録した場合となるため、「Adds」のみONにします。
・Condition:その他、トリガとする条件を設定します。今回は、請求書テーブルにデータを新規登録したら「常に」トリガとなるため何も設定しません。
それ以外の項目はデフォルトでOKです。これでEventの設定は完了です。
今度は、Event発生で実行されるStepとTaskを作っていきます。画面中央のAdd a stepボタンを押下し、次の画面でCreate a new stepを押下してください。
stepの名前は任意でOKですが、ここでは「採番インクリメントstep」としました。また実行するtaskの種類は、先ほど作ったデータ操作Actionを実行するので「Run a data action」を選択します。
すると、右側にTaskの設定画面が表示されるので、以下の図の通り設定をしてください。
・data actionの種類:先ほどのActionを実行したいので「Run action on rows」を選択します。
・Referenced Table:Actionを実行するテーブルです。先ほど作ったActionは採番テーブルに紐づくActionなので、「採番」を設定します。
・Referenced rows:Referenced Tableで設定したテーブル(採番テーブル)で操作対象となる行の条件を設定します。採番テーブルのキー(id列)について、操作対象となる値をリスト形式で指定します。保存した請求書テーブルの「採番id」と一致するものが対象であるため、以下の式を設定します。
LIST([採番id])
・Referenced Action:実行するActionを選択します。
少し手数が多かったですが、これでAutomationの設定は完了です。
ではここで、採番が正しくインクリメントされるか試してみましょう。請求書を1つ新規登録した後、再度新規登録画面を開き同じ採番ヘッダを選択してみてください。
以下の図の通り、正しく採番がインクリメントされていることが確認できました。また、実際のスプレッドシートのデータを見ても、インクリメントされていることが確認できると思います。
採番ヘッダ欄は新規登録時にだけ表示する
まずは以下の図を見てください。新規登録画面、参照画面、更新画面のイメージですが、採番ヘッダは新規登録画面にだけ表示されていればいいと思いませんか?
採番という機能を鑑みるに、採番ヘッダは請求書番号を採番する時、つまり、新規登録画面で選択できればよいものですので、参照画面や更新画面では見せなくてもよいものです。ということで、、、よし、表示を消そう!!(単純)
さて、この新規登録時にだけ表示する方法ですが、実は単純な設定だけではうまくいきません(新規登録時であることは、AppSheetの標準では判断できない)。
ということで、新規登録時にAutomationで採番済フラグに「1」をセットする処理を作成し、採番ヘッダは採番済フラグがブランク(デフォルト)の場合だけ表示する、、という処理を実装していきます。
【Automation設定】
またもやAutomationです。やりたいことは、新規登録時にAutomationで採番済フラグに「1」をセットする、ということなのですが、このトリガは先ほど作ったAutomationと同じです。よって、先ほどのAutomationにstepを追加する形で実装します。
ということで、Automationメニューから採番インクリメントbotを開き、採番インクリメントstepの下にあるAdd a stepボタンを押下し、次の画面でCreate a new stepを押下してください。
stepの名前は任意でOKですが、ここでは「採番済フラグに1をセット」としました(まんまですが、・・)。また実行するtaskの種類は、データを操作するので「Run a data action」を選択します。
すると、右側にTaskの設定画面が表示されるので、以下の図の通り設定をしてください。
・data actionの種類:請求書を登録した後、同じ請求書テーブルを更新する処理なので、「Set row value」を選択します。
・Set these column(s):左辺は設定対象の列名なので「採番済フラグ」を設定します。右辺は設定値なので、"1"を設定します。
【Data設定】
ここでは、採番済フラグがブランクの場合だけ採番ヘッダを表示する、という設定をしていきます。
Dataメニュー>請求書>採番id の詳細設定画面を開き、Show?欄に以下の設定をしてください。※フラスコマークを押下すると関数を入力できます
ISBLANK([採番済フラグ])
また、ここまで読んでいただいてお分かりの通り、採番済フラグは単なる動作制御のための項目なので、画面に表示する必要はありません。よって、以下の図の通りShow?欄のチェックを外してしまいましょう。
ここまでで、新規登録画面の場合だけ採番ヘッダを表示する処理の実装は完了です。では、それぞれの画面を開いて動作を見てみましょう。
ということで、想定通りの動きになっていることが確認できました!!
請求書番号を重複させないために
さて最後の設定をしていきましょう。
AppSheetでは、排他制御などデータの不整合を防ぐ仕組みは標準ではほとんどありません。AppSheet君は、「保存して!」「更新して!」って言われたデータをそのままデータソースに保存・更新するだけです。
よって今回の採番のケースですと、複数ユーザが同時に採番した場合、同じ請求書番号が作成されることになります。
これは業務上問題があるはずなので、請求書テーブルの請求書番号に重複した値を入力できないように重複チェックを追加します。Dataメニュー>請求書>請求書番号 の詳細設定画面を開き、Data ValidityセクションのValid If欄に以下の設定をしてください。
ISBLANK(
FILTER(
"請求書",
[_THIS] = [請求書番号]
)
-
LIST(
[_THISROW]
)
)
これにより、登録のタイミングで同じ請求書番号が既に存在する場合は、重複チェックにひっかかり保存できないようになります。
なおValid Ifを使った重複チェックについては、以下のブログにて詳しく説明しておりますので、こちらもご確認いただけると幸いです!
※ただし、、本当に完全に同時のタイミングで保存した場合にきちんと重複を防いでくれるかどうか、、は若干不安があります。。所詮はAppSheetですので、その辺はご了承願います。
そして、だいぶ手数が多くなりましたが、今回のアプリはこれにて完成です!
ぜひ皆さんの会社の採番要件に合わせて、実装してみてください!
終わりに
本ブログでは、例えば請求書番号のように「採番ヘッダ文字列+連番」という体系の番号をAppSheetで採番する方法を、前後編の2回にわたってご紹介しました。
AppSheetでは厳密なトランザクション制御をすることは難しいですが、そこまでセンシティブな要件ではない業務であれば、今回の仕組みで採番を実装してみてもよいと思います。
ということで、今回のブログは以上となります。ではまた次回ブログでお会いしましょう!ルネッサーンス!!
AppSheet勉強会を開催しております
弊社主催のAppSheet勉強会を毎月開催しております。直近開催分のお申込みは以下からお願いいたします。
※初めての方は、初心者向けかんたんハンズオン勉強会から参加されることをお勧めします。
11/19(火)【毎月第3火曜開催】実践的なスキルが学べる!AppSheetアプリ開発ワークショップ | Peatix
12/10(火)【毎月第2火曜開催】AppSheetを知ろう!初心者向けかんたんハンズオン勉強会! | Peatix
IT内製化支援、Salesforceの運用・導入、DX化推進に関するご相談をお待ちしております
弊社では、ノーコード開発ツールを用いたIT内製化支援、Salesforceの運用・導入、および、DX化推進に関するご相談を承っております。お気軽に弊社お問い合わせサイトよりご相談などをお寄せいただければと思います。
ソシオネットHP:http://www.socionet.co.jp/
対話型定額制アプリ開発サービス「DXデビュー」:https://socionet.co.jp/dxdebut/
IT内製化支援支援サービス「DXオープンラボ」:https://socionet.co.jp/insourcing-support-service/
IT運用とDX化のワンストップサポートサービス「DXサポーターズ」:https://socionet.co.jp/dx-supporters/