PowerQuery技巧之BOM树形结构分解

PowerQuery技巧之BOM树形结构分解


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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信