今回は新しくレコードを作ったときに各レコードのテーブルを種類ごとに集計して別アプリの各レコードに登録する方法を、日報アプリと案件工数アプリを例にご紹介します!
日報アプリには、その日関わった案件ごとに使った工数が入力されており、案件工数アプリ内の合計工数は、その案件に使った工数の合計が日報アプリから算出される、という構造を想定しています。
今回のカスタマイズは日報アプリ、案件工数アプリの両方にCustomineカスタマイズを入れる必要があり、2以上のアプリスロットが必要になります。
そのため、フリープランでCustomineをご利用の方はお使いいただけませんので、ご注意ください。
Customineの基本的な事柄は、「はじめてのカスタマイズ」をご覧ください。
アプリのフォーム
日報アプリ
フィールド
フィールドタイプ | フィールド名 | フィールドコード | 備考 |
ユーザー選択 | 報告者 | 報告者 | 初期値:ログインユーザー |
日付 | 報告日 | 報告日 | 初期値:レコード登録時の日付を初期値にする |
テーブル | 工数リスト |
工数リストテーブル内のフィールド
フィールドタイプ | フィールド名 | フィールドコード | 備考 |
ルックアップ | 案件コード | 案件コード | 案件工数アプリから取得 |
文字列(1行) | 案件名 | 案件名 | 案件工数アプリから取得 |
数値 | 工数 | 工数 | なし |
案件工数アプリ
フィールド
フィールドタイプ | フィールド名 | フィールドコード | 備考 |
文字列(1行) | 案件コード | 案件コード | 重複禁止 |
文字列(1行) | 案件名 | 案件名 | なし |
数値 | 合計工数 | 合計工数 | 単位:時間 |
ドロップダウン | 更新フラグ | 更新フラグ | 項目:「要更新」のみ |
一覧の設定
「一括更新用」一覧を用意します。
表示するフィールド:「レコード番号」「案件コード」「案件名」「合計工数」
絞り込み条件:「更新フラグ」が「要更新」を含む
カスタマイズの方針
日報アプリでレコードを保存したタイミングで案件工数を再計算させたいのですが、工数を計算する処理が複雑なので、一度に複数の案件の工数を計算して更新することは出来ません。
そこで、日報アプリでレコードを保存したときに、更新が必要な案件レコードに「要更新」フラグを立てておき、案件工数アプリに移動してループ処理を使って、1案件ずつ順番に工数を計算して更新する方法をとります。
整理すると次のような要件になります。
日報アプリでレコードを保存したときに、そのレコードの案件リストに含まれる案件を案件工数アプリから探し、「要更新」に変える。
更新が終わったら別タブで案件工数アプリの「一括更新用」一覧に移動する。
案件工数アプリの「一括更新用」一覧に表示された「要更新」のレコードを一つずつ、その案件にかかった工数を日報アプリの全レコードの中から集計し、合計工数を更新していく。
日報アプリのカスタマイズ
想定している処理のフロー
Customineのカスタマイズにすると以下の様になります。
最初の「テーブル行をレコードとして取得する」を実行するタイミングは、レコードの保存が成功してからにしたいので、「レコードを保存する直前(削除時は除く)」ではなく、「レコードを保存した直後(削除後は除く)」にします。
2番目の「レコードをもとに別のレコードを更新する」で更新のキーになっているフィールドは案件工数アプリでは重複禁止にしておく必要があります。キーが重複してしまうと、集計時に別の案件の工数まで含まれてしまい、正しく計算できません。
最後の「レコード一覧画面に遷移する」のタブの設定は「同じタブで開く」と「別タブで開く」のどちらでも構いません。使いやすいほうをお選びください。
案件工数アプリのカスタマイズ
想定している処理のフロー
処理する案件レコードを決める
やることは、「要更新」1件目だけを取得したいので、取得件数を指定できる「キーを指定してレコードを取得する」を使用します。
条件は、「一括更新用」の一覧を表示した時に処理を始めるので、「一覧画面を表示した時」と「現在の一覧が指定の一覧ならば」を使用します。
全日報からその案件のテーブル行を取得する
「全レコードを取得する」で日報アプリから全レコードを取得して、「他のレコード内のテーブルをレコードとして取得する」で全レコードからテーブルを抜き出し、「取得したレコードを絞り込む」で、テーブルを現在処理中の案件レコードに関するものだけに絞り込んでいます。
工数を集計してレコードを更新する
「レコード中のフィールド合計値を計算する」で、工数の合計を計算し、「レコードを更新する(キーの値を直接指定)」で、工数の合計を計算します。このとき、同時に「要更新」を外すことも必要です。これをしないと、同じレコードをずっと更新し続けることになります。
最後に「画面をリロードする」をすることで、「一覧画面を表示した時」の条件を満たすため、再度同じ処理が実行され、対象のレコードがなくなるまで続くようになっています。
その案件に関する工数テーブル行を取得できなかったときの対応
通常、日報アプリでレコードを保存したときに、その日報に含まれる案件のみ、「要更新」になるので、更新時にその案件のテーブルが0行になることないのですが、後から日報を修正したり、削除したりしたときに、案件の工数を再計算させるために手動で「要更新」に変更した場合は0行になる場合もあります。
そこで、0行の場合は合計工数を0時間にして更新する処理を加えておきます。
ループのための画面リロードも加えておきましょう。
対象レコード全ての更新が終了した後の画面遷移
対象レコード全ての更新が終了した時、「一括更新用」の一覧画面にとどまっている理由はありません。
今回はレコードが正しく更新されたことを確認するために、「レコード一覧画面に遷移する」を使って、案件工数アプリで通常使用する一覧画面に移動してみました。
ここはどうするのが使いやすいかを考えて変えてみてください。
これで設定完了です。
「kintoneアプリへ登録」し、動作チェックしてみましょう。
日報を作成して保存すると・・・
自動でリロードされるとともに、表示されるレコードが減っていき・・・
「要更新」のレコードの更新が終了し、別の一覧画面に移動すると、ちゃんと合計工数が正しく加算されているのがわかります。
終わりに
今回のカスタマイズは日報を保存したときに合計工数を再計算するものでした。
全体の流れを単純にするために今回は省いていますが、以下のような課題があります。
日報を削除した時に合計工数を再計算させるカスタマイズは難しいので、日報レコードを削除するのではなく、削除フラグを用意して、削除フラグが立っているレコードは計算から除外することで対応してください。
日報アプリの全レコード取得で処理しており、レコード数が大量になってくると処理の負荷が大きくなるかと思うので、ひと月毎の集計になるように集計範囲を指定する必要があります。
どうやったら対応できるかを考えてみてください。
ご不明点等ございましたら、チャットにてご質問ください!
Customineドキュメントやサポートページもぜひご活用ください。