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 への頼み方は畳んであります(開くと読めます)。機能ごとの説明は、末尾の「関連記事」にある概要と ①〜⑫ の記事にまとめてあります。

やりたいこと

前の事例で、生産計画から部品や材料の所要量を計算し、所要量のアプリに品目ごとの行を作りました。ただ、一覧に 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 段になります(消す行が無い段は出ません)。

確認のダイアログ(ステップ 3 / 4。所要量内訳に 52 件 追加または更新)

2026-12 は、所要量 24 件と所要量内訳 52 件で、合計 76 件です。完了のメッセージは「追加 0 / 更新 76 / 削除 0、6 秒」でした(2 回目からの数です。初めて押したときは、内訳の 52 件が追加になります)。

  • 内訳は、2026-12 の 52 行、2027-01 の 48 行のすべてが、SQL とは別の書き方で計算した値と一致しました。製品ごとの数を品目ごとに足すと、所要量のアプリの値と同じになります。

自分のアプリで使うとき

事例: 所要量を計算するの 4 つのアプリとボタンができていることが前提です。そこに 3 つ足します。

  1. 所要量内訳のアプリを作る。 項目は下の「使うアプリと項目」のとおりです。
  2. ボタンの SQL を差し替える。 ボタンの設定の論理アプリに「所要量内訳」を足し、SQL を下の「SQL の全文(ボタン)」に置き換えます。
  3. 所要量のアプリに kSQL Dashboard Pro を入れ、設定ファイルを取り込む。 下の「ダッシュボードの設定ファイル」をファイルに保存し、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」)。講評の後には、計算結果が無い月では計算の状態のペインがエラーで止まっていたことも分かり、直しました。

詳しい記事

関連記事

機能ごとの記事: 概要 / ① 詳細画面 / ② 一覧 / ③ 集計 / ④ 運用 / ⑤ 事例 / ⑥ イベント / ⑦ オーサリング / ⑧ 請求データ / ⑨ 締めの画面 / ⑩ どこに出すか / ⑪ 多言語 / ⑫ オーサリング改善

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?