ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 671|回复: 9

[求助] power query 先进先出结果错误

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-7-20 15:06 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 欢乐马666789 于 2022-7-20 15:19 编辑

写法如下,是套的大佬分享:

let
    源 = Excel.CurrentWorkbook(){[Name="先进先出"]}[Content],
    分组 = Table.Group(源,"产品",{"a",each _}),
    fx = (l,t)=>List.Accumulate(l,
                [a={},b=0] ,
                (s,c)=>if t<c+s
                        then [a=s[a]&{List.Max({t-s,0})},b=s+c]
                        else [a=s[a]&{c},b=s+c]
          )[a],
    结果 = Table.Combine(List.Transform(分组[a],
                each Table.FromColumns(
                        Table.ToColumns(_)&{fx([收入数量],[期末数量]{0})},
                        Table.ColumnNames(_)&{"分配"})
          ))
in
    结果



目前问题是入库数明细中有负数的存在,导致结果异常,从想要的结果来说,只需要第一行就行了
image.png
看各位老师能不能指导修改下公式
image.png

TA的精华主题

TA的得分主题

发表于 2022-7-20 17:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
上附件,凭一张图猜不见源数据。

TA的精华主题

TA的得分主题

发表于 2022-7-20 23:43 来自手机 | 显示全部楼层
即使没有负值,按你写的这些代码也不能得出结果,大佬的代码让你改成这样了

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-21 09:07 | 显示全部楼层
windgod489 发表于 2022-7-20 17:38
上附件,凭一张图猜不见源数据。

附件上不了,垃圾公司的所有表格都加密了~这种数据走解密流程不可能的~

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-21 09:10 | 显示全部楼层
roserice 发表于 2022-7-20 23:43
即使没有负值,按你写的这些代码也不能得出结果,大佬的代码让你改成这样了

数据是出了结果的,其他的物料代码都是对的~~只有这个中间有负数的错了

TA的精华主题

TA的得分主题

发表于 2022-7-21 09:30 | 显示全部楼层
图片里正值的也不对啊,2019-7-1,分配了1个,8-1分配两个,我的理解你这个是错误的, 不是先进先出吗

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-21 15:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
其他的物料代码是正确的,就这个因为中间有负数的入库,所以结果不正确,对公司需要修改下,但是我无从下手


物料代码        入库日期        入库数量        期末库存
A        2022-7-20        5        5
A        2022-6-20        -5        5
A        2022-5-20        3        5
B        2022-4-20        3        7
B        2022-3-20        3        7
B        2022-2-20        2        7




上面是数据源,转为为超级表后上载,处理逻辑如下:

let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    分组 = Table.Group(源,"物料代码",{"a",each _}),
    fx = (l,t)=>List.Accumulate(l,
                [a={},b=0] ,
                (s,c)=>if t<c+s
                        then [a=s[a]&{List.Max({t-s,0})},b=s+c]
                        else [a=s[a]&{c},b=s+c]
          )[a],
    结果 = Table.Combine(List.Transform(分组[a],
                each Table.FromColumns(
                        Table.ToColumns(_)&{fx([入库数量],[期末库存]{0})},
                        Table.ColumnNames(_)&{"分配"})
          ))
in
    结果



处理结果如下:
image.png
image.png
image.png
image.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-7-21 15:20 | 显示全部楼层
roserice 发表于 2022-7-21 09:30
图片里正值的也不对啊,2019-7-1,分配了1个,8-1分配两个,我的理解你这个是错误的, 不是先进先出吗

逻辑是这样的,先进的先出了,库存剩余的就从日期最靠近今天的往前排序分配

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-5 11:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
改好了,在大佬的基础上加了几个逻辑,删除第一次出现累计=期末库存之后的所有行
,按物料代码聚合之后是我自己摸索写的,之前是抄的大佬的
let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    分组 = Table.Group(源,"物料代码",{"a",each _}),
     fx = (l,t)=>List.Accumulate(l,
                [a={},b=0] ,
                (s,c)=>if t<c+s
                        then [a=s[a]&{List.Max({t-s,0})},b=s+c]
                        else [a=s[a]&{c},b=s+c]
          )[a],
    结果 = Table.Combine(List.Transform(分组[a],
                each Table.FromColumns(
                        Table.ToColumns(_)&{fx([入库数量],[期末库存]{0})},
                        Table.ColumnNames(_)&{"分配"})
          )),
    按物料代码聚合 = Table.Group(结果,"物料代码",{"D",each _}),
    遍历添加索引 = Table.TransformColumns(按物料代码聚合,{"D",(x)=>Table.AddIndexColumn(x,"索引",1,1)}),
    遍历累加 = Table.TransformColumns(遍历添加索引,{"D",(y)=>Table.AddColumn(y,"累计",each List.Sum(Table.SelectRows(y,(x)=>x[索引]<=[索引])[分配]),type number)}),
    /*1.求出第一次出现[累计]=[期末库存]的下标+1
        2.以1作为筛选条件,对表格进行遍历筛选,删除不需要的记录行
    */
    删除出现负数导致的不符合的行 = Table.TransformColumns(遍历累加,{"D",(y)=>Table.SelectRows(y,(x)=>x[索引]<=List.PositionOf(y[累计],y[期末库存]{0})+1)}),
    展开 = Table.ExpandTableColumn(删除出现负数导致的不符合的行, "D", {"入库日期", "入库数量", "期末库存", "分配", "索引", "累计"})
in
    展开

image.png

TA的精华主题

TA的得分主题

发表于 2022-9-2 15:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
欢乐马666789 发表于 2022-8-5 11:49
改好了,在大佬的基础上加了几个逻辑,删除第一次出现累计=期末库存之后的所有行
,按物料代码聚合之后是 ...

刷新过程卡不卡呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-6-9 19:39 , Processed in 0.037861 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表