2024年4月7日发(作者:)
BOM
树形结构分解
题目:
BOM(Bill of Material)
即物料清单,用于辅助企业生产管理,要求根据父件需求数逐级分解为子件数量。
比如生产
1
个
a
需要
3
个
b
,生产
1
个
b
需要
4
个
c
,生产
1
个
c
需要
2
个
d
,现需要生产
5
个
a
问需要多少个
d
?
解法:
以上面
abcd
为例,按照常规思维,我要知道
5
个
a
需要多少个
d
,那显然应该从第一级依次往下一步步分解。
现在共
4
个层级,先找出第一级
a
,然后根据
a
算
b
,再根据
b
算
c
,再根据
c
算
d
,整个过程我用
4
个字来形容叫做
"
顺藤摸瓜
"
。
那么回到题目中,第一步肯定还是先要筛选出第一层级,筛选
[
父件名称
]
列包含
"
产品
"
的行即可,然后新增一列
[path]
用于记录分
解过程。
这样一级就找到了,下面开始找二级,哪些是二级的呢?这一步至关重要,这里理解了后面都好理解。
二级的条件就是,既属于刚才筛选出的一级表中的
[
子件型号
]
,又属于源数据表中的
[
父件型号
]
,必须是上有老下还有小,也就
是两列的交集,可以通过合并查询中的
"
内部
"
连接方式筛选出来。
每筛选完一个层级,就把之前的分解过程记录在
[path]
中,然后继续找下一级,一直重复下去。
但是这么无限重复下去何时是尽头呢?题目中最大层级深度为
6
,当到了第六级,此时
[
子件型号
]
全部都是原料,源数据中没有
任何行的父件是原料,所以如果再筛选第七级得到的是个空表,于是停止重复。
最后把每一级的筛选表合并,再根据
[path]
中的记录即可得到如图所示的分解过程和分解数量。
题目是做出来了,但显然这么做太傻了,如果层级有几十上百个,那得写很长很长。
上面逐级查找下一级的过程,都是机械而重复的,所以可以用一个循环来代替,循环终止的条件是合并表后行数为
0
,那就是
while
循环,也就是
te
。
let
源
= tWorkbook(){[Name="
表
1"]}[Content],
筛选一级
= Rows(
源
, each ns([
父件名称
], "
产品
")),
构建
table = umn(
筛选一级
, "path", each #table({"
型号
","
数量
"},{{[
父件型号
],[
数量
]}})),
循环
= e(te(()=>
构建
table,
each nt(_) > 0,
each [
a = Join(
源
,{"
父件型号
"},_,{"
子件型号
"},"a",),
b = TableColumn(a, "a", {"path"}, {"
上一级
path"}),
c = umn(b,"path", each e({[
上一级
path], #table({"
型号
", "
数量
"}, {{[
子件型号
],
][c]
)),
分解过程
= umn(
循环
, "
分解过程
", each e([path][
型号
],"->")),
分解数量
= umn(
分解过程
, "
分解数量
", each t([path][
数量
])),
删除多余列
= Columns(
分解数量
,{"path", "
上一级
path"})
in
删除多余列
在附件中我用笨方法把每一级拆解下来,方便对照着一步步理解,具体看附件吧。
附件
BOM
树形结构分解
(26 kB)
发布者:admin,转转请注明出处:http://www.yc00.com/web/1712480118a2067131.html
评论列表(0条)