アプリの「親子関係」を理解しよう! 後編
作成日
更新日
(著者:サイボウズ 佐藤 紅志)
はじめに
前回の記事では、kintone における親子関係について、アプリストアの「商品見積書パック」を例に、便宜的な呼び方としての「同居親子関係」「独立親子関係」をそれぞれ実際のデータを見ながら、どのような振る舞いになるかの考察と確認を行って参りました。
今回も引き続き、同アプリパックを例に以下の内容で進めていきます。
関連レコード一覧について
まずは、リマインドになるかとは思いますが「関連レコード一覧」とは「自アプリを含む、アプリとアプリの間において、設定した二つの項目が持つ値の一致性を利用して、kintone 内にある情報を一覧して表示する機能」となります。
文章にすると、なんだかわかりにくいですが「商品見積書パック」の場合、例えば商品リストアプリ上に「見積商品一覧」を作成する、つまりその商品がどの見積で参照されているかを表示する、ということになるかと思います。
「同居親子関係」の制約事項
しかしながら「関連レコード一覧」では、設定できる項目及び項目間に対して、いつくかの制約条件があり、この場合、見積もり明細が「テーブルフィールド」として実装されているため、そこに定義が含まれている「型番」項目については指定をすることができません。
繰り返しになりますが「同居親子関係」として「テーブルフィールド」に設定された項目は、一覧(ビュー)上への表示だったり、分類や集計として指定したりする事が可能な点については
前回の記事でも記載しましたが、
上記リンク先の表にある通り「関連レコード」の対象にはなりません。
「同居親子関係」の「子」については、上記「関連レコード一覧」の項目として指定できないこと以外にも、標準の機能では、csvインポートの対象とはならないこと(出力は可能)も注意が必要です。もちろん、カスタマイズによって対応することは可能ですので、その場合は、以下の記事が参考になるかと思います。
「同居親子関係」にあるものを「独立親子関係」に変更する
さて、実際の kintone の利用局面では、このような制約が導入の障壁になる事もあり、上記リンク情報等を活用したカスタマイズの開発が検討されるところではありますが、もう一つの考え方として「同居親子関係」の「子」である「見積明細」を「独立親子関係」として独立させてしまうという方法があります。
具体的には見積明細というアプリを新規に作成し、項目として見積書アプリの「テーブルフィールド」にあった項目を全て定義し、そこに見積書アプリの「見積番号」を参照する「ルックアップフィールド」を追加します。
▼図1
また、見積などの明細行が必要とするキー情報として「明細番号」も追加し、さらに見積明細アプリで分析として使用する事が想定される項目を、見積書アプリからコピーすると便利な任意の項目についても追加します。見積書アプリの場合は、一般的には「宛名」や「見積日」などが候補となるでしょう。
商品リストアプリを参照する「ルックアップフィールド」及び取得する項目は、特に変更なく元の定義通りに設定します。このようにすれば、標準機能で「見積明細」に対するcsvファイルによるインポートが実現可能となります。集計やグラフなどの分析機能も、適切に「親」情報を取得するように設定すれば「同居親子関係」同様に実現できます。
見積明細アプリができましたら、見積書アプリでは「テーブルフィールド」にある明細の情報は削除し、代わりに「関連レコード一覧」にて表示するレコードの条件を[見積書].[見積番号]=[見積明細].[見積番号]とし「見積書」アプリ上に表示したい「見積明細」アプリの項目を定義します。
以上の設定によって、めでたく「見積書」と「見積明細」はこれまでの「同居親子関係」から、それぞれ独立したアプリとなり「見積番号」をキーに「独立親子関係」を築くことになりました。ひとつのアプリになることにより、 kintone の提供する集計、グラフ、履歴管理、コミュニケーション機能がそれぞれに提供されるのも、一つのポジティブなモチベーションになるかと思います。
「独立親子関係」に対応したスクリプト例
ところで、この見積明細アプリの小計金額ですが、見積書アプリの「関連レコード」として表示されているものは「テーブルフィールド」のように、計算項目として指定することが出来ないため、合計金額を見積書アプリに表示させるためには、JavaScriptカスタマイズのコードが必要となります。
以前の記事でも取り上げさせて頂きましたが、その時には単に計算結果を表示するだけでしたので、一覧への表示やグラフの集計項目として指定することはできませんでした。そこで、今回は独立記念として(!)見積書アプリに項目として「お見積金額」を追加し、関連レコードの小計金額を合計した更新結果を反映するようにしたいと思います。
まず、見積書アプリの「計算フィールド」として定義されている「合計金額」を削除し、以下の項目を追加します。
追加するフィールド | フィールド名 | 初期値 | フィールドコード |
数値 |
見積もり金額 |
- |
見積もり金額 |
また、事前準備として、新規に作成した見積明細アプリに以下の項目を追加します。
追加するフィールド | フィールド名 | 初期値 | フィールドコード |
数値 |
見積書レコード番号 |
- |
見積書レコード番号 |
数値 |
修正前小計 |
0 |
修正前小計 |
次に、図1で設定した「ルックアップフィード」の「ほかのフィールドのコピー」にて[見積書].[見積レコード番号]を上記で設定した[見積明細].[見積書レコード番号]にコピーするように設定を追加してください。
サンプルプログラム
後は以下のコードを、見積明細アプリに適用するのみです。
ソースコードの解説
このプログラムは、見積明細アプリにレコードが追加、編集、削除した時に動作するようになっておりますので、events 配列に該当イベントを表す文字列を定数として設定しています。
ロジック上のポイントととしては、39行目からの、上記で定義した定数イベントタイプ毎に発生するイベントタイプごとの計算を実施しているところになるかと思います。
追加時は加算、削除時は減算、変更時は、差額を計算しますが、金額に変更がない場合は不要なリクエストは発生させないようにしています。変更時の差額を判定するために、集計前小計を保持しているところも、ちょっとした工夫をしているところです。
また、コードが前後してしまいますが、計算結果は「親」の情報である「お見積もり金額」を更新しますので、当然の事ながら他の操作により論理不整合が発生する可能性がありますので、下記記事を参考に、更新時に、revision を指定し、失われた更新を避けるようにしています。
最後に
以上、kintone でアプリの論理関係を構築する際の注意点、トピックについて、実際のお客様からの問合せ等を元に、執筆をさせて頂きました。業務の適用に悩まれている方に、少しでもヒント等になる部分がありましたら、とても嬉しく思います。ご不明な点、お気づきの点、見つけたバグや誤記などございましたら、ぜひ、コメント下さいませ。
このあぷりでの「独立親子関係」への変更方法が良くわかりません。
変更後のサンプルアプリとスクリプトファイルはありませんでしょうか。
宜しくお願い致します。
M.Nishimuraさん、コメントありがとうございます!
変更後のご確認環境を準備できるかを確認しまして、こちらに報告させて頂きますので、よろしくお願い致します!
随分時間が経ってしまって大変恐縮ですが、変更方法の補足記事をこちらに書いてみましたので、お時間有りましたら、ご覧下さいませ。。m(_._;)m
https://goo.gl/gzurXC
M.Nishimura です。
丁寧な解説ありがとうございます。参考にさせていただきます。
M.Nishimura様、こちらこそ早速にコメントいただきまして、ありがとうございます♪
またご質問ご指摘事項などございましたら、こちらでもFBの方でもコメント下さいませ、よろしくお願い致します!
見積明細アプリの「明細番号」は、(JavaScriptによる)自動採番が前提なのでしょうか?
ご回答ありがとうございます。
見積明細アプリの「明細番号」の振る舞いを見たいので、可能ならばデモ環境で見せていただけませんでしょうか?
https://developer.cybozu.io/hc/ja/articles/202640930
のデモ環境アプリ(見積書+商品リスト)とも比べたいです。
大田様
申し訳ございません。
現時点では、この記事についてはデモ環境への適用は行う予定はありません。
お手数ですが、記事の内容にそって是非、作ってみて下さい。
なお、確認方法についてはこちらの補足記事も参考ください。
また不明な点がありましたらご連絡ください。