博客:www.jiaopengzi.com

焦棚子的文章目录

请点击下载附件

一背景

前面写过了一个关于进销存的案例,留一个话题就是先进先出的库存计算。

刚好有朋友提了相关这样的需求。先来看看效果。


效果图

说明:

1、按照先进先出的原则,计算库存的库龄结构,如效果图。

2、特别说明下先进先出,即先入库产品先出库,从而有了库龄。

3、工作中更多会用批次来管理,案例中没有批次,需要写出库龄结构是有些绕。

4、感谢q友阳光岁月提供数据素材。

二、数据源

1、data

原始脱敏数据,大约6万多条,其中数据是erp导出的,需要清洗。

2、维度表:品号

3、日期表

4、事实表:入库

5、事实表:出库

6、关系

7、注意

这个数据里面没有期初库存,即入库汇总即库存总和。

三、上dax

1、入库

入库:=SUM('入库'[入库数量])

2、出库

出库:=SUM('出库'[出库数量])

3、库存

库存:=IF ( '入库'[入库] - '出库'[出库] = 0, BLANK (), '入库'[入库] - '出库'[出库] )

4、库龄0_30

库龄0_30:=
VAR MIND =
FIRSTDATE ( '日期表'[日期] )
VAR X = 0
VAR Y = 30
VAR MAXD =
FIRSTDATE ( DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY ) )
VAR LD =
LASTDATE ( DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY ) )
VAR CURT =
DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY )
VAR T1 =
DATESBETWEEN ( '日期表'[日期], MIND, MAXD )
VAR T2 =
DATESBETWEEN ( '日期表'[日期], MIND, LD )
VAR KC1 =
CALCULATE ( '入库'[入库], T1 )
VAR KCN =
CALCULATE ( '入库'[入库], CURT )
VAR KCA =
CALCULATE ( '入库'[入库], T2 )
VAR CK = '出库'[出库]
VAR RS1 = KC1 - CK
VAR RS2 = KCA - CK
VAR RS =
SWITCH ( TRUE (), RS1 > 0, KCN, RS2 > 0, RS2, BLANK () )
VAR RST =
SUMX (
SUMMARIZECOLUMNS (
'品号'[品号],
'品号',
"T", SWITCH (
TRUE (),
CALCULATE ( '入库'[入库], T1 ) - '出库'[出库]
> 0, CALCULATE ( '入库'[入库], CURT ),
CALCULATE ( '入库'[入库], T2 ) - '出库'[出库]
> 0, CALCULATE ( '入库'[入库], T2 ) - '出库'[出库],
BLANK ()
)
),
[T]
)
RETURN
IF ( ISFILTERED ( '品号'[品号] ), RS, RST )

5、库龄30_60,库龄60_90,库龄90_180,库龄180_360,库龄360以上几个逻辑都是一样,只是参数X,Y不一样;如下图。

6、库龄360以上

由于本案例数据只有2018年以后的数据,所以Y参数(见下图)需要特殊处理下

库龄360以上:=
VAR MIND =
FIRSTDATE ( '日期表'[日期] )
VAR X = 360
VAR Y =
DATEDIFF ( MIND, TODAY () - 360, DAY )
VAR MAXD =
FIRSTDATE ( DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY ) )
VAR LD =
LASTDATE ( DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY ) )
VAR CURT =
DATESINPERIOD ( '日期表'[日期], TODAY () - X, - Y, DAY )
VAR T1 =
DATESBETWEEN ( '日期表'[日期], MIND, MAXD )
VAR T2 =
DATESBETWEEN ( '日期表'[日期], MIND, LD )
VAR KC1 =
CALCULATE ( '入库'[入库], T1 )
VAR KCN =
CALCULATE ( '入库'[入库], CURT )
VAR KCA =
CALCULATE ( '入库'[入库], T2 )
VAR CK = '出库'[出库]
VAR RS1 = KC1 - CK
VAR RS2 = KCA - CK
VAR RS =
SWITCH ( TRUE (), RS1 > 0, KCN, RS2 > 0, RS2, BLANK () )
VAR RST =
SUMX (
SUMMARIZECOLUMNS (
'品号'[品号],
'品号',
"T", SWITCH (
TRUE (),
CALCULATE ( '入库'[入库], T1 ) - '出库'[出库]
> 0, CALCULATE ( '入库'[入库], CURT ),
CALCULATE ( '入库'[入库], T2 ) - '出库'[出库]
> 0, CALCULATE ( '入库'[入库], T2 ) - '出库'[出库],
BLANK ()
)
),
[T]
)
RETURN
IF ( ISFILTERED ( '品号'[品号] ), RS, RST )

库龄360以上,参数Y特殊处理。

四、总结

1、老样子业务逻辑转换dax上下文;

2、案例中先进先出运用的是累计计算的思路;

3、案例中总计行需要单独写,使用SUMMARIZECOLUMNS(office2013之前版本请使用SUMMARIZE)聚合,搭配迭代函数SUMX计算。

SUMMARIZECOLUMNS function (DAX)

附注:


原始数据异常导致

异常数据

本来想把异常数据删掉的,后来想想就留着吧,有兴趣的朋友可以实际操作看看。

注意:

数据动态用的是today来写的,拿到附件以后,得出来的结果和截图自然不一样,如果需要验证,把电脑日期回调至2019年1月13日即可。

by 焦棚子

焦棚子的文章目录

116_Power Pivot 先进先出原则库龄库存计算相关的更多相关文章

  1. 【MM系列】SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解   第一篇 ...

  2. 【MM系列】SAP SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解   ...

  3. SAP库龄表

    &---------------------------------------------------------------------* *& Report ZFIR005 *& ...

  4. 用友ERP T6技术解析(六) 库龄分析

    2.4 库存管理   2.4.1 库龄分析 介绍:库存账龄是在某时间节点,某种或某类存货的库存时间的加权平均值,跟库存周转率关系明显,库存周转率越高,库存账龄越低,可是二者又不是反比关系.不能简单把库 ...

  5. Odoo:全球第一免费开源ERP库龄表的简单实现方法(无需二开)

    问题背景 希望查看库龄超过30天的货物,该如何实现?此种简单数据查询需要二开吗? 解决方案 方法一:Stock Quant列表视图增加过滤器 <filter string="库龄超30 ...

  6. 通过IP地址和子网掩码与运算计算相关地址

    通过IP地址和子网掩码与运算计算相关地址 知道IP地址和子网掩码后可以算出 网络地址 广播地址 地址范围 本网有几台主机 例一:下面例子IP地址为192.168.100.5 子网掩码是255.255. ...

  7. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  8. PHP用mb_string函数库处理与windows相关中文字符

    昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件 ...

  9. java IO选择流的原则及其与IO流相关类的关系

    1 按照用途进行分类 1.1 按照数据的来源(去向)分类 是文件:FileInputStream, FileOutputStream, FileReader, FileWriter 是byte[]:B ...

随机推荐

  1. 51单片机头文件reg51.h详解

    转自:http://www.51hei.com/mcu/2670.html 我们在用c语言编程时往往第一行就是头文件,51单片机为reg51.h或reg52.h,51单片机相对来说比较简单,头文件里面 ...

  2. 一整套PCB设计流程和要点,老板再也不怕我出错!

    资料输入阶段 1. 在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件) 2. 确认PCB模板是最新的 3. 确 ...

  3. Struts2-向值栈中存放数据

    1.第一种 获取值栈对象,调用值栈对象里面的set方法(该方法添加的是一个Map集合) //第一种方式,使用值栈对象获取对象里面的set方法 //1.获取值栈对象 ActionContext cont ...

  4. JDK7u21反序列链学习

    JDK7u21 1.前置知识 jdk7u21是一条不依赖CommonsCollections库依赖的,看利用链所有知识其实跟CommonsCollections也有重复,我们来学习一下以前没学过的类或 ...

  5. Java应用工程结构

    分层的本质是关注点分离,隔离对下层的变化,可以简化复杂性,使得层次结构更加清晰. 1. 主流分层结构介绍 目前业界存在两种主流的应用工程结构:一种是阿里推出的<Java开发手册>中推荐的, ...

  6. vue--vuex 中 Modules 详解

    前言 在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理.于是Vuex中就存在了另 ...

  7. 手撸一个虚拟DOM,不错

    大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...

  8. JS_简单的效果-鼠标移动、点击、定位元素、修改颜色等

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  9. Linux根目录下各文件目录的作用

    bin        用户二进制可执行文件    boot        系统启动引导文件    dev[device]        系统中使用的外部设备,但不是放的外部设备的驱动.一个访问这些外部 ...

  10. js 前端实现下拉刷新 上拉加载

    效果 css html,body{ height:100%; // 其他界面未设置html 无法监听scroll } /* 下拉刷新 */ .refresh-loading { transition: ...