二维码

MM模块库存明细查询报表

Twilight发表于 2014-01-25 17:20zhongguomao 最后回复于 2017-08-12 13:59 [复制链接] 8459 1

库存管理是MM模块应用中的重点,SAP中的收货、销售、盘点、调拨等操作都要直接影响到当前的库存。SAP提供了标准功能MB52用于对库存数量的查询,不过MB52的查询和数据展示功能有限,很多企业会开发额外的库存报表来实现对商品库存的查询。

商品库存报表概念
可用库存:也称为非限制使用的库存,表示当前仓库所存放的能进行分配的商品数量,不包括被某些单据预定的库存。
当前库存:也称为账面库存货实际库存,指SAP系统中的库存数据,账面库存理论上和实际库存一致,但是可能存在已经生成发货单但是还没有进行发货或者已经收货但还没有将收货单据进行过账等操作,造成当前库存和实际库存数据上存在差异。
在途库存:又称中转库存,指尚未到达目的地,正处于运输状态或等待运输状态而储备在运输工具中的库存。SAP中一般指已经生成发货订单但并未发生收货动作所占用的商品数量。
寄售库存:在很多企业,特别是一些销售型的企业,为了减少当前的库存积压,通常会委托第三方代为保管和销售产品,这些被委托产品的数量成为寄售库存。寄售库存也可以是供应商已经发货到本地仓库,但是财务上还未过账的商品。
期初库存:指在一个库存会计时期开始时,可供使用或出售的存货数量。
期末库存:指在一个库存会计时期结束时,可供使用或出售的货品、物资或原裁量的账面价值。
预约库存:到某一时期内,估计将存放在仓库的产品数目,例如预计补货但还未实际入仓的商品数量。


执行效果
stock of materical.jpg
库存查询 bapi2.jpg
库存查询 bapi3.jpg

主程序
  1. DATA:BEGIN OF lt_OUT OCCURS 0,   "定义内表储存数据
  2.   MATNR LIKE MARA-MATNR, "商品
  3.   WERKS LIKE T001L-WERKS , "工厂
  4.   NAME1 LIKE T001W-name1, "工厂名称
  5.   LGORT LIKE MARD-LGORT, "库存地
  6.   LABST LIKE MARD-LABST, "库存数量
  7.   LABST_KY LIKE MARD-LABST, "可用库存
  8.   MAKTX LIKE MAKT-MAKTX, "商品描述
  9.   UMLMC LIKE MARC-UMLMC, "在途,中转库存
  10.   TRAME LIKE MARC-TRAME, " 在途库存
  11. END OF lt_OUT.
  12. DATA:lt_OUT2 LIKE STANDARD TABLE OF lt_OUT WITH HEADER LINE.
  13. DATA:lt_OUT3 LIKE STANDARD TABLE OF lt_OUT WITH HEADER LINE.



  14. TABLES:MARC,MARD,T001L.
  15. SELECT-OPTIONS:S_WERKS FOR MARC-WERKS,
  16.                 S_LGORT FOR T001l-LGORT,
  17.                 S_matnr FOR marc-matnr.

  18. SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.
  19. ********************查询条件选择复选框*****************************
  20. PARAMETERS: KC_DQ AS CHECKBOX DEFAULT 'X' , "查看当前库存
  21.             KC_ZT AS CHECKBOX,              "查看在途库存
  22.             KC_FLAG AS CHECKBOX,            "是否包含寄售库存
  23.             KC_KY AS CHECKBOX.              "是否查看可用库存
  24. SELECTION-SCREEN END OF BLOCK 10.




  25. TYPE-POOLS:SLIS."定义一个类型池 /icons


  26. DATA: it_fieldcat TYPE SLIS_T_FIELDCAT_ALV,


  27.       WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV,  "  定义字段表   不过通常都会用一个宏来完成相应的功能

  28. *     it_event     type slis_t_event,

  29.      it_LAYOUT    TYPE SLIS_LAYOUT_ALV.

  30. IT_LAYOUT-colwidth_optimize = 'X'.

  31. START-OF-SELECTION.
  32.    IF KC_FLAG = 'X'.               "寄售,寄售库存是没有库位概念的
  33.     SELECT MSKU~MATNR  MSKU~WERKS MSKU~KULAB AS LABST MAKT~MAKTX "定义别名 ;MSKU 用户特殊库存
  34.       INTO CORRESPONDING FIELDS OF TABLE lt_OUT
  35.       FROM MSKU INNER JOIN MAKT ON MSKU~MATNR = MAKT~MATNR AND  MAKT~SPRAS = SY-LANGU
  36.       WHERE MSKU~MATNR IN S_MATNR
  37.       AND MSKU~WERKS IN S_WERKS
  38.       AND MSKU~SOBKZ = 'W'. "W类型  表示寄售

  39.       IF SY-SUBRC = 0.
  40.         lt_OUT-LGORT = '客户寄售'.
  41.         MODIFY lt_OUT TRANSPORTING LGORT WHERE MATNR NE ''.
  42.         ENDIF.
  43.         ENDIF.

  44.       IF KC_ZT = 'X'.  "在途,在途库存是没有库位概念的
  45.         SELECT MARC~MATNR MARC~WERKS MARC~UMLMC MARC~TRAME MAKT~MAKTX
  46.           APPENDING CORRESPONDING FIELDS OF TABLE LT_OUT2
  47.           FROM MARC
  48.             INNER JOIN MAKT ON MARC~MATNR = MAKT~MATNR AND  MAKT~SPRAS = SY-LANGU
  49.           WHERE MARC~MATNR IN S_MATNR
  50.             AND MARC~WERKS IN S_WERKS
  51.             AND ( MARC~UMLMC NE 0 OR MARC~TRAME NE 0 ).
  52.           ENDIF.


  53.           IF NOT LT_OUT2[] IS INITIAL.   "在途库存为 MSKU-UMLMC,MSKU-TRAME
  54.            LOOP AT LT_OUT2.
  55.              LT_OUT2-LGORT = '在途'.
  56.              LT_OUT2-LABST = LT_OUT2-UMLMC + LT_OUT2-TRAME.
  57.              MOVE-CORRESPONDING LT_OUT2 TO LT_OUT.
  58.              APPEND LT_OUT.
  59.              ENDLOOP.
  60.              ENDIF.


  61.              IF KC_DQ = 'X'.    "当前库存
  62.                SELECT MARD~MATNR MARD~WERKS MARD~LGORT MARD~LABST MAKT~MAKTX
  63.                  APPENDING CORRESPONDING FIELDS OF TABLE LT_OUT
  64.                  FROM MARD
  65.                   INNER JOIN MAKT ON MAKT~MATNR = MARD~MATNR AND  MAKT~SPRAS = SY-LANGU
  66.                  WHERE MARD~MATNR IN S_MATNR
  67.                    AND MARD~WERKS IN S_WERKS
  68.                    AND MARD~LGORT IN S_LGORT
  69.                    AND MARD~LABST NE 0.
  70.              ENDIF.

  71. *删除库存为零的商品

  72.              DELETE LT_OUT WHERE LABST = 0.

  73.              FIELD-SYMBOLS: <LT_OUT> LIKE LT_OUT."内部字段定义

  74.              DATA: WMDVSX LIKE TABLE OF BAPIWMDVS,
  75.                    WMDVEX LIKE TABLE OF BAPIWMDVE WITH HEADER LINE.


  76.              LOOP AT LT_OUT ASSIGNING <LT_OUT>.

  77.                IF KC_KY = 'X'.
  78.                  REFRESH: WMDVSX,WMDVEX.    "通过BAPI查询可用库存

  79.                  CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY'  " 函数调用参数配置
  80.                     EXPORTING
  81.                       PLANT  = <LT_OUT>-WERKS
  82.                       MATERIAL = <LT_OUT>-MATNR
  83.                       STGE_LOC = <LT_OUT>-LGORT
  84.                       UNIT     = 'ST'
  85.                     TABLES
  86.                       WMDVSX   = WMDVSX
  87.                       WMDVEX   = WMDVEX.
  88.                IF SY-SUBRC = 0.
  89.                  READ TABLE WMDVEX INDEX 1.
  90.                  <LT_OUT>-LABST_KY = WMDVEX-COM_QTY.
  91.                  ELSE.
  92.                    <LT_OUT>-LABST_KY = 0.
  93.                    ENDIF.
  94.                 ENDIF.
  95.                 ENDLOOP.

  96. *--> Poor performance.
  97. *                LOOP AT LT_OUT WHERE NAME1 IS INITIAL.   "在内表中维护地点名称
  98. *                  SELECT SINGLE NAME1 INTO LT_OUT-NAME1 FROM T001W
  99. *                    WHERE WERKS = LT_OUT-WERKS.
  100. *                    MODIFY LT_OUT TRANSPORTING NAME1 WHERE WERKS = LT_OUT-WERKS.
  101. *                ENDLOOP.
  102. *-> select for all entries : internal table vs db

  103.                IF LT_OUT[] IS NOT INITIAL.
  104.                SELECT T001W~WERKS T001W~NAME1     "这里好像只能接from表里的字段  不能接内表里的字段
  105.                  INTO CORRESPONDING FIELDS OF TABLE LT_OUT3
  106.                  FROM T001W
  107.                  FOR ALL ENTRIES IN LT_OUT
  108.                  WHERE T001W~WERKS = LT_OUT-WERKS .
  109.                ENDIF.

  110.                SORT LT_OUT3 BY WERKS.
  111.                LOOP AT LT_OUT.
  112.                  READ TABLE LT_OUT3 WITH  KEY WERKS = LT_OUT-WERKS BINARY SEARCH.
  113.                  IF SY-SUBRC = 0.
  114.                      MODIFY LT_OUT FROM LT_OUT3 TRANSPORTING NAME1 WHERE WERKS = LT_OUT3-WERKS.
  115.                  ENDIF.
  116.                ENDLOOP.

  117. END-OF-SELECTION.


  118. *初始化 ALV对象,输出内表数据



  119.                  DEFINE INITIAL_FIELD.
  120.                    WA_FIELDCAT-SELTEXT_L = &1.
  121.                    WA_FIELDCAT-SELTEXT_M = &1.
  122.                    WA_FIELDCAT-SELTEXT_S = &1.
  123.                    WA_FIELDCAT-FIELDNAME = &2.
  124.                    APPEND WA_FIELDCAT TO IT_FIELDCAT.
  125.                  END-OF-DEFINITION.
  126. *这是一个定义宏的语句,在DEFINE和END-OF-DEFINITION之间有完整的ABAP语句,用&N作为占位符,在调用的时候把真正的字符传入并取代。
  127. *功能与子程序类似,主要应用于同一程序中某些重复的运算,以简化代码
  128. *与子程序不同的是,宏通过&N接收传入参数,不需要定义接收参数的类型及格式。
  129. *宏只能被本程序中定义于宏后面的语句所调用,宏一般定义于程序最开始,而子程序则可以放在程序中的任意位置。


  130.                  initial_field  '商品' 'MATNR'.
  131.                  initial_field  '商品描述' 'MAKTX'.
  132.                  initial_field  '地点' 'WERKS'.
  133.                  initial_field  '地点名称' 'NAME1'.
  134.                  initial_field  '库存' 'LGORT'.
  135.                  initial_field  '库存数量' 'LABST'.
  136.                  initial_field   '可用库存' 'LABST_KY'.



  137. *输出报表结果 LVC

  138.                  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  139.                    EXPORTING
  140.                      I_CALLBACK_PROGRAM = SY-REPID
  141.                      IS_LAYOUT          = IT_LAYOUT
  142.                      IT_FIELDCAT        = IT_FIELDCAT
  143.                      I_DEFAULT         = 'X'
  144.                    TABLES
  145.                      T_OUTTAB          = LT_OUT
  146.                    EXCEPTIONS
  147.                      PORGRAM_ERROR     = 1
  148.                      OTHERS            = 2.
复制代码
回复

使用道具 举报

zhongguomao
这个没有实际意义,现在更多的是需要展示期间库存收发及金额。
回复 支持 反对

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

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