はじめに
kintoneのクロス集計表はフィールド値をキーに集計した結果を表示できます。
また、キーが日付や日時の場合は集計単位を選択できるので、この画像のように月別の集計表示などが可能です。
ただ、フィールド値の合計や件数は表示できるのですが、集計値を使った計算結果を表示することはできません。
例えば、上記の例だと金額を項目値(売上や原価)別に集計はできますが、それを使った利益や利益率などを計算することはできません。
この場合はクロス集計表の値を書き出して再加工するような流れになります。
今回はクロス集計表の定期レポートをイメージし、「定期実行タスク」を使って次の画像のように別アプリに集計値を使った計算結果の一覧を作成してみます。
今回のカスタマイズで出来ること
売上と原価の金額が入力されている日別明細から月別の集計を別アプリに作成します
日別明細は増えることがあっても削除されることがない前提です
なので、集計済みのレコードは削除されません
アプリ構成
2つのアプリはそれぞれ以下のように作成しました。
日別明細アプリ
※フィールドコードはフィールド名と同じものを指定します
※採番キーにはこちらのページ(自動採番して、レコード登録する)のような仕組みで重複しない値がセットされているものとします。
※金額というフィールドに入力された数値は、項目の値によって売上か原価かが変わります。ですので、単純に金額を合計しても「売上金額の合計」は計算できません。
このアプリのクロス集計表での表示は次の通りです。
また、編集画面での表示は次のようになります。
部門月別アプリ
※フィールドコードはフィールド名と同じものを指定します
※キーは日別明細アプリの採番キーとは無関係で、後述するアクションの結果により各レコードの日付と部門のそれぞれのフィールド値を結合した値が入ります
※1ヶ月・1部門単位で1レコードになります
一覧画面での表示は次の通りです。
また、編集画面での表示は次のようになります。
Customineの設定
今回のカスタマイズは「定期実行タスク」で作成します。
全体の設定は次のようになります。
ここからは、大きな動きのかたまり毎に説明していきます。
kintone接続設定とレコード取得部分
まず、今回使用するアプリへのkintone 接続設定と、日別明細アプリの集計対象レコードの取得を行います。
「実行予定時刻になった時」に「kintone 接続設定を行う」を2つ作成し、日別明細アプリと部門月別アプリの接続設定を行います。
次にやること「条件を組み立ててレコードを取得する」で日別明細アプリの集計対象のレコードを取得します。今回は日付が今年のレコードを取得しているので、実行した年のレコードを全集計する動きになります。
レコードを日付毎に束ねる部分
続いて、今回は、日付は月で束ねる必要があるのと、日付(月)と部門の両方で束ねる必要があるので、以下の手順で変換します。
「日別明細アプリ」を元に、日付を月初に変換したレコード(変換済みレコードA)を作成します
変換済みレコードAを元に、日付と部門で束ねたレコード(変換済みレコードB)を作成します
変換済みレコードBを「部門月別アプリ」に書き込みます
ここから詳細を解説していきます。
「変換済みレコードA」の作成
まず、「日別明細アプリ」を元に、日付を月初に変換したレコード(変換済みレコードA)を作成します。
やること「レコードをフィールド値毎に束ねる」、条件「レコード全行が準備できた時」を使用します。このアクションで「日別明細アプリ」のレコードを「日別明細アプリ」のフィールドの値毎の単位で束ねます。
ここで束ねる時のキーは採番キー(重複しない値)なので、複数レコードをまとめるのではなく、変換元の1レコードを1レコードに変換します。同じアプリで変換前後では同じレコードですが、日付フィールドの値が変わるイメージです。
どういうことかというと、アクション3番で3件取得した場合は、アクション4番で束ねた結果、1レコードずつ日付フィールドの値を月初に変換した値を日付にセットしたレコード3件をJob Runner上で作成し、それを後続のアクションで使用します。
例えば、日付フィールドが2022年1月5日のレコードの場合、その他のフィールド値は変更なく、その日付フィールドのみ2022年1月1日に変わる処理になります。
そして、この時のマッピングでフィールドへの値のセットは以下の書き方で1つの値をセットできます。
= フィールドコード
しかし、配列を受け入れられない関数の引数などにフィールドの値を指定する場合は、こちらのように束ねた最初の値を指定する必要があります。
= フィールドコード[0]
これらを踏まえると設定は次のようになります。
日付 = format(日付[0], "YYYY-MM-01")
部門 = 部門
項目 = 項目
金額 = 金額
採番キー = 採番キー
「変換済みレコードB」の作成
次に、変換済みレコードAを元に、日付と部門で束ねたレコード(変換済みレコードB)を作成します。
やること「レコードをフィールド値毎に束ねる」、条件「レコード全行が準備できた時」を使用します。
このアクションで「変換済みレコードA」のレコードを「部門月別アプリ」のフィールドの値毎の単位で束ねます。この時に以下のマッピングのように更新用の「キー」も生成出来ます(「キー」は元の「日別明細アプリ」には無いフィールドです)。
日付 = 日付
部門 = 部門
キー = 日付 & "_" & 部門
この更新用の「キー」は「キーとなるフィールド」に指定した2つのフィールドを結合して作成しています。
続いて、「sum 関数」と「findif 関数」を使って、「項目」が”売上”の時の「金額」の合計と「項目」が”原価”の時の「金額」の合計を計算してフィールドにセットします。
売上 = sum( findif(項目, "=", "売上", 金額 ))
原価 = sum( findif(項目, "=", "原価", 金額 ))
「変換済みレコードB」を「部門月別アプリ」に書き込む
最後に、変換済みレコードBを「部門月別アプリ」に書き込みます。
やること「レコードをもとに別のレコードを更新または追加する」、条件「レコード全行が準備できた時」を使用します。
このアクションで「変換済みレコードB」のレコードを「部門月別アプリ」に書き出します。
なお、やること「レコードをもとに別のレコードを更新または追加する」は「キーとなる更新先のフィールド」に対応するレコードが無い状態で処理が動いた時(初回動かした時)はレコード追加になり、「キーとなる更新先のフィールド」に対応するレコードが有る状態で処理が動いた時(2回目以降動かした時)からはレコード更新されます。
また、この時「変換済みレコードB」には各フィールドに値がセットされた状態となっており、ここでのマッピングではフィールドをそのまま指定すれば値がセットされます。
まとめ
「レコードをフィールド値毎に束ねる」はこの例のように使い方の幅が広い「やること」なので、色々と試してみてください。
また、ご不明点等ございましたら、チャットにてご質問ください!
Customineドキュメントやサポートページも、ぜひご活用ください。