「rex0220 kSQL アクションプラグイン」の事例です。やりたいことから探せる事例集の 1 件です。
この記事は、ひとつの業務を、画面・設定・SQL・AI への頼み方まで通して見せます。設定の要点・SQL の全文・AI への頼み方は畳んであります(開くと読めます)。機能ごとの説明は、末尾の「関連記事」にある概要と ①〜⑫ の記事にまとめてあります。
やりたいこと
生産計画(いつ・どの製品を・いくつ作るか)から、部品や材料がいくつ要るかを計算したい。
製品は部品からできていて、部品がさらに別の部品からできていることもあります。たとえばワゴンは引き出しユニットを 3 つ使い、引き出しユニットは引き出し箱を 1 つ使い、引き出し箱は合板を 3 枚使います。ワゴンを 30 台作るなら、合板は「30 × 3 × 1 × 3」枚……と、部品表を下へたどって掛け算します。同じねじが本体にも扉にも使われていれば、全部足します。さらに、作る途中で不良が出るので、歩留まり(良品になる割合)で割って多めに用意します。
Excel で部品表を掛け算している作業を、kintone のボタン 1 つに置き換えます。在庫を引く計算はしません(所要量の計算だけです)。
なぜ kSQL アクションでやるのか
kintone の標準の機能では、この計算はできません。
- 関連レコード一覧や計算の項目は、1 段下までしか見られません。部品表を何段も下へたどるには、たどった先でまた部品表を引く必要があります。
- 同じ部品が別の経路から出てきたときに、全部の経路を足す必要があります。
- 計画が変わったら、前の結果を作り直す必要があります(計画から外れた部品の行は消す)。
kSQL アクションでは、SQL の WITH RECURSIVE(同じ表を何度もたどる書き方)で、部品表を下へたどれます。計算した結果は、ほかの事例と同じ「0 の行を足して書き込む」形で、所要量のアプリに作り直します。
画面と結果
ボタンは生産計画のアプリの一覧に 1 つです。
[月を選んで所要量を計算]を押すと計画月を聞かれます(候補は今月から 3 か月)。2026-12 を選ぶと、書き込みの確認が出ます。
所要量のアプリに、品目ごとの行ができました。製品の行は作り始める数、中間品と部品の行は用意する数です。
計算の例として、棚板ユニット(M03)の 217 を追ってみます。棚板ユニットは、スチールラック(F01)に 4 つ、キャビネット(F03)に 3 つ使います。歩留まりは、スチールラックが 0.98、キャビネットが 0.95、棚板ユニットが 0.98 です。
| 経路 | 計算 | 数 |
|---|---|---|
| スチールラックを作り始める数 | 計画 40 台 ÷ 0.98 = 40.8… → 切り上げ | 41 |
| そのための棚板ユニット | 41 × 4 ÷ 0.98 = 167.3… → 切り上げ | 168 |
| キャビネットを作り始める数 | 計画 15 台 ÷ 0.95 = 15.7… → 切り上げ | 16 |
| そのための棚板ユニット | 16 × 3 ÷ 0.98 = 48.9… → 切り上げ | 49 |
| 棚板ユニットの所要量 | 168 + 49 | 217 |
- 2026-12 の 24 品目すべてが、SQL とは別の書き方で計算した値と一致しました(2027-01 の 23 品目も同じ)。
- 計画からある製品を外して押し直すと、その製品の行は消え、その製品にだけ使う分が部品の所要量から減ります(確認は「ステップ 2 / 2:レコードを 1 件 削除します」)。
計算の決まり
- 歩留まりは品目ごとに 1 つです。0.9 なら「9 割が良品」で、割り算で多めにします(10 個要るなら 10 ÷ 0.9 = 11.1… → 12 個)。
- 歩留まりはどの段にも同じ規則で効きます。製品なら完成品の良品率、中間品なら組み立ての良品率、材料なら使うときの歩留まり(鋼板を抜くときのロスなど)です。買う部品でロスが無ければ 1 です。
- 段ごとに切り上げます。 0.1 個の中間品は作れないので、その段で整数にしてから、下の段を数えます。同じ品目が別の経路から出てくるときは、経路ごとに切り上げてから足します。
- 在庫・発注残を引く計算、日付をずらす計算(リードタイム)はしません。
自分のアプリで使うとき
SQL の中では、アプリを番号ではなく名前で書いています(LAPP_部品表 のような名前。設定の「論理アプリ」で、名前とアプリ番号を結び付けます)。そのため、アプリ番号は論理アプリの表を直すだけで差し替えられます。
ただし、項目は合わせる必要があります。下の「使うアプリと項目」の表にある項目コード・種類・「値の重複を禁止する」の設定が違うと、そのままでは動きません。違うところは、表の下の「変えるところ」を見て SQL を直してください。
使うアプリと項目
品目(論理アプリ「品目」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 品目コード | 品目コード | 文字列(1行) | 必須・値の重複を禁止する |
| 品目名 | 品目名 | 文字列(1行) | 必須 |
| 区分 | 区分 | ドロップダウン | 製品 / 中間品 / 部品 |
| 歩留まり | 歩留まり | 数値 | 必須・初期値 1・最小 0・最大 1・小数 2 桁 |
部品表(論理アプリ「部品表」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 親品目 | 親品目 | 文字列(1行)・ルックアップ | 必須。品目から。作るもの(製品・中間品) |
| 子品目 | 子品目 | 文字列(1行)・ルックアップ | 必須。品目から。使うもの |
| 員数 | 員数 | 数値 | 必須・0 より大きい(小数も可)。親 1 個に使う子の数 |
ルックアップで品目名もコピーしておくと、一覧で読みやすくなります(SQL では使いません)。
生産計画(ボタンを置くアプリ。論理アプリ「生産計画」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 計画月 | 計画月 | 文字列(1行) | 必須。2026-12 の形 |
| 品目 | 品目 | 文字列(1行)・ルックアップ | 必須。品目から(製品だけを選べるように絞り込み) |
| 数量 | 数量 | 数値 | 必須・0 以上の整数。良品で欲しい数 |
同じ製品が 1 か月に何行あっても構いません(前半・後半に分けた行などは、製品ごとに足してから歩留まりで割ります)。
所要量(論理アプリ「所要量」)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 集計キー | 集計キー | 文字列(1行) |
値の重複を禁止する。「計画月-品目」(例 2026-12-M03) |
| 計画月 | 計画月 | 文字列(1行) | |
| 品目 | 品目 | 文字列(1行) | |
| 品目名 | 品目名 | 文字列(1行) | 品目から写す |
| 区分 | 区分 | ドロップダウン | 品目と同じ選択肢 |
| 所要量 | 所要量 | 数値 | |
| 計算日時 | 計算日時 | 日時 | 作り直した時刻 |
変えるところ
- 論理アプリの表(「生産計画」「部品表」「品目」「所要量」)を、自分のアプリに向ける
-
部品表の行ごとに歩留まりを持たせたい(同じ部品でも、使う工程でロスが違う)なら、部品表に歩留まりの項目を足し、SQL の 2) の係数を
b.員数 / b.歩留まり / i.歩留まりにする。このときは、0) に部品表の歩留まりの検査(0 以下と空を止める)も足し、品目の歩留まりとは別のロスとして決めておく(品目は「その品目を作る・用意するときのロス」、部品表は「その親で使うときのロス」。同じロスを両方に入れると二重に割ります) - 部品を展開するときだけ切り上げないなら、4) の
CEIL(…)を外す。製品の作り始める数も含めて小数で計算するなら、1) と 4) の両方のCEIL(…)を外す。どちらも 7) で書くときに丸める(丸めないと、小数が長く並びます) - 計画月の候補を変えるなら、入力項目の候補の式を直す
気をつけること
- 部品表は毎回全部読みます。 部品表の行は、読み取りの上限(既定 10,000 件)に収まる必要があります。
- たどった行の数にも上限があります。 製品の数 × 部品表の経路の数が、行の累計 10,000 行・深さ 100 段を超えると止まります(「階層をたどる計算(部品表など)の行が上限を超えたため、中止しました」)。この上限は設定画面からは変えられません。計画を短い期間に分けると、1 回に展開する製品が減って収まることがあります。ただし、1 つの製品だけで上限を超えるときは解消しません。また、この SQL は月の単位で結果を作り直すので、同じ月の製品を何回かに分けて計算すると、前の回で書いた製品の分を 0 にして消してしまいます。製品で分けるなら、製品ごとの結果を別に持って最後に品目ごとに足すなど、結果の持ち方から変える必要があります。
- 部品表が循環していると止まります。 「引き出し箱の中に引き出しユニット」のような誤った行があると、たどるのが終わりません。SQL の 4) で循環に印を付け、5) で書かずに止めます。
- 歩留まりが 0 の品目や、員数が 0 の部品表の行があると止まります。 SQL の先頭(0)で確かめています(kintone の数値の項目は、最小値に小数を指定できないため。1 を超える歩留まりと負の値は、項目の設定で入りません)。
- 計画や部品表に、品目マスタに無い品目があると止まります(部品表は親品目・子品目の両方を見ます)。品目マスタの行を消した後など、ルックアップで入れた値でも参照先が無くなることがあります。歩留まりを引く結合(1・2)では、品目マスタに無い品目の行は黙って抜け、所要量が少なく出たまま成功して見えるので、3) で件数を突き合わせて、書く前に止めます。
- 経路ごとに切り上げるので、品目ごとにまとめて切り上げるより少し多めに出ます。 ねじのように多くの経路から出る部品ほど差が出ます。
- 計画を変えたら、その月を押し直します。 計画から外れた品目の行は、押し直したときに消えます。
- 書き込みの途中で失敗すると、その月の結果が一部だけ書き換わったり、不要になった行が残ったりします(循環・歩留まり 0・品目マスタに無い品目は、書く前に止まるので書き込みはありません)。原因を取り除いてから、同じ月を押し直してください。同じ計画と部品表なら、押し直せば同じ結果になります。
- ログアプリを設定していないので、2 人が同時に押すと止められません。押す人を決めておくか、ログアプリを設定してください(④ 運用編)。
設定の要点
| 設定 | 月を選んで所要量を計算 |
|---|---|
| 種類 | アプリ(レコードを選ばずに動く) |
| 出し方 | 一覧のパネル(区分なし) |
| 論理アプリ | 生産計画 = ボタンを置くアプリ、部品表、品目、所要量 |
| パラメーター |
m(実行時に聞く) |
| 入力項目 | 計画月(選択・必須)。候補は計算式 ARRAY(DATE_FORMAT("TODAY", "YYYY-MM"), DATE_ADD("TODAY", 1, "month", "YYYY-MM"), DATE_ADD("TODAY", 2, "month", "YYYY-MM"))(今月から 3 か月) |
| 確認 | オン |
| 書き込みの上限 | 300 件 |
SQL の全文
-- @ksql dialect: 1
DECLARE @m = '';
-- 0) 割り算・掛け算に使う値を確かめる(0 以下があれば止める。負の値と 1 を超える歩留まりは項目の設定で入らない)
ASSERT (SELECT COUNT(*) FROM LAPP_品目 WHERE 歩留まり <= 0) = 0, '歩留まりが 0 の品目があります。品目マスタを直してください';
ASSERT (SELECT COUNT(*) FROM LAPP_部品表 WHERE 員数 <= 0) = 0, '員数が 0 の部品表の行があります。部品表を直してください';
-- 1) その月の計画を製品ごとにまとめ、製品の歩留まりで割って「作り始める数」にする(切り上げ)
CREATE TEMP TABLE #plan AS
SELECT p.品目, CEIL(SUM(p.数量) / MAX(i.歩留まり)) AS 数量
FROM LAPP_生産計画 AS p
INNER JOIN LAPP_品目 AS i ON i.品目コード = p.品目
WHERE p.計画月 = @m
GROUP BY p.品目;
-- 2) 部品表の行ごとに「親 1 個に、子をいくつ用意するか」(員数 / 子の歩留まり)
-- 親品目も品目マスタと結合しておく(親が品目マスタに無い行も 3) で見つけるため)
CREATE TEMP TABLE #bom AS
SELECT b.親品目, b.子品目, b.員数 / i.歩留まり AS 係数
FROM LAPP_部品表 AS b
INNER JOIN LAPP_品目 AS i ON i.品目コード = b.子品目
INNER JOIN LAPP_品目 AS ip ON ip.品目コード = b.親品目;
-- 3) 計画と部品表の品目が、すべて品目マスタにあるか
-- (無い品目は 1) 2) の結合で黙って抜け、所要量が少なく出るので、書く前に止める。部品表は親品目・子品目の両方)
ASSERT (SELECT COUNT(*) FROM #plan) = (SELECT COUNT(DISTINCT 品目) FROM LAPP_生産計画 WHERE 計画月 = @m), '計画に、品目マスタに無い品目があります({@m})。品目マスタか計画を直してください';
ASSERT (SELECT COUNT(*) FROM #bom) = (SELECT COUNT(*) FROM LAPP_部品表), '部品表に、品目マスタに無い品目があります。品目マスタか部品表を直してください';
-- 4) 部品表を下へたどる(段ごとに切り上げ。部品表が循環していたら印を付ける)
CREATE TEMP TABLE #exp AS
WITH RECURSIVE 展開 (品目, 数量, 深さ) AS (
SELECT 品目, 数量, 0 FROM #plan
UNION ALL
SELECT c.子品目, CEIL(r.数量 * c.係数), r.深さ + 1
FROM #bom AS c
INNER JOIN 展開 AS r ON c.親品目 = r.品目
)
CYCLE 品目 SET 循環 TO 'Y' DEFAULT 'N'
SELECT 品目, 数量, 深さ, 循環 FROM 展開;
-- 5) 部品表が循環していたら、書かずに止める
ASSERT (SELECT COUNT(*) FROM #exp WHERE 循環 = 'Y') = 0, '部品表が循環しています({@m})。部品表を直してください';
-- 6) 品目ごとに合計し、その月の今の所要量を「0 の行」として足す
CREATE TEMP TABLE #raw AS
SELECT 品目, SUM(数量) AS 所要量 FROM #exp GROUP BY 品目
UNION ALL
SELECT 品目, 0 AS 所要量 FROM LAPP_所要量 WHERE 計画月 = @m;
CREATE TEMP TABLE #agg AS
SELECT 品目, SUM(所要量) AS 所要量 FROM #raw GROUP BY 品目;
-- 7) 書き込む。キーは「計画月-品目」。品目名と区分は品目マスタから
UPSERT INTO LAPP_所要量 (集計キー, 計画月, 品目, 品目名, 区分, 所要量, 計算日時)
SELECT CONCAT(@m, '-', a.品目) AS 集計キー, @m AS 計画月, a.品目, i.品目名, i.区分, a.所要量, @NOW() AS 計算日時
FROM #agg AS a
LEFT JOIN LAPP_品目 AS i ON i.品目コード = a.品目
ON DUPLICATE (集計キー);
-- 8) 計画から外れた品目の行を消す(消すのは書き込みのあと)
DELETE FROM LAPP_所要量 WHERE 計画月 = @m AND 所要量 = 0;
読むときのポイントです。
- 0) と 3) は、計算を始める前・書く前の検査です。 0) は割り算・掛け算に使う値が 0 でないか、3) は計画と部品表の品目がすべて品目マスタにあるか(結合で抜けた行が無いか)を、件数を比べて確かめます。部品表は 2) で親品目と子品目の両方を品目マスタと結合しているので、どちらが欠けても件数が合わなくなります。どれも、止まったときは何も書いていません。
-
4) の
WITH RECURSIVEが部品表をたどる部分です。 1 行目のSELECT … FROM #planが出発点(製品と作り始める数)で、UNION ALLの後ろのSELECTが「今の行の品目を親に持つ部品表の行」をつないで 1 段下を作ります。新しい行が出なくなるまで繰り返します。 - 歩留まりは 1) と 2) で先に結合しておきます。 たどる部分(4)の中では、部品表と自分自身のほかにアプリを結合できないためです(2 つ目の結合を書くと、設定の保存で止まります)。品目ごとの歩留まりは、2) で「員数 ÷ 子の歩留まり」という係数にしておき、たどるときは掛けるだけにしています。
-
CYCLE 品目 SET 循環 TO 'Y' DEFAULT 'N'は、たどっている途中で同じ品目に戻ったら、その行に循環 = 'Y'の印を付けて、そこから先へはたどらない指定です。5) のASSERTがその印を数えて止めます。止めたときの文の{@m}には計画月が入ります。 - 6)〜8) は、事例: 全顧客の集計を作り直すと同じ「0 の行」の形です。 計画から外れた品目は 0 になって 7) で書き直され、8) で消えます。
-
MAX(i.歩留まり)は、製品ごとにまとめた行で歩留まりを 1 つ取り出すための書き方です(品目コードは重複しないので、どの行も同じ値です)。
AI への頼み方
この事例は、AI(Claude Code)に kSQL アクションのオーサリングツール(kact)を使わせて作りました。やりとりした依頼の文です。
次の事例として、所要量展開的なものはどうか?
歩留まりは入れられるか?
「歩留まり 0.9」で割る
製品そのものの歩留まり(完成品の不良)も入れる
在庫計算は対象外で所要量計算のみ
試験用のアプリを作ってよい
AI が先に確かめたこと
- エンジンの資料で
WITH RECURSIVEを調べ、一時テーブルの元に置けるか・設定の保存で止まらないか・計算が合うかを、小さな部品表で試した(kintone にはつながない試し) - 歩留まりを部品表の行に持つ形と、品目に持つ形の両方を試した。たどる部分の中で品目を結合する形は保存で止まるので、先に結合しておく形にした
- 丸め方で数がどれだけ変わるかを見せて、段ごとに切り上げる形を勧めた
AI が自分で決めたこと
- 歩留まりは品目に 1 つ(製品の歩留まりも同じ項目で入り、どの段にも同じ規則で効く)
- 部品表が循環していたら止める(
CYCLEとASSERT)、歩留まりが 0 なら止める(kintone の数値の項目は最小値に小数を指定できないため) - データは製品 5・中間品 7・部品 12・部品表 39 行(4 段。共通の部品あり)。同じ製品が 1 か月に 2 行ある計画も入れる
作った後に AI がしたこと
- アプリ 4 つとデータを作り、設定の検査(エラー 0、注意 0)と、文ごとの実行計画の確認
- SQL とは別の書き方で同じ計算をする検算を用意し、2 か月分の全品目が一致することを確かめた
- 計画を外したときに行が消えること、部品表を循環させたとき・歩留まりを 0 にしたときに止まること(書き込みなし)を確かめて、データを元に戻した
- 記事の講評(ChatGPT)を受けて、品目マスタに無い品目と員数 0 の検査を足し、実機で止まることを確かめた(2 回目の講評で、部品表は親品目も見るようにした)
途中で、プラグインの直すべき点が 2 つ見つかりました(確認のダイアログが UPSERT を「更新します」と出していたので「追加または更新します」に、たどる行の上限を超えたときの文を「分けて実行してください」に)。事例を実際に動かすと、こうした細かいところも見つかります。
詳しい記事
- 結果をダッシュボードで見る(製品別の内訳・計算の状態): 事例: 所要量をダッシュボードで見る
- 「0 の行」を足して作り直す形: 事例: 全顧客の集計を作り直す・③ 集計編
- 月で分けて作り直す形: 事例: 年別・顧客別に集計する
- 確認・書き込みの上限・ログアプリ: ④ 運用編
- 設定を AI に作ってもらう: ⑦ オーサリング編・⑫ オーサリング改善編
関連記事
機能ごとの記事: 概要 / ① 詳細画面 / ② 一覧 / ③ 集計 / ④ 運用 / ⑤ 事例 / ⑥ イベント / ⑦ オーサリング / ⑧ 請求データ / ⑨ 締めの画面 / ⑩ どこに出すか / ⑪ 多言語 / ⑫ オーサリング改善






