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(  ).

Comments are closed.

Post Navigation