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