BOM拆分这个问题并不是须要马上投入实用的问题,只是要在学习PQFANS中看到这个,然后以前在计算成本时,须要得到每个成品的所有零部件,于时借助这个机会想如何实现. 由于功力不够,只能用最笨的办法,好在群里热心大神多,帮助解决了这个问题.
thymethy 兄弟采用两种方式实现了我最初的要求, 而 shaowu459 这位兄弟则采用了更加通用化的代码,具有扩展性, 不过也因此让我产生了能不能再修改一下更具通用性.于是我在 shaowu459 兄弟代码的基础上作了适当优化. 可以实现更加复杂一点的情况.
比如原本只能实现 "上级+下级+数量"这样的情况.
现在则可以实现"上级编码+上级名称+下级编码+下级名称+数量", 只要上级列数与下级列数相同,还可以扩展.且做成了自定义函数形式,只须要把表格名称作为参数调用即可!现把代码贴上.
(bom as table)=>
let
//Source = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
toRows = Table.ToRows(bom), //行列表
toCols = Table.ToColumns(bom),//列列表
clna=Table.ColumnNames(bom), //表头
clct=Table.ColumnCount(bom), //列数
codcd=(clct-1)/2, //子编码开始数
fx=(z)=>
List.Transform(z,each
if List.PositionOf(toCols{0},_{codcd})>-1
then List.Combine(@fx(List.Transform(List.Select(toRows,(x)=>x{0}=_{codcd}),
(y)=>List.TransformMany({{_,y}},
(a)=>{0..(clct-1)},
(m,n)=> if n = clct-1
then m{0}{n} * m{1}{n}
else if n < codcd
then m{0}{n}
else m{1}{n}))))
// {_{0},_{1},
// y{2},y{3},
// y{clct-1}*_{clct-1}})))
else
{_}
),
res = List.Combine(fx(toRows)),
tab = #table(clna,res),
hz = Table.Group(tab, List.Range(clna,0,clct-1), {{"数量", each List.Sum(Table.ToColumns(_){clct-1}), type number}})
in
hz
108251114174320.rar
(40.16 KB, 下载次数: 0)
|