SAP的一般盘点单创建使用的事务码是MI01,此事务码只能单个输入进行创建,在实时的时候,很多企业都会使用自开发程序来批量创建盘点单,以满足符合本企业盘点的程序
SAP的盘点过程分为三个步骤:
1、 创建盘点单;
2、 输入盘点结果
3、 盘点单差异过账
这三个步骤对应了三个不同的BAPI,
1、 盘点单创建— BAPI_MATPHYSINV_CREATE_MULT
2、 盘点结果录入— BAPI_MATPHYSINV_COUNT
3、 盘点单差异过账— BAPI_MATPHYSINV_POSTDIFF
一些公司为了简化流程,会将这三个步骤简化成两步:创建盘点、盘点结果录入和过账合并成一步
盘点单的底表为:IKPF 和 ISEG
BAPI_MATPHYSINV_CREATE_MULT的实现过程如下:
DATA:ls_head TYPE bapi_physinv_create_head. DATA:lt_items TYPE STANDARD TABLE OF bapi_physinv_create_items. DATA:ls_items TYPE bapi_physinv_create_items. DATA:lt_return TYPE STANDARD TABLE OF bapiret2 . DATA:ls_return TYPE bapiret2 . ls_head-plant = '2001'. "工厂 ls_head-stge_loc = '1001'."库位 ls_head-spec_stock = ' '. "库存类型(销售库存E) ls_head-doc_date = '20250529'. "盘点创建日期 ls_head-plan_date = '20250529'. "计划盘点日期 ls_head-freezebookinv = 'X'. "冻结账面库存 ls_items-material = '10000020'. "物料 ls_items-stock_type = '1'. "库存属性:非限制行库存 "LS_ITEMS-SALES_ORD = ''. 盘点E库存时填写销售单 "LS_ITEMS-S_ORD_ITEM = ''. 盘点E库存时填写销售单行项目 APPEND ls_items TO lt_items. CLEAR ls_items. ls_items-material = '10000056'."物料 ls_items-stock_type = '1'."库存属性:非限制行库存 "LS_ITEMS-SALES_ORD = ''. 盘点E库存时填写销售单 "LS_ITEMS-S_ORD_ITEM = ''. 盘点E库存时填写销售单行项目 APPEND ls_items TO lt_items. DATA lv_message TYPE string. CALL FUNCTION 'BAPI_MATPHYSINV_CREATE_MULT' EXPORTING head = ls_head * MAXITEMS = TABLES items = lt_items return = lt_return. READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0 . CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return INTO ls_return WHERE type = 'E'. CONCATENATE lv_message ls_return-message ',' INTO lv_message. ENDLOOP. ELSE. "提交并 盘点凭证数量 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. cl_demo_output=>write( LS_HEAD ). "抬头状态信息 cl_demo_output=>write( LT_ITEMS ). " cl_demo_output=>write( lt_return ). cl_demo_output=>write( LV_MESSAGE ). cl_demo_output=>display( ).
BAPI_MATPHYSINV_COUNT的实现过程如下:
TABLES :ikpf. DATA: lv_IBLNR TYPE ikpf-iblnr, lv_gjahr TYPE ikpf-gjahr, lv_ZLDAT TYPE ikpf-zldat. DATA lv_message TYPE string. DATA lv_message2 TYPE string. DATA:lt_items TYPE STANDARD TABLE OF bapi_physinv_count_items. DATA:ls_items TYPE bapi_physinv_count_items. DATA:lt_return TYPE STANDARD TABLE OF bapiret2 . DATA:ls_return TYPE bapiret2 . lv_iblnr = '0100000119'. lv_gjahr = '2025'. lv_zldat = '20250605'. ls_items-item = '1'. ls_items-material = '10008842'. ls_items-entry_qnt = 100 . ls_items-entry_uom = 'DR' . APPEND ls_items TO lt_items. "盘零库存 CLEAR ls_items. ls_items-item = '2'. ls_items-material = '10008844'. ls_items-entry_uom = 'DR' . ls_items-zero_count = 'X'. APPEND ls_items TO lt_items. CALL FUNCTION 'BAPI_MATPHYSINV_COUNT' EXPORTING physinventory = lv_IBLNR fiscalyear = lv_gjahr * PERCENTAGE_VARIANCE = count_date = lv_ZLDAT TABLES items = lt_items return = lt_return * SERIALNUMBERS = * EXTENSIONIN = * ITEMS_CWM = . READ TABLE lt_return INTO ls_return WITH KEY type = 'E'. IF sy-subrc = 0 . CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT lt_return INTO ls_return WHERE type = 'E'. CONCATENATE lv_message ls_return-message ',' INTO lv_message. ENDLOOP. ELSE. "提交并 盘点凭证数量 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. *cl_demo_output=>write( LS_HEAD ). "抬头状态信息 cl_demo_output=>write( lt_items ). " cl_demo_output=>write( lt_return ). cl_demo_output=>write( LV_MESSAGE ). cl_demo_output=>display( ).
BAPI_MATPHYSINV_POSTDIFF的实现过程如下:
DATA: lv_IBLNR TYPE ikpf-iblnr, lv_gjahr TYPE ikpf-gjahr, lv_ZLDAT TYPE ikpf-zldat. DATA lv_message TYPE string. DATA lv_message2 TYPE string. DATA:LT_ITEMS2 TYPE STANDARD TABLE OF BAPI_PHYSINV_POST_ITEMS. DATA:LS_ITEMS2 TYPE BAPI_PHYSINV_POST_ITEMS. DATA:LT_RETURN2 TYPE STANDARD TABLE OF BAPIRET2 . DATA:LS_RETURN2 TYPE BAPIRET2 . lv_iblnr = '0100000119'. lv_gjahr = '2025'. lv_zldat = '20250605'. LS_ITEMS2-ITEM = '1'. LS_ITEMS2-MATERIAL = '10008842'. APPEND LS_ITEMS2 TO LT_ITEMS2. CLEAR LS_ITEMS2. LS_ITEMS2-ITEM = '2'. LS_ITEMS2-MATERIAL = '10008844'. APPEND LS_ITEMS2 TO LT_ITEMS2. CALL FUNCTION 'BAPI_MATPHYSINV_POSTDIFF' EXPORTING physinventory = lv_iblnr fiscalyear = lv_gjahr PSTNG_DATE = lv_zldat * THRESHOLD_VALUE = TABLES ITEMS = LT_ITEMS2 return = LT_RETURN2 . READ TABLE LT_RETURN2 INTO LS_RETURN2 WITH KEY TYPE = 'E'. IF SY-SUBRC = 0 . CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' . LOOP AT LT_RETURN2 INTO LS_RETURN2 WHERE TYPE = 'E'. CONCATENATE LV_MESSAGE2 LS_RETURN2-MESSAGE ',' INTO LV_MESSAGE2. ENDLOOP. ELSE. "提交并 盘点凭证数量 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = 'X'. ENDIF. cl_demo_output=>write( LT_ITEMS2 ). " cl_demo_output=>write( lt_return2 ). cl_demo_output=>write( LV_MESSAGE2 ). cl_demo_output=>display( ).