库存管理是MM模块应用中的重点,SAP中的收货、销售、盘点、调拨等操作都要直接影响到当前的库存。SAP提供了标准功能MB52用于对库存数量的查询,不过MB52的查询和数据展示功能有限,很多企业会开发额外的库存
报表
来实现对商品库存的查询。
商品库存报表概念
可用库存:也称为非限制使用的库存,表示当前仓库所存放的能进行分配的商品数量,不包括被某些单据预定的库存。
当前库存:也称为账面库存货实际库存,指SAP系统中的库存数据,账面库存理论上和实际库存一致,但是可能存在已经生成发货单但是还没有进行发货或者已经收货但还没有将收货单据进行过账等操作,造成当前库存和实际库存数据上存在差异。
在途库存:又称中转库存,指尚未到达目的地,正处于运输状态或等待运输状态而储备在运输工具中的库存。SAP中一般指已经生成发货订单但并未发生收货动作所占用的商品数量。
寄售库存:在很多企业,特别是一些销售型的企业,为了减少当前的库存积压,通常会委托第三方代为保管和销售产品,这些被委托产品的数量成为寄售库存。寄售库存也可以是供应商已经发货到本地仓库,但是财务上还未过账的商品。
期初库存:指在一个库存会计时期开始时,可供使用或出售的存货数量。
期末库存:指在一个库存会计时期结束时,可供使用或出售的货品、物资或原裁量的账面价值。
预约库存:到某一时期内,估计将存放在仓库的产品数目,例如预计补货但还未实际入仓的商品数量。
执行效果
主程序
商品库存报表概念
可用库存:也称为非限制使用的库存,表示当前仓库所存放的能进行分配的商品数量,不包括被某些单据预定的库存。
当前库存:也称为账面库存货实际库存,指SAP系统中的库存数据,账面库存理论上和实际库存一致,但是可能存在已经生成发货单但是还没有进行发货或者已经收货但还没有将收货单据进行过账等操作,造成当前库存和实际库存数据上存在差异。
在途库存:又称中转库存,指尚未到达目的地,正处于运输状态或等待运输状态而储备在运输工具中的库存。SAP中一般指已经生成发货订单但并未发生收货动作所占用的商品数量。
寄售库存:在很多企业,特别是一些销售型的企业,为了减少当前的库存积压,通常会委托第三方代为保管和销售产品,这些被委托产品的数量成为寄售库存。寄售库存也可以是供应商已经发货到本地仓库,但是财务上还未过账的商品。
期初库存:指在一个库存会计时期开始时,可供使用或出售的存货数量。
期末库存:指在一个库存会计时期结束时,可供使用或出售的货品、物资或原裁量的账面价值。
预约库存:到某一时期内,估计将存放在仓库的产品数目,例如预计补货但还未实际入仓的商品数量。
执行效果
主程序
- DATA:BEGIN OF lt_OUT OCCURS 0, "定义内表储存数据
- MATNR LIKE MARA-MATNR, "商品
- WERKS LIKE T001L-WERKS , "工厂
- NAME1 LIKE T001W-name1, "工厂名称
- LGORT LIKE MARD-LGORT, "库存地
- LABST LIKE MARD-LABST, "库存数量
- LABST_KY LIKE MARD-LABST, "可用库存
- MAKTX LIKE MAKT-MAKTX, "商品描述
- UMLMC LIKE MARC-UMLMC, "在途,中转库存
- TRAME LIKE MARC-TRAME, " 在途库存
- END OF lt_OUT.
- DATA:lt_OUT2 LIKE STANDARD TABLE OF lt_OUT WITH HEADER LINE.
- DATA:lt_OUT3 LIKE STANDARD TABLE OF lt_OUT WITH HEADER LINE.
-
-
-
- TABLES:MARC,MARD,T001L.
- SELECT-OPTIONS:S_WERKS FOR MARC-WERKS,
- S_LGORT FOR T001l-LGORT,
- S_matnr FOR marc-matnr.
-
- SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.
- ********************查询条件选择复选框*****************************
- PARAMETERS: KC_DQ AS CHECKBOX DEFAULT 'X' , "查看当前库存
- KC_ZT AS CHECKBOX, "查看在途库存
- KC_FLAG AS CHECKBOX, "是否包含寄售库存
- KC_KY AS CHECKBOX. "是否查看可用库存
- SELECTION-SCREEN END OF BLOCK 10.
-
-
-
-
- TYPE-POOLS:SLIS."定义一个类型池 /icons
-
-
- DATA: it_fieldcat TYPE SLIS_T_FIELDCAT_ALV,
-
-
- WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV, " 定义字段表 不过通常都会用一个宏来完成相应的功能
-
- * it_event type slis_t_event,
-
- it_LAYOUT TYPE SLIS_LAYOUT_ALV.
-
- IT_LAYOUT-colwidth_optimize = 'X'.
-
- START-OF-SELECTION.
- IF KC_FLAG = 'X'. "寄售,寄售库存是没有库位概念的
- SELECT MSKU~MATNR MSKU~WERKS MSKU~KULAB AS LABST MAKT~MAKTX "定义别名 ;MSKU 用户特殊库存
- INTO CORRESPONDING FIELDS OF TABLE lt_OUT
- FROM MSKU INNER JOIN MAKT ON MSKU~MATNR = MAKT~MATNR AND MAKT~SPRAS = SY-LANGU
- WHERE MSKU~MATNR IN S_MATNR
- AND MSKU~WERKS IN S_WERKS
- AND MSKU~SOBKZ = 'W'. "W类型 表示寄售
-
- IF SY-SUBRC = 0.
- lt_OUT-LGORT = '客户寄售'.
- MODIFY lt_OUT TRANSPORTING LGORT WHERE MATNR NE ''.
- ENDIF.
- ENDIF.
-
- IF KC_ZT = 'X'. "在途,在途库存是没有库位概念的
- SELECT MARC~MATNR MARC~WERKS MARC~UMLMC MARC~TRAME MAKT~MAKTX
- APPENDING CORRESPONDING FIELDS OF TABLE LT_OUT2
- FROM MARC
- INNER JOIN MAKT ON MARC~MATNR = MAKT~MATNR AND MAKT~SPRAS = SY-LANGU
- WHERE MARC~MATNR IN S_MATNR
- AND MARC~WERKS IN S_WERKS
- AND ( MARC~UMLMC NE 0 OR MARC~TRAME NE 0 ).
- ENDIF.
-
-
- IF NOT LT_OUT2[] IS INITIAL. "在途库存为 MSKU-UMLMC,MSKU-TRAME
- LOOP AT LT_OUT2.
- LT_OUT2-LGORT = '在途'.
- LT_OUT2-LABST = LT_OUT2-UMLMC + LT_OUT2-TRAME.
- MOVE-CORRESPONDING LT_OUT2 TO LT_OUT.
- APPEND LT_OUT.
- ENDLOOP.
- ENDIF.
-
-
- IF KC_DQ = 'X'. "当前库存
- SELECT MARD~MATNR MARD~WERKS MARD~LGORT MARD~LABST MAKT~MAKTX
- APPENDING CORRESPONDING FIELDS OF TABLE LT_OUT
- FROM MARD
- INNER JOIN MAKT ON MAKT~MATNR = MARD~MATNR AND MAKT~SPRAS = SY-LANGU
- WHERE MARD~MATNR IN S_MATNR
- AND MARD~WERKS IN S_WERKS
- AND MARD~LGORT IN S_LGORT
- AND MARD~LABST NE 0.
- ENDIF.
-
- *删除库存为零的商品
-
- DELETE LT_OUT WHERE LABST = 0.
-
- FIELD-SYMBOLS: <LT_OUT> LIKE LT_OUT."内部字段定义
-
- DATA: WMDVSX LIKE TABLE OF BAPIWMDVS,
- WMDVEX LIKE TABLE OF BAPIWMDVE WITH HEADER LINE.
-
-
- LOOP AT LT_OUT ASSIGNING <LT_OUT>.
-
- IF KC_KY = 'X'.
- REFRESH: WMDVSX,WMDVEX. "通过BAPI查询可用库存
-
- CALL FUNCTION 'BAPI_MATERIAL_AVAILABILITY' " 函数调用参数配置
- EXPORTING
- PLANT = <LT_OUT>-WERKS
- MATERIAL = <LT_OUT>-MATNR
- STGE_LOC = <LT_OUT>-LGORT
- UNIT = 'ST'
- TABLES
- WMDVSX = WMDVSX
- WMDVEX = WMDVEX.
- IF SY-SUBRC = 0.
- READ TABLE WMDVEX INDEX 1.
- <LT_OUT>-LABST_KY = WMDVEX-COM_QTY.
- ELSE.
- <LT_OUT>-LABST_KY = 0.
- ENDIF.
- ENDIF.
- ENDLOOP.
-
- *--> Poor performance.
- * LOOP AT LT_OUT WHERE NAME1 IS INITIAL. "在内表中维护地点名称
- * SELECT SINGLE NAME1 INTO LT_OUT-NAME1 FROM T001W
- * WHERE WERKS = LT_OUT-WERKS.
- * MODIFY LT_OUT TRANSPORTING NAME1 WHERE WERKS = LT_OUT-WERKS.
- * ENDLOOP.
- *-> select for all entries : internal table vs db
-
- IF LT_OUT[] IS NOT INITIAL.
- SELECT T001W~WERKS T001W~NAME1 "这里好像只能接from表里的字段 不能接内表里的字段
- INTO CORRESPONDING FIELDS OF TABLE LT_OUT3
- FROM T001W
- FOR ALL ENTRIES IN LT_OUT
- WHERE T001W~WERKS = LT_OUT-WERKS .
- ENDIF.
-
- SORT LT_OUT3 BY WERKS.
- LOOP AT LT_OUT.
- READ TABLE LT_OUT3 WITH KEY WERKS = LT_OUT-WERKS BINARY SEARCH.
- IF SY-SUBRC = 0.
- MODIFY LT_OUT FROM LT_OUT3 TRANSPORTING NAME1 WHERE WERKS = LT_OUT3-WERKS.
- ENDIF.
- ENDLOOP.
-
- END-OF-SELECTION.
-
-
- *初始化 ALV对象,输出内表数据
-
-
-
- DEFINE INITIAL_FIELD.
- WA_FIELDCAT-SELTEXT_L = &1.
- WA_FIELDCAT-SELTEXT_M = &1.
- WA_FIELDCAT-SELTEXT_S = &1.
- WA_FIELDCAT-FIELDNAME = &2.
- APPEND WA_FIELDCAT TO IT_FIELDCAT.
- END-OF-DEFINITION.
- *这是一个定义宏的语句,在DEFINE和END-OF-DEFINITION之间有完整的ABAP语句,用&N作为占位符,在调用的时候把真正的字符传入并取代。
- *功能与子程序类似,主要应用于同一程序中某些重复的运算,以简化代码
- *与子程序不同的是,宏通过&N接收传入参数,不需要定义接收参数的类型及格式。
- *宏只能被本程序中定义于宏后面的语句所调用,宏一般定义于程序最开始,而子程序则可以放在程序中的任意位置。
-
-
- initial_field '商品' 'MATNR'.
- initial_field '商品描述' 'MAKTX'.
- initial_field '地点' 'WERKS'.
- initial_field '地点名称' 'NAME1'.
- initial_field '库存' 'LGORT'.
- initial_field '库存数量' 'LABST'.
- initial_field '可用库存' 'LABST_KY'.
-
-
-
- *输出报表结果 LVC
-
- CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
- EXPORTING
- I_CALLBACK_PROGRAM = SY-REPID
- IS_LAYOUT = IT_LAYOUT
- IT_FIELDCAT = IT_FIELDCAT
- I_DEFAULT = 'X'
- TABLES
- T_OUTTAB = LT_OUT
- EXCEPTIONS
- PORGRAM_ERROR = 1
- OTHERS = 2.