SAP 的库存种类有很多中取数逻辑,这里整理下,汇总成的一个接口函数。
库存类型和对应表
| 库存类型 | 当前库存 | 历史库存 | 库存金额 | 库存历史金额 |
|---|---|---|---|---|
| 工厂级别库存 | MARC & MBEW | MARCH | MBEW | MBEWH |
| 库存地点库存 | MARD | MARDH | MBEW | MBEWH |
| 批次库存 | MCHB | MCHBH | MBEW | MBEWH |
| 销售订单库存 | MSKA | MSKAH | EBEW | EBEWH |
| 项目库存 | MSPR | MSPRH | QBEW | QBEWH |
| 供应商寄售库存 | MKOL | MKOLH | MBEW | MBEWH |
| 供应商外包库存 | MSLB | MSLBH | MBEW | MBEWH |
| 客户寄售库存 | MSKU | MSKUH | MBEW | MBEWH |
MBEW:按照物料+工厂记录物料在工厂下的数量和金额。
MBWEH:记录历史库存,按照物料+工厂+月份记录物料特定月份在工厂下的数量和金额。
相关的特殊库存标识
K:寄售库存
O:委外加工库存(分包)
E:销售订单库存
Q:项目库存
获取库存函数
FUNCTION zwi_get_stock.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(PLANT) TYPE WERKS_D
*" VALUE(MATERIAL) TYPE MATNR
*" VALUE(UNIT) TYPE MEINH
*" VALUE(STGE_LOC) TYPE LGORT_D
*" VALUE(BATCH) TYPE CHARG_D OPTIONAL
*" VALUE(VBELN) TYPE VBELN OPTIONAL
*" VALUE(POSNR) TYPE POSNR_BI OPTIONAL
*" VALUE(STOCK_TYPE) TYPE CHAR2 OPTIONAL
*" EXPORTING
*" VALUE(AV_QTY_PLT) TYPE MNG01
*" TABLES
*" E_RETURN STRUCTURE BAPIRET2
*"----------------------------------------------------------------------
DATA: ls_mara TYPE mara,
ls_mchb TYPE mchb,
ls_mard TYPE mard,
ls_mska TYPE mska,
ls_mspr TYPE mspr.
DATA: menge_ur TYPE mng01. "Valuated Unrestricted-Use Stock"
DATA: menge_qi TYPE mng01. "Stock in Quality Inspection"
DATA: menge_blocked TYPE mng01. "Blocked Stock"
DATA: menge_return TYPE mng01. "Stock Result"
CLEAR: ls_mara.
SELECT SINGLE matnr meins xchpf
INTO (ls_mara-matnr, ls_mara-meins, ls_mara-xchpf)
FROM mara
WHERE matnr = material.
IF ls_mara-xchpf = 'X'. "Get batch management stock"
CLEAR: ls_mchb.
SELECT SINGLE clabs cinsm cspem
INTO (ls_mchb-clabs,ls_mchb-cinsm,ls_mchb-cspem)
FROM mchb
WHERE werks = plant
AND matnr = material
AND lgort = stge_loc
AND charg = batch.
IF sy-subrc = 0.
menge_ur = ls_mchb-clabs.
menge_qi = ls_mchb-cinsm.
menge_blocked = ls_mchb-cspem.
ENDIF.
"Get project stock"
SELECT SINGLE prlab prins prspe
INTO (ls_mspr-prlab,ls_mspr-prins,ls_mspr-prspe)
FROM mspr
WHERE werks = plant
AND matnr = material
AND lgort = stge_loc
AND charg = batch.
IF sy-subrc EQ 0 .
menge_ur = ls_mspr-prlab.
menge_qi = ls_mspr-prins.
menge_blocked = ls_mspr-prspe.
ENDIF.
ELSE.
"Get non-batch management stock"
CLEAR: ls_mard.
SELECT SINGLE labst insme speme
INTO (ls_mard-labst,ls_mard-insme,ls_mard-speme)
FROM mard
WHERE werks = plant
AND matnr = material
AND lgort = stge_loc.
IF sy-subrc = 0.
menge_ur = ls_mard-labst.
menge_qi = ls_mard-insme.
menge_blocked = ls_mard-speme.
ENDIF.
ENDIF.
"Sales order stock"
IF vbeln IS NOT INITIAL.
SELECT SINGLE kalab kains kaspe
INTO (ls_mska-kalab,ls_mska-kains,ls_mska-kaspe)
FROM mska
WHERE matnr = material
AND werks = plant
AND lgort = stge_loc
AND charg = batch
AND vbeln = vbeln
AND posnr = posnr.
IF sy-subrc = 0.
menge_ur = ls_mska-kalab.
menge_qi = ls_mska-kains.
menge_blocked = ls_mska-kaspe.
ENDIF.
ENDIF.
IF STOCK_TYPE IS INITIAL.
menge_return = menge_ur. "UR Stock"
ELSEIF STOCK_TYPE EQ 'QI'.
menge_return = menge_qi. "QI Stock"
ELSEIF STOCK_TYPE EQ 'BK'.
megne_return = menge_blocked. "Blocked Stock"
ENDIF.
CLEAR: menge_return.
IF ls_mara-meins <> unit.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
i_matnr = material
i_in_me = ls_mara-meins
i_out_me = unit
i_menge = menge_return
IMPORTING
e_menge = av_qty_plt
EXCEPTIONS
error_in_application = 1
error = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO e_return-message.
e_return-type = 'E'.
RETURN.
ENDIF.
ELSE.
av_qty_plt = menge_return.
ENDIF.
ENDFUNCTION.