在PowerBI中以后进先出规则计算出入库核对表

后进先出(LIFO)是库存管理中常用的计价方法之一,特别适用于物价波动较大的环境。本篇文章将介绍如何在PowerBI中实现基于后进先出规则的出入库核对表计算,帮助财务和供应链管理人员准确核算库存成本。

问题描述

按后进先出规则,找出各产品出库时所用的入库批次以及对应的出库数量。例如:对于出库编号为3的200件出库产品来说,其出库时的剩余库存情况为:入库编号1:剩500,入库编号2:剩90…,按后进先出,因此先使用入库编号2的90,然后不够的110则由之前入库编号1剩下的500中出库。

具体问题如下图所示:

本案例的初始数据如下:

入库:

入库日期入库编号入库产品入库总数
2022年9月1日1ID011000
2022年9月11日2ID01200
2022年10月10日3ID0150
2022年10月11日4ID011000
2022年10月1日5ID0220
2022年10月11日6ID02100

出库:

出库日期出库编号出库产品出库总数
2022年9月10日1ID01500
2022年9月11日2ID01110
2022年9月30日3ID01200
2022年10月1日4ID01100
2022年10月10日5ID01200
2022年10月20日6ID01230
2022年10月21日7ID02100

若需其它辅助表等,可自行创建并建模。

解题要点

在本案例中需要注意的是,查找某个产品出库时所用的入库批次以及对应的出库数量时,必须要考虑到在前面出库的产品对库存的影响,否则计算结果将不正确,而这也是本案例的难点。

由于思路较复杂且难以描述,因此请直接从下文查看给出的示例答案来理解。

解决方案

首先,数据模型如下图所示:

然后,创建如下度量值:

本次出库数量 = 
MAXX(
    OFFSET(
        0,
        GENERATEALL(
            '出库',
            VAR TotalOutStock = '出库'[出库总数]
            VAR CurDate_Out = '出库'[出库日期]
            VAR CurProduct_Out = '出库'[出库产品]
            VAR vTb1 = FILTER(ALL('入库'),'入库'[入库日期]<=CurDate_Out && '入库'[入库产品]=CurProduct_Out)
            VAR vTb2 = 
                ADDCOLUMNS(
                    vTb1,
                    "CumRemaining",
                        VAR CurDate_In = '入库'[入库日期]
                        VAR CumInventory = SUMX(FILTER(vTb1,'入库'[入库日期]>=CurDate_In),'入库'[入库总数])
                        VAR CumOutStock = 
                            SUMX(
                                FILTER(
                                    ALL('出库'),
                                    '出库'[出库产品]=CurProduct_Out && '出库'[出库日期]>=CurDate_In && '出库'[出库日期]<CurDate_Out
                                ),
                                '出库'[出库总数]
                            )
                        RETURN
                        MAX(CumInventory-CumOutStock,0)
                )
            VAR vTb3 = 
                FILTER(
                    vTb2,
                    VAR CurDate_In = '入库'[入库日期]
                    VAR MaxCumRemaining = MAXX(FILTER(vTb2,'入库'[入库日期]>CurDate_In),[CumRemaining])
                    RETURN
                    AND(
                        AND(
                            [CumRemaining]>0,
                            OR(
                                [CumRemaining]>MAXX(TOPN(1,vTb2,'入库'[入库日期]),[CumRemaining]),
                                '入库'[入库日期]=MAXX(vTb2,'入库'[入库日期])
                            )
                        ),
                        [CumRemaining]>MaxCumRemaining
                    )
                )
            VAR vTb4 = 
                FILTER(
                    ADDCOLUMNS(
                        vTb3,
                        "OutStock",
                            VAR CurDate = '入库'[入库日期]
                            VAR CumRemaining = [CumRemaining]
                            VAR PreCumRemaining = MAXX(TOPN(1,FILTER(vTb3,'入库'[入库日期]>CurDate),'入库'[入库日期],1),[CumRemaining])
                            RETURN
                            IF(TotalOutStock>PreCumRemaining,MIN(CumRemaining-PreCumRemaining,TotalOutStock-PreCumRemaining))
                    ),
                    [OutStock]>0
                )
            RETURN
            SUMMARIZE(vTb4,'入库'[入库编号],[OutStock])
        ),
        MATCHBY('入库'[入库编号])
    ),
    [OutStock]
)	

然后创建一个矩阵,并将出库表中的所有字段以及入库表的入库编号字段一起作为行标签,再将上面的度量值放入矩阵的值字段即可,如下图所示:

总结

以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论,或者加入我们的技术交流群,一起享受这种思维碰撞的快乐吧!

PBI/DAX技术交流群(QQ):344353627

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PowerBI | 夕枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值