「rex0220 kSQL アクションプラグイン」の事例です。やりたいことから探せる事例集の 1 件です。
この記事は、ひとつの業務を、画面・設定・SQL・AI への頼み方まで通して見せます。設定の要点・SQL の全文・AI への頼み方は畳んであります(開くと読めます)。機能ごとの説明は、末尾の「関連記事」にある概要と ①〜⑫ の記事にまとめてあります。
やりたいこと
受注を顧客ごとにまとめて、件数と売上を別のアプリ(顧客別集計)に入れている。ふだんは受注を保存するたびに、その顧客の分だけを集計し直している(③ 集計編の形)。
ただ、ファイルからの読み込み(CSV)や、ほかのプラグイン・API からの更新では画面のイベントが動かないので、集計がずれることがある。月末などに、ボタン 1 つで全顧客の集計を作り直したい。
作り直すと、顧客ごとに次のようになります。
- 受注のある顧客は、件数と売上を書き直す
- 集計に行が無かった顧客(新しい顧客)は、行を足す
- 受注が無くなった顧客の行は、消す
担当者ごとの内訳(顧客別集計明細)も、同じ考え方で作り直します。
画面と結果
一覧の上のパネルにある[全顧客を一括再計算]を押すと、書き込む文ごとに、書き込み先と件数の確認が出ます。
動きが分かるように、押す前の集計を次の状態にしておきました(集計アプリを手で直して作った状態です)。
- 新しい顧客 C021 の行が無い
- 受注がもう無い顧客 C099 の行が残っている(内訳にも 1 行)
確認は 4 回出ます。書き込み先は論理アプリの名前で出ます(括弧の中はアプリ番号)。
| ステップ | 書き込み先 | 件数 | 中身 |
|---|---|---|---|
| 1 / 4 | 集計 | 23 件 | 書き直し 22(C099 は 0 件に)・C021 の追加 1 |
| 2 / 4 | 集計明細 | 38 件 | 書き直し 37(C099 の内訳は 0 件に)・C021 の内訳の追加 1 |
| 3 / 4 | 集計 | 1 件を削除 | C099 |
| 4 / 4 | 集計明細 | 1 件を削除 | C099 の内訳 |
2 回目の確認からは、「ここで取り消しても、前のステップで書いた分は残ります」と出ます。
| 押す前 | 押した後 | |
|---|---|---|
| 顧客別集計 | 22 行(C021 が無く、C099 がある) | 22 行(C021 が入り、C099 が消えた) |
| 件数の合計 | 226 件 | 225 件(受注アプリの件数と一致) |
| 売上の合計 | 37,679,000 円 | 37,617,000 円(受注の金額の合計と一致) |
| 顧客別集計明細 | 37 行 | 37 行(顧客ごと・担当者ごとの値が受注と一致) |
- 集計日時は、すべての行が押した時刻にそろいます。
- 書き直した行は上書きなので、レコード番号は変わりません。
- もう一度押すと「追加 0 / 更新 59 / 削除 0」で、値は変わりません。受注が同じなら、何度押しても件数と売上は同じで、集計日時だけが押した時刻に変わります。消す行が無い回は、ステップ 3・4 の確認は出ずに終わります。
- 受注アプリ自身には書かないので、完了のダイアログに[画面を更新]は出ません。
自分のアプリで使うとき
SQL の中では、アプリを番号ではなく名前で書いています(LAPP_受注 のような名前。設定の「論理アプリ」で、名前とアプリ番号を結び付けます)。そのため、アプリ番号は論理アプリの表を直すだけで差し替えられます。
ただし、項目は合わせる必要があります。下の「使うアプリと項目」の表にある項目コード・種類・「値の重複を禁止する」の設定が違うと、そのままでは動きません。違うところは、表の下の「変えるところ」を見て SQL を直してください。
使うアプリと項目
受注(ボタンを置くアプリ。論理アプリ「受注」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 顧客コード | 顧客コード | 文字列(1行) | 集計のキー |
| 担当者 | 担当者 | 文字列(1行) | 内訳の軸 |
| 金額 | 金額 | 数値 |
顧客別集計(論理アプリ「集計」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 顧客コード | 顧客コード | 文字列(1行) | 値の重複を禁止する(書き込むときの目印) |
| 件数 | 件数 | 数値 | |
| 売上 | 売上 | 数値 | |
| 集計日時 | 集計日時 | 日時 | 押した時刻を入れる |
顧客別集計明細(論理アプリ「集計明細」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 明細キー | 明細キー | 文字列(1行) |
値の重複を禁止する。「顧客コード-担当者」(例 C003-鈴木) |
| 顧客コード | 顧客コード | 文字列(1行) | |
| 担当者 | 担当者 | 文字列(1行) | |
| 件数 | 件数 | 数値 | |
| 金額 | 金額 | 数値 |
変えるところ
- 論理アプリの表(「受注」「集計」「集計明細」)を、自分のアプリに向ける
- 内訳の軸を変える(担当者 → 商品など)ときは、SQL の「担当者」と、明細キーの作り方(
CONCAT)をそろえて直す - 集計日時の項目が無ければ、SQL の 3) から
集計日時と@NOW() AS 集計日時を外す - 書き込みの上限(200 件)は、「顧客の数 + 顧客と担当者の組の数」に、消える見込みの行の 2 倍(0 に書き直す分と消す分)を足して、余裕を見て決める(下の「気をつけること」)
気をつけること
- 書き込む件数は、ふだんは「顧客の数 + 顧客と担当者の組の数」です。 受注の件数ではありません。値が変わっていない行も書き直すためです。受注が無くなった顧客がいる回は、その行を 0 に書き直す分と消す分が足されます。この例では、ふだんの回が 59 件、欠けた行と要らない行を直した回が 63 件(追加 2・更新 59・削除 2)で、書き込みの上限は 200 件にしています。顧客が増えて上限を超えると、超える文を書く前に止まります(それより前の文で書いた分は残ります)。そのときは上限を上げてください。
- 途中で取り消したり止まったりしても、原因を取り除いてから押し直せば作り直せます。 毎回、受注からまるごと計算し直すためです。止まった場所ごとに、残り得る状態は次のとおりです。
| 止まった場所 | 残り得る状態 |
|---|---|
| 最初の確認より前(受注の読み取りなど) | 何も変わらない(書き込む前に止まる) |
| ステップ 1(集計) | 集計が前のまま、または一部だけ新しい |
| ステップ 2(集計明細) | 集計は新しい。内訳が前のまま、または一部だけ新しい |
| ステップ 3・4(削除) | 受注が無くなった顧客の行が、件数 0 のまま残る |
先に全部を 0 にしてから集計する形ではないので、途中で止まっても、受注のある顧客が 0 になることはありません。
- 受注アプリは全件を読みます。 読み取りの上限(共通設定。既定 10,000 件)を超えると、途中までの件数で集計せずに、エラーで止まります。受注が何年分も溜まるアプリでは、毎回全件を読み直す形は続きません。年で分けて、ふだんは今年だけを作り直します(事例: 年別・顧客別に集計する)。一時テーブルに入れるのは受注の件数ではなく顧客の数なので、一時テーブルの上限には当たりにくい形です。
-
内訳を別のアプリに分けているのには理由があります。 集計アプリの中のテーブルに内訳を書き戻す形(
APPLY)は、書き戻す先の親レコードが 1 件に決まるときしか使えません。全顧客をまとめて書くこの形では、テーブルは書き直せません。集計アプリにテーブルの内訳もある場合は、テーブルだけ前のまま残ります。 - 集計は、押した時点で読んだ受注から作ります。 実行中に直された受注は、次に押したとき(ふだんの集計がある場合は、その受注を保存したとき)に反映されます。
- このアプリにはログアプリを設定しています。 実行の記録が残り、別の人が同時に押すと、後から押した人は「ロック中」で止まります(④ 運用編)。
- 押せる人は絞っていません。 集計アプリを作り直すだけで、受注は変えないためです。絞るなら、設定の「実行を許す人」にユーザーやグループを入れます。
設定の要点
| 設定 | 値 |
|---|---|
| 種類 | アプリ(レコードを選ばずに動く) |
| 出し方 | 一覧のパネル(区分「受注」) |
| 論理アプリ | 受注 = ボタンを置くアプリ、集計 = 顧客別集計、集計明細 = 顧客別集計明細 |
| パラメーター・入力項目 | なし |
| 確認 | オン(書き込む文ごとに件数を出す) |
| 書き込みの上限 | 200 件 |
| 結果メッセージ | 既定(追加・更新・削除の件数) |
| ログアプリ | あり(共通の設定) |
確認はオンにしています。書き込む文ごとに件数が出るので、桁違いの件数に書き込む前に気づけます。押すのは、消す行が無い回は 2 回、ある回は 4 回です。押す回数を減らしたいなら確認をオフにできますが、そのときは書き込みの上限が必須です(デモデータを初期化するは、オフにした例です)。
SQL の全文
-- @ksql dialect: 1
-- 1) 集める。受注を顧客別にまとめ、今の集計を「0 の行」として足す
CREATE TEMP TABLE #raw AS
SELECT 顧客コード, COUNT(*) AS 件数, SUM(金額) AS 売上
FROM LAPP_受注 WHERE 顧客コード <> ''
GROUP BY 顧客コード
UNION ALL
SELECT 顧客コード, 0 AS 件数, 0 AS 売上
FROM LAPP_集計;
-- 2) まとめる(kintone には行かない)
CREATE TEMP TABLE #agg AS
SELECT 顧客コード, SUM(件数) AS 件数, SUM(売上) AS 売上
FROM #raw GROUP BY 顧客コード;
-- 3) 書き込む。受注が無くなった顧客は 0 の行だけが残るので 0 で更新される
UPSERT INTO LAPP_集計 (顧客コード, 件数, 売上, 集計日時)
SELECT 顧客コード, 件数, 売上, @NOW() AS 集計日時
FROM #agg
ON DUPLICATE (顧客コード);
-- 4) 明細を集める(担当者別)。先にまとめてから連結キーを作る
CREATE TEMP TABLE #draw0 AS
SELECT 顧客コード, 担当者, COUNT(*) AS 件数, SUM(金額) AS 金額
FROM LAPP_受注 WHERE 顧客コード <> ''
GROUP BY 顧客コード, 担当者;
CREATE TEMP TABLE #draw AS
SELECT CONCAT(顧客コード, '-', 担当者) AS 明細キー, 顧客コード, 担当者, 件数, 金額
FROM #draw0
UNION ALL
SELECT 明細キー, 顧客コード, 担当者, 0 AS 件数, 0 AS 金額
FROM LAPP_集計明細;
-- 5) まとめる
CREATE TEMP TABLE #dagg AS
SELECT 明細キー, 顧客コード, 担当者, SUM(件数) AS 件数, SUM(金額) AS 金額
FROM #draw GROUP BY 明細キー, 顧客コード, 担当者;
-- 6) 書き込む(既にある行は更新されるのでレコード番号は変わらない)
UPSERT INTO LAPP_集計明細 (明細キー, 顧客コード, 担当者, 件数, 金額)
SELECT 明細キー, 顧客コード, 担当者, 件数, 金額
FROM #dagg
ON DUPLICATE (明細キー);
-- 7) 0 のまま残った行(もう受注が無い)を消す。消すのは集計のあと
DELETE FROM LAPP_集計 WHERE 件数 = 0;
DELETE FROM LAPP_集計明細 WHERE 件数 = 0;
読むときのポイントです。
-
「0 の行」を足すのが肝です。
GROUP BYでまとめると、受注が 0 件の顧客は 1 行も返りません。今の集計の行を「件数 0・売上 0」としてUNION ALLで混ぜておくと、受注が無くなった顧客も 0 件として結果に出て、3) で 0 に書き直され、7) で消えます。 -
受注は先に
GROUP BYでまとめてから一時テーブルに入れます。 一時テーブルの行が、受注の件数ではなく顧客の数で済みます。 -
明細キーは、まとめた結果に対して
CONCATで作ります。 そのため、まとめる文(#draw0)と、キーを作って 0 の行を足す文(#draw)の 2 つに分けています。 -
UPSERT … ON DUPLICATE (顧客コード)は、顧客コードが同じ行があれば上書きし、無ければ足します。キーの項目に「値の重複を禁止する」が要るのはこのためです。 -
消すのは最後で、件数 0 の行だけです。 先に消すと、消したあとで止まったときに行ごと無くなります。
DELETEの条件が件数 = 0という項目と値の比較なので、kintone の絞り込みにそのまま渡せます(全件を読んでから選ぶことはしません)。 -
@NOW()は押した時刻です。1 回の実行の中では同じ値なので、集計日時がそろいます。 -
WHERE 顧客コード <> ''は、顧客コードが空の受注を集計から外します(空のキーで書き込まないため)。
AI への頼み方
この設定は、AI(Claude Code)に kSQL アクションのオーサリングツール(kact)を使わせて作りました。渡した依頼の文は、次の 1 行だけです。
受注のデータを集計したい
AI が聞き返したこと(アプリと今の設定を調べてから聞かれました)
| 聞かれたこと | 答え |
|---|---|
| 集計の元になる受注アプリ(名前に「受注」を含むアプリが 9 つあったので、候補を絞って聞かれた) | 受注 |
| 集計した結果をどうしたいか(kSQL アクションで集計アプリへ / その場で数字を見る / 計算式でレコードの中で集計) | kSQL アクションで集計アプリへ |
| 集計の軸(顧客別 / 年月別 / 担当者別 / ステータス別。複数可) | 顧客別 |
| 顧客ごとの集計はもう組んであるので、次に何をするか(全顧客を一括再計算を足す / 使い方を知る / 別の軸 / 今のものを直す) | 一括再計算を足す |
| 元にする設定(手元の古い控えか、今の設定を取り直すか) | 取り直す |
AI が自分で決めたこと
- 書き込み先は、ふだんの集計(顧客ごと)と同じ 2 つのアプリにする
- 内訳の軸は担当者にする(集計明細アプリの項目から)
- 書き込みの上限は 200 件にする(受注 225 件・顧客 22・顧客と担当者の組 40 弱を、自分で数えた)
- SQL は、資料の標準の形(0 の行を足して集計し、消すのは最後)に合わせる
- 顧客コードが空の受注は外す
- 取り込み方は「全置換」にする(今の設定にアクションを 1 件足した、設定全体のファイルなので)
作った後に AI がしたこと
- 設定の検査(エラー 0。注意 2 件は、どちらも前からある別のアクションのもの)
- 実行計画の確認。受注の読み取りに「顧客コードが空でない」条件が効いていること、
DELETEが件数 = 0で絞られて全件の削除になっていないことを見た - 取り込み(全置換。アクション 10 件 → 11 件)と実行(この回は、Claude in Chrome で画面を操作させた)、結果の照合(件数の合計 225 が受注と一致)
足りなかったこと(実行の後に、AI と振り返って挙げたこと)
- 押す前に、集計アプリの中身が入れ替わる(5 行 → 22 行)ことを、数字で伝えなかった(確認のダイアログには出た)
- 集計に入れたくない受注(試しに入れたものなど)があるかを聞かなかった
- 集計アプリのテーブルの内訳が、この形では書き直されずに前のまま残ることを、押す前に言わなかった
依頼が 1 行でも、AI はアプリと今の設定を調べてから、決まっていないことだけを聞いてきました。押す前に知りたいこと(何がどれだけ変わるか、前のまま残るものは何か)は、依頼の文に書いておくのが確かです。
詳しい記事
- 顧客ごとの集計と「0 の行」の形: ③ 集計編
- 全体再計算で作り直す形: ⑧ 請求データ編
- 一覧のパネルにボタンを出す: ⑩ 画面のどこに出すか
- 確認・書き込みの上限・ログアプリ: ④ 運用編
- 設定を AI に作ってもらう: ⑦ オーサリング編・⑫ オーサリング改善編
関連記事
機能ごとの記事: 概要 / ① 詳細画面 / ② 一覧 / ③ 集計 / ④ 運用 / ⑤ 事例 / ⑥ イベント / ⑦ オーサリング / ⑧ 請求データ / ⑨ 締めの画面 / ⑩ どこに出すか / ⑪ 多言語 / ⑫ オーサリング改善


