zoukankan      html  css  js  c++  java
  • SAP 取月度期初库存和月度期末库存(历史库存)

    mard里记载的是当前库存的数量,但是期间并不一定是当月。比如你物料4月一整月都没有库存数量变化(没收没发),那么5月初你看mard里的条目期间数还是4月而非5月。
    当某个期间发生货物移动的时候,系统在更新mard数据的之前(这个表是实时更新的),会检查此笔业务过账期间和mard里对应记录的期间是否一致,也就是看这是不是本期间第一笔移动。如果是,copy表mard里对应记录到mardh,然后把mard记录改成当期(也可能是先删后建),然后再作更新数量数据的操作。如果不是第一笔记录,也就是mard期间和mseg期间一致,则不作copy记录只更新mard数量。

    这样处理貌似减少了冗余数据,不过给编程取历史库存增加了很大的工作量,个人觉得不算明智之举。
    库存方面的表
    mbew  --当前库存
    mbewh  --历史库存

    EBEWH  --销售订单库存的评估:历史

    mard--查主库存
    mardh--主库存历史记录
    mslb--特殊库存O
    mkol--特殊库存K/M
    mska--特殊库存E
    msku--特殊库存V/W
    mcha
    mchb 

    有很多人在做库存进销存的时候,感觉期初库存和期末库存比较难搞定,感觉要去取货物移动的数据来获取期初库存和期末库存,其实不然,只要理解原理就可以快速取出期初库存和期末库存

    库存表:MARDH MARD MSKUH MSKU MSLBH MSLB MSKAH MSKA

    下面以MARDH MARD为例,如果一个物料在2011年9月份做了一笔货物移动,则会自动在MARDH中更新2011年8月份的期末库存,假如在2011年9月份一直没有做货物移动,则不会更新MARDH中8月份的期末库存

    假如我想获得2011年7月份的库存,则需要先在MARH中查找7月份的库存,找不到找8月份的库存,找不到找9月份的库存,以此类推,最后都找不到,则用MARD中的库存

    * 下面代码为获取8月份的期初库存和8月份的期末库存

    PARAMETERS:
    * 会计年度
      p_gjahr  LIKE bkpf-gjahr OBLIGATORY DEFAULT '2011',
    * 期间
      p_monat  LIKE bkpf-monat OBLIGATORY DEFAULT '08'.

    DATA:
      v_gjahr  LIKE bkpf-gjahr,    " 上月期间年度
      v_monat  LIKE bkpf-monat.   " 上月期间月份

    * 获取上月度年度和月份
      IF p_monat = '01'.
        v_monat = '12'.
        v_gjahr = p_gjahr - 1.
      ELSE.
        v_monat = p_monat - 1.
        v_gjahr = p_gjahr.
      ENDIF.

      DATA: BEGIN OF typ_mardh,
            p_string(6) TYPE c.
              INCLUDE STRUCTURE mardh .
      DATA: END OF typ_mardh.
      DATA: i_mardh LIKE TABLE OF typ_mardh WITH HEADER LINE.     " 期末数据
      DATA: n_mardh LIKE TABLE OF typ_mardh WITH HEADER LINE.     " 当前库存
      DATA: m_mardh LIKE TABLE OF typ_mardh WITH HEADER LINE.     " 上月期初数据

    * 查找库存历史表
      SELECT   *

        FROM mardh
        INTO CORRESPONDING FIELDS OF TABLE m_mardh
       WHERE ( lfgja > v_gjahr OR ( lfgja = v_gjahr AND lfmon >= v_monat ) ).

      LOOP AT m_mardh .
        CONCATENATE m_mardh-lfgja m_mardh-lfmon INTO m_mardh-p_string .
        MODIFY m_mardh .
        IF m_mardh-p_string >= p_estring .
          MOVE-CORRESPONDING m_mardh TO i_mardh.
          APPEND i_mardh .
        ENDIF.
      ENDLOOP.

      SELECT   *

        FROM mard
        INTO CORRESPONDING FIELDS OF TABLE n_mardh .

      LOOP AT n_mardh .
        CONCATENATE n_mardh-lfgja n_mardh-lfmon INTO n_mardh-p_string .
        MODIFY n_mardh .
        MOVE-CORRESPONDING n_mardh TO m_mardh.
        APPEND m_mardh .
        MOVE-CORRESPONDING n_mardh TO i_mardh.
        APPEND i_mardh .
      ENDLOOP.

    * 期初库存都在表M_MARDH

      SORT m_mardh BY matnr werks lgort lfgja lfmon .
      DELETE ADJACENT DUPLICATES FROM m_mardh COMPARING matnr werks lgort.

    * 期末库存都在表I_MARDH
      SORT i_mardh BY matnr werks lgort lfgja lfmon .
      DELETE ADJACENT DUPLICATES FROM i_mardh COMPARING matnr werks lgort.

    下面在获取数据的时候,直接可以READ TABLE ........  BINARY SEARCH .


    原文:https://blog.csdn.net/champaignwolf/article/details/85272463

  • 相关阅读:
    Java NIO使用及原理分析(二)(转)
    Java NIO使用及原理分析 (一)(转)
    虚拟机字节码执行引擎
    虚拟机类加载机制
    浅析Java中的final关键字
    java内存模型7-处理器内存模型
    java内存模型6-final
    最小生成树
    有向图的基本算法
    并查集(Union-Find)算法介绍
  • 原文地址:https://www.cnblogs.com/psapfans/p/10477803.html
Copyright © 2011-2022 走看看