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