0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rex0220 kSQL アクションプラグイン - 事例: 所要量を計算する(部品表を下へたどる・歩留まりつき)

0
Last updated at Posted at 2026-11-09

「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 を選ぶと、書き込みの確認が出ます。

確認のダイアログ(所要量に 24 件 追加または更新)

完了のメッセージ(追加 24 件・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
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?