「rex0220 kSQL アクションプラグイン」の事例です。やりたいことから探せる事例集の 1 件で、事例: 所要量を計算するの続きです。
この記事は、ひとつの業務を、画面・設定・SQL・AI への頼み方まで通して見せます。設定の要点・SQL の全文・AI への頼み方は畳んであります(開くと読めます)。機能ごとの説明は、末尾の「関連記事」にある概要と ①〜⑫ の記事にまとめてあります。
やりたいこと
前の事例で、生産計画から部品や材料の所要量を計算し、所要量のアプリに品目ごとの行を作りました。ただ、一覧に 24 行並んでいるだけでは、次のことが分かりません。
- 全部でいくつ要るのか。どの製品のための分が多いのか
- 今の数は、最新の計画で計算した数なのか(計画を直した後に、押し直し忘れていないか)
- 来月と比べて、増えるのか減るのか
これを、所要量のアプリを開いたときにひと目で分かる画面にします。
考え方: 計算はボタン、ダッシュボードは見るだけ
画面は kSQL Dashboard Pro(SQL でグラフや表を出すプラグイン)で作ります。ダッシュボードでも SQL は書けますが、部品表をたどる計算はダッシュボードには書きません。ボタン(kSQL アクション)が書いた結果を読んで、見せるだけにします。
- 計算の決まりを 1 か所にまとめられる。 画面の数は、ボタンが計算して書いた数です。歩留まりで割る・段ごとに切り上げる、といった決まりを、ダッシュボードにもう一度書かずに済みます。
- 入力の不備は、書く前に止まる。 ボタンは、部品表の循環や品目マスタに無い品目を見つけると、結果を書き換えずに止まります。そのときダッシュボードには、前に計算した結果がそのまま出ます。
- 軽い。 ダッシュボードは、見る人が開くたびに kintone から読みます。部品表をたどり直さず、結果のアプリ(1 か月で数十行)を読むだけにします。
足りないのは「どの製品のための分か」です。所要量のアプリは品目ごとに足した後の数なので、製品で色分けできません。そこで、ボタンの SQL を少し直し、製品 × 品目の内訳も新しいアプリ「所要量内訳」に書くようにしました。
生産計画・部品表・品目 ──[月を選んで所要量を計算]──▶ 所要量(品目ごと)
所要量内訳(製品 × 品目)
│
所要量のアプリの一覧で、kSQL Dashboard Pro が読んで見せる
画面と結果
ダッシュボードは、所要量のアプリの一覧に出ます。4 枚のタブ(概要・製品別・内訳の表・月の比較)に分けて、どのタブもグラフが画面に収まるようにしました。計画月の選択は、全部のタブで共通です。テーマはグレーにして、下の一覧と見分けやすくしています。
概要
- 合計(選んだ月): 製品は歩留まりで割った作り始める数、中間品と部品は用意する数です。ねじも合板も 1 個として足した数なので、量の目安として見ます(品目ごとの数は、ほかのタブで見ます)。
- 計算の状態: 押し直しを忘れていないかの目安です(下)。
- 計算の決まり: 数の意味(歩留まりで割る、段ごとに切り上げる、在庫は考えない)を書いておきます。
計算の状態は、選んだ月について次の順に確かめて、最初に当てはまったものを出します。緑以外は行が赤くなります。
| 出る文 | 意味 |
|---|---|
| この月の計算結果がありません | 所要量のアプリに、その月の行が無い |
| 計算の後に生産計画が N 件直されています(部品表・品目マスタも同じ) | 計算した時刻より後に更新された行がある |
| 所要量と内訳の合計が合いません | 所要量と所要量内訳で、その月の数の合計が違う(書き込みの途中で止まったときなど) |
| 計算の後に直された行は見つかりません(緑) | 上のどれにも当てはまらない |
緑は「押し直しが要りそうな印は見つからない」という意味で、計算が正しく終わったことを保証するものではありません(分からない場合は「気をつけること」)。
計画を直した後、押し直す前に開くと、こうなります。
内訳の書き込みが途中で止まったときは、合計が合わなくなることがあります(試しに内訳の 1 行の数を書き換えたところです)。
どちらも、生産計画のアプリで[月を選んで所要量を計算]を押し直すと、「計算の後に直された行は見つかりません」に戻ります。
製品別
部品・材料と中間品の所要量を、どの製品のための分かで色分けしています。ねじ M4 は 5 つの製品すべてで使われていること、棚板ユニットはスチールラックとキャビネットの分であることが、ひと目で分かります。棒にマウスを重ねると、製品ごとの数が出ます。
内訳の表
品目ごとに、所要量・使う製品の数・製品別の内訳を 1 行で読めます。棚板ユニット(M03)の「217 = スチールラック 168 / キャビネット 49」は、前の事例で手で追った数と同じです。
月の比較
計算済みの月を並べます(計画月の選択には連動しません)。2027-01 は合板やねじ M4 が減り、ねじ M6 は少し増えます。
ボタンの確認
ボタンは 2 つのアプリに書くようになったので、確認も 2 段になります(消す行が無い段は出ません)。
2026-12 は、所要量 24 件と所要量内訳 52 件で、合計 76 件です。完了のメッセージは「追加 0 / 更新 76 / 削除 0、6 秒」でした(2 回目からの数です。初めて押したときは、内訳の 52 件が追加になります)。
- 内訳は、2026-12 の 52 行、2027-01 の 48 行のすべてが、SQL とは別の書き方で計算した値と一致しました。製品ごとの数を品目ごとに足すと、所要量のアプリの値と同じになります。
自分のアプリで使うとき
事例: 所要量を計算するの 4 つのアプリとボタンができていることが前提です。そこに 3 つ足します。
- 所要量内訳のアプリを作る。 項目は下の「使うアプリと項目」のとおりです。
- ボタンの SQL を差し替える。 ボタンの設定の論理アプリに「所要量内訳」を足し、SQL を下の「SQL の全文(ボタン)」に置き換えます。
- 所要量のアプリに kSQL Dashboard Pro を入れ、設定ファイルを取り込む。 下の「ダッシュボードの設定ファイル」をファイルに保存し、Dashboard Pro の設定画面の[ツール]→[インポート]で選びます。論理アプリの割り当てが出るので、自分のアプリ番号を入れて[インポート]→[保存]します。
ボタンもダッシュボードも、SQL の中ではアプリを番号ではなく名前(LAPP_所要量内訳 のような論理アプリ)で書いています。そのため、アプリ番号は割り当ての表を直すだけで差し替えられます。ただし、項目は合わせる必要があります。
使うアプリと項目
所要量内訳(論理アプリ「所要量内訳」。新しく作る)
| 項目名 | 項目コード | 種類 | メモ |
|---|---|---|---|
| 集計キー | 集計キー | 文字列(1行) | 必須・値の重複を禁止する。「計画月-製品-品目」(例 2026-12-F01-M03) |
| 計画月 | 計画月 | 文字列(1行) | |
| 製品 | 製品 | 文字列(1行) | 出発点の製品の品目コード |
| 製品名 | 製品名 | 文字列(1行) | 品目から写す |
| 品目 | 品目 | 文字列(1行) | |
| 品目名 | 品目名 | 文字列(1行) | 品目から写す |
| 区分 | 区分 | ドロップダウン | 製品 / 中間品 / 部品(品目と同じ選択肢) |
| 数量 | 数量 | 数値 | その製品のために要る数 |
| 計算日時 | 計算日時 | 日時 | 作り直した時刻 |
品目・部品表・生産計画・所要量のアプリは、事例: 所要量を計算するの「使うアプリと項目」のとおりです。
変えるところ
- 論理アプリの表を、自分のアプリに向ける(ボタンの設定と、ダッシュボードの取り込みの両方)
-
計画月の既定値: 設定ファイルの
"default": "2026-12"を、運用に合わせた月にする。閲覧者が選んだ月はブラウザが覚えるので、既定値が効くのは、初めて開いたときと[既定に戻す]を押したときです。defaultは消さないでください。 消すと、選択肢の先頭の月が見えているのに値が渡らず、開いた直後のダッシュボードが空になります - テーマ: 設定画面の「テーマ」で選ぶ(設定ファイルでは
"theme": "dark"がグレー) - グラフの高さ: 設定ファイルの
layoutのh。この事例は 8 段で、ノートパソコンの画面でも目盛りまで収まる高さにしています
気をつけること
-
ダッシュボードは計算しません。 計画・部品表・品目マスタを直したら、生産計画のアプリでその月を押し直してください。計算の後に更新された行が見つかると計算の状態が赤くなるので、押し忘れに気づけます。
-
書き込みの途中で失敗すると、所要量と内訳が合わなくなることがあります。 ボタンは所要量を書いてから内訳を書くので、内訳の途中で止まると、所要量は新しく内訳は前のまま、になります。計算の状態に「合計が合いません」と出たら、原因を取り除いてから押し直してください。
-
計算の状態で分からないこともあります。 数えているのは「計算した時刻より後に更新された行」と「合計が合うか」なので、次のときは緑のままです。
- 行を消したとき(消えた行は数えられません)
- 計画の行を別の月に移したときの、元の月
- 計算と同じ 1 分のうちに直したとき(kintone の日時は分まで)
- 書き込みが途中で止まっても、たまたま合計が同じだったとき
計画の行を消したり、月を移したりしたときは、念のため押し直してください。また、計画を全部外して押し直した月は行が無くなるので、まだ計算していない月と同じ「計算結果がありません」と出ます(区別するには、押した記録を別に残す必要があります)。
-
グラフは名前でまとめています。 製品別のグラフと月の比較は、品目名・製品名で並べるので、違うコードで同じ名前の品目があると 1 本にまとまります。名前が重複するなら、SQL の
品目名をCONCAT(品目, ' ', 品目名)のようにコード付きにしてください。 -
部品表と品目マスタの変更は、どの月にも効きます。 部品表を直すと、どの月を選んでも赤くなります(どの月の数も変わり得るためです)。
-
書く件数が増えます。 内訳の行は、製品ごとに、その製品に使う品目の数だけできます(2026-12 は 52 行、所要量と合わせて 76 件)。ボタンの「書き込みの上限」(この事例は 300 件)に収まるように、製品や品目が多いときは上限を見直してください。
-
グラフの色分けは 8 つまでです。 Dashboard Pro は、系列(製品別のグラフでは製品、月の比較では月)が 8 を超えると「その他」にまとめます。製品が 9 つ以上あるときは、製品別のグラフの 9 つ目からが「その他」になります(内訳の表には全部出ます)。月の比較は、月が増えたら SQL に
WHERE 計画月 >= '2026-12'のような条件を足して、直近の月に絞ってください。
設定の要点
ボタン(前の事例から変えたところ)
| 設定 | 月を選んで所要量を計算 |
|---|---|
| 論理アプリ | 生産計画 = ボタンを置くアプリ、部品表、品目、所要量、所要量内訳(足した) |
| 書き込みの上限 | 300 件(そのまま。2026-12 は 76 件) |
| SQL | 下の「SQL の全文(ボタン)」に置き換える |
ダッシュボード(所要量のアプリの kSQL Dashboard Pro)
| 設定 | 値 |
|---|---|
| 出す一覧 | 共通(全部の一覧) |
| テーマ | グレー |
| 変数 | 計画月 m(選択・必須。候補は所要量のアプリにある月、既定は 2026-12) |
| タブ | 概要(合計・計算の状態・計算の決まり)/製品別(横の積み上げ棒 2 つ)/内訳の表/月の比較(横棒) |
| 論理アプリ | 所要量、所要量内訳、生産計画、部品表、品目 |
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 r.製品, 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) 内訳: 製品 × 品目ごとに合計し、その月の今の内訳を「0 の行」として足す(製品ごとの数を足すと 6) の合計になる)
CREATE TEMP TABLE #draw AS
SELECT 製品, 品目, SUM(数量) AS 数量 FROM #exp GROUP BY 製品, 品目
UNION ALL
SELECT 製品, 品目, 0 AS 数量 FROM LAPP_所要量内訳 WHERE 計画月 = @m;
CREATE TEMP TABLE #dagg AS
SELECT 製品, 品目, SUM(数量) AS 数量 FROM #draw GROUP BY 製品, 品目;
-- 8) 合計を書き込む。キーは「計画月-品目」。品目名と区分は品目マスタから
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 (集計キー);
-- 計画から外れた品目の行を消す(消すのは書き込みのあと)
DELETE FROM LAPP_所要量 WHERE 計画月 = @m AND 所要量 = 0;
-- 9) 内訳を書き込む。キーは「計画月-製品-品目」。製品名・品目名・区分は品目マスタから
UPSERT INTO LAPP_所要量内訳 (集計キー, 計画月, 製品, 製品名, 品目, 品目名, 区分, 数量, 計算日時)
SELECT CONCAT(@m, '-', d.製品, '-', d.品目) AS 集計キー, @m AS 計画月, d.製品, ip.品目名 AS 製品名, d.品目, i.品目名, i.区分, d.数量, @NOW() AS 計算日時
FROM #dagg AS d
LEFT JOIN LAPP_品目 AS i ON i.品目コード = d.品目
LEFT JOIN LAPP_品目 AS ip ON ip.品目コード = d.製品
ON DUPLICATE (集計キー);
-- 計画から外れた製品・品目の内訳を消す
DELETE FROM LAPP_所要量内訳 WHERE 計画月 = @m AND 数量 = 0;
前の事例の SQL から変えたところです。
-
4) で、出発点の製品を持ち回ります。
展開に製品の列を足し、出発点(#plan)では製品そのもの、1 段下へ進むときはつなぐ前の行のr.製品を入れます。こうすると、たどった行のどれもが「どの製品から来たか」を持ちます。 -
7) で、製品 × 品目ごとに足します。 6) と同じ「0 の行」の形で、その月の今の内訳を 0 として足しておきます。計画から外れた製品の内訳は 0 になり、9) の後の
DELETEで消えます。 -
9) で、内訳を書きます。 キーは「計画月-製品-品目」です。製品名と品目名は、品目マスタを 2 回結合して写します(
iが品目、ipが製品)。 - 製品ごとの数を品目ごとに足すと、6) の合計と同じになります。どちらも同じ
#exp(経路ごとに切り上げた行)から作っているためです。
ダッシュボードの SQL(ペインごと)
合計(選んだ月)(KPI カード。タイトル = タイトル、値 = メイン値、単位「個」)
SELECT CASE WHEN 区分 = '製品' THEN '製品(作り始める数)' WHEN 区分 = '中間品' THEN '中間品(用意する数)' ELSE '部品・材料(用意する数)' END AS タイトル,
SUM(所要量) AS メイン値,
CASE WHEN 区分 = '製品' THEN 1 WHEN 区分 = '中間品' THEN 2 ELSE 3 END AS 並び
FROM LAPP_所要量
WHERE 計画月 = @m
GROUP BY 区分
ORDER BY 並び
計算の状態(表。状態 が「計算の後に直された行は見つかりません」でない行を赤くする)
SET @calc = (SELECT MAX(計算日時) FROM LAPP_所要量 WHERE 計画月 = @m);
SET @since = (SELECT COALESCE(MAX(計算日時), '2999-12-31T00:00:00Z') FROM LAPP_所要量 WHERE 計画月 = @m);
SET @plan = (SELECT COUNT(*) FROM LAPP_生産計画 WHERE 計画月 = @m AND 更新日時 > @since);
SET @bom = (SELECT COUNT(*) FROM LAPP_部品表 WHERE 更新日時 > @since);
SET @item = (SELECT COUNT(*) FROM LAPP_品目 WHERE 更新日時 > @since);
SET @total = (SELECT SUM(所要量) FROM LAPP_所要量 WHERE 計画月 = @m);
SET @detail = (SELECT SUM(数量) FROM LAPP_所要量内訳 WHERE 計画月 = @m);
CREATE TEMP TABLE #t AS SELECT @calc AS 計算日時, @plan AS 計画, @bom AS 部品表, @item AS 品目, COALESCE(@total, 0) AS 合計, COALESCE(@detail, 0) AS 内訳;
SELECT 計算日時,
CASE WHEN 計算日時 IS NULL THEN 'この月の計算結果がありません。生産計画のアプリで計算してください'
WHEN 計画 > 0 THEN CONCAT('計算の後に生産計画が ', 計画, ' 件直されています。押し直してください')
WHEN 部品表 > 0 THEN CONCAT('計算の後に部品表が ', 部品表, ' 件直されています。押し直してください')
WHEN 品目 > 0 THEN CONCAT('計算の後に品目マスタが ', 品目, ' 件直されています。押し直してください')
WHEN 合計 <> 内訳 THEN '所要量と内訳の合計が合いません。押し直してください'
ELSE '計算の後に直された行は見つかりません' END AS 状態
FROM #t
部品・材料の所要量(製品別)(横の積み上げ棒。軸 = 品目名、系列 = 製品名、値 = 数量)。中間品のグラフは 区分 = '中間品' にしただけです。
SELECT 品目名, 製品名, SUM(数量) AS 数量
FROM LAPP_所要量内訳
WHERE 計画月 = @m AND 区分 = '部品'
GROUP BY 品目名, 製品名
品目ごとの所要量と内訳(表。並び の列は隠す)
SELECT 区分, 品目, 品目名, SUM(数量) AS 所要量, COUNT(*) AS 使う製品,
GROUP_CONCAT(CONCAT(製品名, ' ', 数量) SEPARATOR ' / ') AS 製品別の内訳,
CASE WHEN 区分 = '製品' THEN 1 WHEN 区分 = '中間品' THEN 2 ELSE 3 END AS 並び
FROM LAPP_所要量内訳
WHERE 計画月 = @m
GROUP BY 区分, 品目, 品目名
ORDER BY 並び, 品目
部品・材料の所要量(月の比較)(横棒。軸 = 品目名、系列 = 計画月、値 = 所要量)
SELECT 品目名, 計画月, 所要量
FROM LAPP_所要量
WHERE 区分 = '部品'
ORDER BY 品目, 計画月
読むときのポイントです。
-
@mは計画月の選択の値です。 Dashboard Pro が SQL の前に差し込むので、DECLAREは書きません。 -
計算の状態は、最新の更新日時ではなく「計算の後に更新された行の数」を見ます。
SELECT MAX(更新日時) FROM LAPP_部品表と書くと、いちばん新しい日時を探すために部品表を全件読みます。COUNT(*) … WHERE 更新日時 > @calcなら条件を kintone に渡せて、件数だけを 1 回で聞けます(実行計画で「kintone 側で絞り込み済み」と出ます)。部品表が何千行あっても、開くたびに読むのは 1 回です。 -
@sinceは、計算結果が無い月のための値です。 その月の行が無いとMAX(計算日時)は空になり、空のまま更新日時 > @calcとして kintone に送ると、クエリの誤りでペインごと止まります。COALESCE(MAX(計算日時), '2999-12-31T00:00:00Z')で遠い未来の日時に置き換えて数え(件数は 0 になります)、「計算結果がありません」は@calcが空かどうかで出し分けます。 -
@totalと@detailで、所要量と内訳の合計を比べます。 どちらもその月の行だけを読みます(1 か月で 24 行と 52 行)。 -
最新の更新日時そのものを出したいときは
KORDER BYを使います。SELECT 更新日時 FROM LAPP_部品表 KORDER BY 更新日時 DESC LIMIT 1と書くと、kintone に更新日時の新しい順に並べさせて、先頭の 1 件だけを読みます(KORDER BYは kintone の並べ替えをそのまま使う書き方です。ふつうのORDER BYだと全件を読んでから並べます)。ただしKORDER BYは結果を返す最後のSELECTにしか書けず、SETの中では止まります。この事例は 3 つのアプリを 1 つの表で比べるので、件数で見る形にしました。 -
このダッシュボードのエンジン(3.85)では書けなかった形が 3 つあり、書き換えました。
-
CASE 区分 WHEN '製品' THEN …(列を先に書く CASE)→CASE WHEN 区分 = '製品' THEN … -
ORDER BYに式を書く → 並び順の列(並び)を作って、それで並べる(表では隠す) -
FROMの無いSELECTで変数を比べるCASE→ 一時テーブル#tに入れてから、FROM #tで比べる
-
-
内訳の表の
GROUP_CONCAT(… SEPARATOR ' / ')で、製品ごとの数を 1 つの文字列にまとめています。
ダッシュボードの設定ファイル(全文)
これを .json のファイルに保存して、Dashboard Pro の設定画面の[ツール]→[インポート]で取り込みます。
{
"date": "2026-11-09 19:50:00",
"pluginName": "kSQL Dashboard Pro",
"pluginVersion": "2",
"engineVersion": "3.85.0",
"pluginId": "fellopeiagkdlgopghiolokkedgkijdj",
"appId": 4416,
"appName": "所要量",
"sqlApps": [
{
"appId": 4416,
"appName": "所要量",
"logicalName": "所要量"
},
{
"appId": 4417,
"appName": "所要量内訳",
"logicalName": "所要量内訳"
},
{
"appId": 4415,
"appName": "生産計画",
"logicalName": "生産計画"
},
{
"appId": 4414,
"appName": "部品表",
"logicalName": "部品表"
},
{
"appId": 4413,
"appName": "品目",
"logicalName": "品目"
}
],
"config": {
"schemaVersion": 2,
"edition": "pro",
"views": {},
"common": {
"view": {
"name": "所要量ダッシュボード",
"layout": [],
"panes": [],
"tabs": [
{
"id": "overview",
"name": "概要",
"layout": [
{
"i": "pane1",
"x": 0,
"y": 0,
"w": 36,
"h": 3
},
{
"i": "pane2",
"x": 36,
"y": 0,
"w": 24,
"h": 3
},
{
"i": "pane7",
"x": 0,
"y": 3,
"w": 60,
"h": 3
}
],
"panes": [
{
"id": "pane1",
"type": "kpi",
"title": "合計(選んだ月)",
"sql": "SELECT CASE WHEN 区分 = '製品' THEN '製品(作り始める数)' WHEN 区分 = '中間品' THEN '中間品(用意する数)' ELSE '部品・材料(用意する数)' END AS タイトル,\n SUM(所要量) AS メイン値,\n CASE WHEN 区分 = '製品' THEN 1 WHEN 区分 = '中間品' THEN 2 ELSE 3 END AS 並び\n FROM LAPP_所要量\n WHERE 計画月 = @m\n GROUP BY 区分\n ORDER BY 並び",
"options": {
"multi": true,
"align": "right",
"format": {
"thousandSep": true,
"decimals": 0,
"suffix": " 個"
},
"description": "所要量のアプリ(kSQL アクションが書いた結果)を、区分ごとに足した数です。製品は歩留まりで割った**作り始める数**、中間品と部品は**用意する数**です。ねじも合板も 1 個として足した数なので、量の目安として見てください(品目ごとの数は[製品別][内訳の表]のタブ)。",
"kpi": {
"title": "タイトル",
"value": "メイン値"
}
}
},
{
"id": "pane2",
"type": "table",
"title": "計算の状態",
"sql": "SET @calc = (SELECT MAX(計算日時) FROM LAPP_所要量 WHERE 計画月 = @m);\nSET @since = (SELECT COALESCE(MAX(計算日時), '2999-12-31T00:00:00Z') FROM LAPP_所要量 WHERE 計画月 = @m);\nSET @plan = (SELECT COUNT(*) FROM LAPP_生産計画 WHERE 計画月 = @m AND 更新日時 > @since);\nSET @bom = (SELECT COUNT(*) FROM LAPP_部品表 WHERE 更新日時 > @since);\nSET @item = (SELECT COUNT(*) FROM LAPP_品目 WHERE 更新日時 > @since);\nSET @total = (SELECT SUM(所要量) FROM LAPP_所要量 WHERE 計画月 = @m);\nSET @detail = (SELECT SUM(数量) FROM LAPP_所要量内訳 WHERE 計画月 = @m);\nCREATE TEMP TABLE #t AS SELECT @calc AS 計算日時, @plan AS 計画, @bom AS 部品表, @item AS 品目, COALESCE(@total, 0) AS 合計, COALESCE(@detail, 0) AS 内訳;\nSELECT 計算日時,\n CASE WHEN 計算日時 IS NULL THEN 'この月の計算結果がありません。生産計画のアプリで計算してください'\n WHEN 計画 > 0 THEN CONCAT('計算の後に生産計画が ', 計画, ' 件直されています。押し直してください')\n WHEN 部品表 > 0 THEN CONCAT('計算の後に部品表が ', 部品表, ' 件直されています。押し直してください')\n WHEN 品目 > 0 THEN CONCAT('計算の後に品目マスタが ', 品目, ' 件直されています。押し直してください')\n WHEN 合計 <> 内訳 THEN '所要量と内訳の合計が合いません。押し直してください'\n ELSE '計算の後に直された行は見つかりません' END AS 状態\n FROM #t",
"options": {
"columns": {
"計算日時": {
"width": 150,
"format": {
"kind": "date",
"pattern": "YYYY/MM/DD HH:mm"
}
},
"状態": {
"wrap": true
}
},
"rules": [
{
"kind": "threshold",
"column": "状態",
"op": "!=",
"value": "計算の後に直された行は見つかりません",
"tone": "crit",
"scope": "row"
}
],
"description": "押し忘れに気づくための目安です。所要量の計算日時より後に更新された行を、生産計画(その月)・部品表・品目マスタで数え、所要量と内訳の合計が合うかも見ます。計算が正しく終わったことを保証するものではありません。**行を消しただけ**のときは数えられないので、ここでは分かりません。",
"descWidth": "large"
}
},
{
"id": "pane7",
"type": "markdown",
"title": "計算の決まり",
"sql": "",
"options": {
"markdown": "- 数は、生産計画のアプリの **[月を選んで所要量を計算]** が書いた結果です(このダッシュボードは計算しません)。\n- 歩留まり(良品の割合)で**割って**多めにし、**段ごとに切り上げ**ます。同じ品目が別の経路から出てくるときは、経路ごとに切り上げてから足します。\n- 在庫・発注残・リードタイムは考えていません。",
"fontSize": "normal"
}
}
]
},
{
"id": "byproduct",
"name": "製品別",
"layout": [
{
"i": "pane3",
"x": 0,
"y": 0,
"w": 30,
"h": 8
},
{
"i": "pane4",
"x": 30,
"y": 0,
"w": 30,
"h": 8
}
],
"panes": [
{
"id": "pane3",
"type": "barHStacked",
"title": "部品・材料の所要量(製品別)",
"sql": "SELECT 品目名, 製品名, SUM(数量) AS 数量\n FROM LAPP_所要量内訳\n WHERE 計画月 = @m AND 区分 = '部品'\n GROUP BY 品目名, 製品名",
"options": {
"mapping": {
"x": "品目名",
"seriesKey": "製品名",
"value": "数量"
},
"legend": "top",
"valueFormat": {
"thousandSep": true,
"decimals": 0
},
"description": "所要量内訳のアプリ(計画月 × 製品 × 品目)から、どの製品のための分かで色分けしています。製品ごとの数を足すと、所要量のアプリの値になります。"
}
},
{
"id": "pane4",
"type": "barHStacked",
"title": "中間品の所要量(製品別)",
"sql": "SELECT 品目名, 製品名, SUM(数量) AS 数量\n FROM LAPP_所要量内訳\n WHERE 計画月 = @m AND 区分 = '中間品'\n GROUP BY 品目名, 製品名",
"options": {
"mapping": {
"x": "品目名",
"seriesKey": "製品名",
"value": "数量"
},
"legend": "top",
"valueFormat": {
"thousandSep": true,
"decimals": 0
}
}
}
]
},
{
"id": "detail",
"name": "内訳の表",
"layout": [
{
"i": "pane5",
"x": 0,
"y": 0,
"w": 60,
"h": 8
}
],
"panes": [
{
"id": "pane5",
"type": "table",
"title": "品目ごとの所要量と内訳",
"sql": "SELECT 区分, 品目, 品目名, SUM(数量) AS 所要量, COUNT(*) AS 使う製品,\n GROUP_CONCAT(CONCAT(製品名, ' ', 数量) SEPARATOR ' / ') AS 製品別の内訳,\n CASE WHEN 区分 = '製品' THEN 1 WHEN 区分 = '中間品' THEN 2 ELSE 3 END AS 並び\n FROM LAPP_所要量内訳\n WHERE 計画月 = @m\n GROUP BY 区分, 品目, 品目名\n ORDER BY 並び, 品目",
"options": {
"columns": {
"区分": {
"width": 70
},
"品目": {
"width": 60
},
"品目名": {
"width": 140
},
"所要量": {
"width": 110,
"align": "right",
"bar": true,
"format": {
"kind": "number",
"thousandSep": true,
"decimals": 0
}
},
"使う製品": {
"width": 80,
"align": "right"
},
"製品別の内訳": {
"wrap": true
},
"並び": {
"hidden": true
}
},
"description": "製品の行は、その製品を作り始める数です(内訳はその製品自身)。中間品と部品の行は、どの製品のために何個要るかの内訳つきです。"
}
}
]
},
{
"id": "months",
"name": "月の比較",
"layout": [
{
"i": "pane6",
"x": 0,
"y": 0,
"w": 60,
"h": 8
}
],
"panes": [
{
"id": "pane6",
"type": "barH",
"title": "部品・材料の所要量(月の比較)",
"sql": "SELECT 品目名, 計画月, 所要量\n FROM LAPP_所要量\n WHERE 区分 = '部品'\n ORDER BY 品目, 計画月",
"options": {
"mapping": {
"x": "品目名",
"seriesKey": "計画月",
"value": "所要量"
},
"legend": "top",
"valueFormat": {
"thousandSep": true,
"decimals": 0
},
"description": "計算済みのすべての月を並べます(上の計画月の選択には連動しません)。"
}
}
]
}
],
"controls": [
{
"var": "m",
"type": "string",
"label": "計画月",
"optionsSql": "SELECT DISTINCT 計画月 FROM LAPP_所要量 ORDER BY 計画月 DESC",
"required": true,
"default": "2026-12"
}
]
},
"theme": "dark"
},
"deployOnSave": true,
"logicalApps": {
"所要量": 4416,
"所要量内訳": 4417,
"生産計画": 4415,
"部品表": 4414,
"品目": 4413
}
}
}
AI への頼み方
この事例も、AI(Claude Code)に作らせました。やりとりした依頼の文です。
所要量計算の結果が一覧だけではよくわからないので、dashboard でわかりやすく表示できる方法はあるか?
kact の結果を使って、dashboard にできるか?
B
グラフが画面に収まるように、タブで分けたらどうか?
メリハリをつけるため、dashboard のテーマをグレーにしてはどうか?
AI が出した案
| 読むアプリ | 見せられること | ボタンの変更 | |
|---|---|---|---|
| A. 今の結果だけ | 所要量 | 区分ごとの合計、部品ごとの所要量の棒、月の比較 | なし |
| B. 内訳も書く(おすすめ) | 所要量 + 所要量内訳(新しいアプリ) | A に加えて、製品ごとに色分けした積み上げ棒、製品別の内訳の表 | あり |
「B」と答えたので、ボタンの SQL を直して内訳も書く形にしました。
AI が自分で決めたこと
- ダッシュボードでは計算せず、ボタンが書いた結果だけを読む(決まりを 2 か所に持たない)
- 計算の状態(計算の後に元のデータが直されていないか)を置く
- 計画月の選択の候補は、所要量のアプリにある月から作る
作った後に AI がしたこと
- 所要量内訳のアプリを作り、ボタンの SQL を直して、SQL とは別の書き方の検算で、2 か月分の内訳がすべて一致することを確かめた
- ダッシュボードを取り込み、開いた直後に値が出ること、計画を直すと計算の状態が赤くなり、押し直すと戻ることを確かめた
- 計算の状態の実行計画を見て、部品表を全件読む書き方(最新の更新日時を探す)を、件数だけを聞く書き方に直した
- タブで分けた後、グラフの高さを 1 段下げて、小さめの画面でも目盛りまで収まるようにした
- 記事の講評(ChatGPT)を受けて、計算の状態に「計算結果がありません」と「合計が合いません」を足した。内訳の 1 行を書き換えたときと、確認の途中で取り消して所要量だけ書いたときに「合計が合いません」と出て、押し直すと戻ることを確かめた
途中で、ダッシュボードの選択肢の既定値を書かないと開いた直後が空になること、ダッシュボードのエンジンでは書けない形が 3 つあることが分かりました(上の「変えるところ」と「ダッシュボードの SQL」)。講評の後には、計算結果が無い月では計算の状態のペインがエラーで止まっていたことも分かり、直しました。
詳しい記事
- 所要量の計算そのもの: 事例: 所要量を計算する
- ボタンで集計して、ダッシュボードで見る: ⑤ 事例編(10 万件を集計して Dashboard Pro で見る)
- 押し忘れに気づく画面: ⑨ 締めの画面編
- ダッシュボードのプラグイン: rex0220 kSQL Dashboard Pro プラグイン
- 設定を AI に作ってもらう: ⑦ オーサリング編・⑫ オーサリング改善編
関連記事
機能ごとの記事: 概要 / ① 詳細画面 / ② 一覧 / ③ 集計 / ④ 運用 / ⑤ 事例 / ⑥ イベント / ⑦ オーサリング / ⑧ 請求データ / ⑨ 締めの画面 / ⑩ どこに出すか / ⑪ 多言語 / ⑫ オーサリング改善








