BOM (部品表) とは・・・
BOM (部品表)
BOM(英: Bills of materials)とは、製造業で用いられる部品表の一形態である。製品を組み立てる時の部品の一覧と、場合によっては階層構造を表す。製品の見積もり時点から、設計、調達、製造、メンテナンスにまで利用され、多岐にわたる近年のものづくりにおいて、BOMは極めて重要である。
出典: フリー百科事典『ウィキペディア(Wikipedia)』
突然ですが、BOM表。
製造業、メーカー勤務の方、一度は耳にしたことがあるのでは?
基幹システムや部品構成システムを通して、BOM表を見ることは簡易にできますが、
BOM表×在庫やBOM表×入荷情報、BOM表×発注残情報といったトランザクションデータとの組み合わせで持って発注計画を立てたいと思うことも多いかと。
そこで今回はBOM表のビューを作成し、在庫データや入荷、発注残データと結合し、SQLでBOM表を作成する一連の流れをご紹介します。
流れは以下の通りです。
- SQLの再帰処理を用いてBOM表を作成(基礎編)
- SQLの再帰処理を用いてBOM表を作成(応用編)
の2部構成でBOMの世界に踏み込みたいと思います。
SQLの再帰処理を用いてBOM表を作成(基礎編)
まずは構成マスタは以下の通り
parent | child |
---|---|
null | 001 |
001 | 002 |
001 | 003 |
003 | 004 |
003 | 005 |
005 | 006 |
005 | 007 |
006 | 008 |
006 | 009 |
006 | 010 |
009 | 011 |
009 | 012 |
009 | 013 |
010 | 014 |
010 | 015 |
お次に上記の表の説明
ちなみにcreate tableはお見せするほどではないですが、
こんな感じです。
create table composition(
parent varchar(3)
,child varchar(3)
)
早速。
parent=親品番
child=子品番
構成として子品番001から見てみると
001の親品番はnull。こちらは最上位の完成形となるプロダクトとなります。要は配下の各構成品を組み立てると最終品番として001が出来上がるということ。
続けて見ていくと、001を構成する子品番は002と003。
さらに003を構成する子品番は004と005。001から見ると孫品番になるのように、曽孫品番、曽々孫品番のように階層がどんどん深くなります。
図にすると以下のようなイメージです。
これをSQLでどのように表すかを以下に記述していきます。
ここでは再帰処理というものを使っています。
今回はあくまでもTableauで使いやすいデータ構造を作成することを目的としているため、再帰処理の説明は割愛させていただきます。
詳細はこちらのサイトにて詳しく解説しております。ご参考に。
再帰の例: 部品表
部品表 (BOM) のアプリケーションは、多くの業務環境において一般的に必要になります。 BOM アプリケーションの再帰的共通表式の機能を示すため、部品とそれに関連する副部品、 そして各部品に必要な副部品の数量を示す表について考えてみます。
出典:IBM Knowledge Center
https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_10.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0059242.html
SQLは以下の通りになります。
with recursive rec_composition(level,parent,child,class,product)
as
(
select cast(1 as numeric) as level
,c.parent
,c.child
,cast(c.child as text) as class
,c.child as product
from composition c
where c.parent is null
union
select p.level + 1 as level
,c.parent
,c.child
,p.class || '->' || c.child as class
,cast(substring(p.class from 1 for 3) as varchar(3)) as product
from rec_composition p
inner join composition c
on p.child = c.parent
)
select level
,parent
,child
,class
,product
from rec_composition
order by product
,level
,parent
,child
細かい説明は別途させていただきます。
こちらを実行すると以下のような結果になります。
level | parent | child | class | product |
---|---|---|---|---|
1 | null | 001 | 001 | 001 |
2 | 001 | 002 | 001->002 | 001 |
2 | 001 | 003 | 001->003 | 001 |
3 | 003 | 004 | 001->003->004 | 001 |
3 | 003 | 005 | 001->003->005 | 001 |
4 | 005 | 006 | 001->003->005->006 | 001 |
4 | 005 | 007 | 001->003->005->007 | 001 |
5 | 006 | 008 | 001->003->005->006->008 | 001 |
5 | 006 | 009 | 001->003->005->006->009 | 001 |
5 | 006 | 010 | 001->003->005->006->010 | 001 |
6 | 009 | 011 | 001->003->005->006->009->011 | 001 |
6 | 009 | 012 | 001->003->005->006->009->012 | 001 |
6 | 009 | 013 | 001->003->005->006->009->013 | 001 |
6 | 010 | 014 | 001->003->005->006->010->014 | 001 |
6 | 010 | 015 | 001->003->005->006->010->015 | 001 |
それぞれの項目の説明をします。
項目 | 説明 |
---|---|
level | 階層の深さを意味します。 |
parent | 親品番。 |
child | 子品番。自身となります。 |
class | 階層の流れとなります。 |
product | 最終プロダクト。構成品グループとなります。 |
構成品マスタの構造にもよりますが、今回のマスタ情報では上記に挙げたようなSQLになりました。
改めてSQLの説明をいたします。
with recursive rec_composition(level,parent,child,class,product)
as
(
--非再帰。最終完成品の親品番のみ抽出
select cast(1 as numeric) as level --階層1で固定
,c.parent --nullが返ります
,c.child --自身です
,cast(c.child as text) as class --階層の流れです。自身です
,c.child as product --自身です。構成品グループとなります。
from composition c
where c.parent is null --ここでの構成品マスタのルールとして、最終完成品の親品番はnullです
union
--再帰。階層2以下を処理
select p.level + 1 as level --階層2以下をカウントアップ
,c.parent --親品番
,c.child --子品番
,p.class || '->' || c.child as class --非再帰の階層1から順に階層の流れを積み上げ
,cast(substring(p.class from 1 for 3) as varchar(3)) as product --構成品グループ。カッコ悪いですが、階層の流れの前3桁を取得。品番の桁数が統一されていない場合、lpad等で桁数を揃える
from rec_composition p
inner join composition c
on p.child = c.parent
)
--with句の内容を返す
select level
,parent
,child
,class
,product
from rec_composition
order by product
,level
,parent
,child
このようにSQLで書いてみると、そこまで複雑な構造にはなりませんので、比較的わかりやすいかと思います。
BOM以外にも組織の階層(どこの部→課→チームに所属しているか、など)にも使われますね。
あとは僕だけかもしれませんが、Tableau Serverのプロジェクトの階層(プロジェクト内プロジェクト、その中のビューやダッシュボード、データソースの格納状態がどのようになっているかのリスト)などでも使ったりしています。
機会あれば、Tableau Serverのリポジトリーにも触れたいと思います。
今回はここまでとします。
まずは構成品マスタから再帰SQLを用いて、BOM表として利用できるデータ構造への置き換えを行いました。
次回は続いて
SQLの再帰処理を用いてBOM表を作成(応用編)
の説明をしたく思います。
内容的には構成数や構成数による在庫データとの突き合わせの話になるかと思います。
では。