BAPI_MATPHYSINV_CREATE_MULT - Physical Inventory (MI01) Upload SAP Tool.
This upload Program can help you to mass upload physical inventory documents at one go. This program uses BAPI 'BAPI_MATPHYSINV_CREATE_MULT' to achieve the same.
CODE:
REPORT zmm_physical_inv_upload. " Physical Inventory Upload
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS p_fname TYPE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK blk1.
TYPES: BEGIN OF gty_doc,
doc_date TYPE sy-datum, " Document Date / Posting Date
werks TYPE werks_d, " Plant
lgort TYPE lgort_d, " Storage Location
post_block TYPE c, " Posting Block
spec_stock TYPE sobkz, " Special Stock Indicator
lifnr TYPE lifnr, " Vendor
matnr TYPE matnr, " Material No.
charg TYPE charg_d, " Batch
stock_type TYPE c, " Stock Type
key TYPE string, " Key
END OF gty_doc.
TYPES: BEGIN OF gty_log,
type TYPE bapi_mtype,
id TYPE symsgid,
number TYPE symsgno,
message TYPE bapi_msg,
werks TYPE werks_d,
lgort TYPE lgort_d,
spec_stock TYPE sobkz,
iblnr TYPE iblnr,
END OF gty_log.
DATA: lv_filename TYPE ibipparms-path.
DATA: gt_doc TYPE STANDARD TABLE OF gty_doc,
gt_items TYPE STANDARD TABLE OF bapi_physinv_create_items,
gt_log TYPE STANDARD TABLE OF gty_log.
DATA: gwa_doc TYPE gty_doc,
gwa_log TYPE gty_log,
gwa_items TYPE bapi_physinv_create_items,
gwa_header TYPE bapi_physinv_create_head.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
PERFORM p_f4_filename.
START-OF-SELECTION.
PERFORM p_uploadfile.
PERFORM p_processdata.
PERFORM p_displaylog.
*&---------------------------------------------------------------------*
*& Form P_F4_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_f4_filename .
CLEAR: lv_filename.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'P_FILE'
IMPORTING
file_name = lv_filename.
p_fname = lv_filename.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_UPLOADFILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_uploadfile .
DATA: gt_raw TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_field_seperator = 'X'
i_line_header = 'X'
i_tab_raw_data = gt_raw
i_filename = p_fname
TABLES
i_tab_converted_data = gt_doc
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e398(00) WITH TEXT-002.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_PROCESSDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_processdata .
DATA: gt_unique TYPE STANDARD TABLE OF gty_doc,
gwa_unique TYPE gty_doc.
SORT gt_doc BY werks lgort spec_stock lifnr matnr.
LOOP AT gt_doc ASSIGNING FIELD-SYMBOL(<fs_doc>).
CONCATENATE <fs_doc>-werks <fs_doc>-lgort
<fs_doc>-spec_stock <fs_doc>-lifnr
INTO <fs_doc>-key.
ENDLOOP.
gt_unique = gt_doc.
DELETE ADJACENT DUPLICATES FROM gt_unique COMPARING key.
SORT gt_doc BY key.
LOOP AT gt_unique INTO gwa_unique.
CLEAR: gwa_items,gt_items,gwa_header,gwa_doc.
gwa_header-plant = gwa_unique-werks.
gwa_header-stge_loc = gwa_unique-lgort.
gwa_header-doc_date = gwa_unique-doc_date.
gwa_header-plan_date = gwa_unique-doc_date.
gwa_header-post_block = gwa_unique-post_block.
gwa_header-spec_stock = gwa_unique-spec_stock.
IF gwa_unique-spec_stock IS NOT INITIAL AND gwa_unique-lifnr IS NOT INITIAL.
CLEAR: gwa_doc.
READ TABLE gt_doc INTO gwa_doc WITH KEY key = gwa_unique-key BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT gt_doc INTO gwa_doc FROM sy-tabix.
IF gwa_unique-key EQ gwa_doc-key.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-matnr
IMPORTING
output = gwa_items-material.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-lifnr
IMPORTING
output = gwa_items-vendor.
gwa_items-batch = gwa_doc-charg.
gwa_items-stock_type = 1.
APPEND gwa_items TO gt_items.
CLEAR: gwa_items.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
CLEAR: gwa_doc.
READ TABLE gt_doc INTO gwa_doc WITH KEY key = gwa_unique-key BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT gt_doc INTO gwa_doc FROM sy-tabix.
IF gwa_unique-key EQ gwa_doc-key.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-matnr
IMPORTING
output = gwa_items-material.
gwa_items-stock_type = gwa_doc-stock_type.
gwa_items-batch = gwa_doc-charg.
APPEND gwa_items TO gt_items.
CLEAR: gwa_items.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
PERFORM p_bapicall.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_BAPICALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_bapicall .
DATA: lt_return TYPE STANDARD TABLE OF bapiret2,
lwa_return TYPE bapiret2.
CALL FUNCTION 'BAPI_MATPHYSINV_CREATE_MULT'
EXPORTING
head = gwa_header
TABLES
items = gt_items
return = lt_return.
READ TABLE lt_return INTO lwa_return WITH KEY type = 'E'.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
LOOP AT lt_return INTO lwa_return.
gwa_log-type = lwa_return-type.
gwa_log-id = lwa_return-id.
gwa_log-number = lwa_return-number.
gwa_log-message = lwa_return-message.
gwa_log-lgort = gwa_header-stge_loc.
gwa_log-werks = gwa_header-plant.
gwa_log-spec_stock = gwa_header-spec_stock.
IF lwa_return-type = 'S' and lwa_return-id = 'M7' and lwa_return-number = '710'.
gwa_log-iblnr = lwa_return-message_v1.
ENDIF.
APPEND gwa_log TO gt_log.
CLEAR: lwa_return.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_DISPLAYLOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_displaylog .
CALL FUNCTION 'ZDISPLAY_ALV'
EXPORTING
i_title = 'Log Report'
i_program = sy-repid
TABLES
t_alv = gt_log.
ENDFORM.
CODE:
REPORT zmm_physical_inv_upload. " Physical Inventory Upload
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS p_fname TYPE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END OF BLOCK blk1.
TYPES: BEGIN OF gty_doc,
doc_date TYPE sy-datum, " Document Date / Posting Date
werks TYPE werks_d, " Plant
lgort TYPE lgort_d, " Storage Location
post_block TYPE c, " Posting Block
spec_stock TYPE sobkz, " Special Stock Indicator
lifnr TYPE lifnr, " Vendor
matnr TYPE matnr, " Material No.
charg TYPE charg_d, " Batch
stock_type TYPE c, " Stock Type
key TYPE string, " Key
END OF gty_doc.
TYPES: BEGIN OF gty_log,
type TYPE bapi_mtype,
id TYPE symsgid,
number TYPE symsgno,
message TYPE bapi_msg,
werks TYPE werks_d,
lgort TYPE lgort_d,
spec_stock TYPE sobkz,
iblnr TYPE iblnr,
END OF gty_log.
DATA: lv_filename TYPE ibipparms-path.
DATA: gt_doc TYPE STANDARD TABLE OF gty_doc,
gt_items TYPE STANDARD TABLE OF bapi_physinv_create_items,
gt_log TYPE STANDARD TABLE OF gty_log.
DATA: gwa_doc TYPE gty_doc,
gwa_log TYPE gty_log,
gwa_items TYPE bapi_physinv_create_items,
gwa_header TYPE bapi_physinv_create_head.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
PERFORM p_f4_filename.
START-OF-SELECTION.
PERFORM p_uploadfile.
PERFORM p_processdata.
PERFORM p_displaylog.
*&---------------------------------------------------------------------*
*& Form P_F4_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_f4_filename .
CLEAR: lv_filename.
CALL FUNCTION 'F4_FILENAME'
EXPORTING
program_name = syst-cprog
dynpro_number = syst-dynnr
field_name = 'P_FILE'
IMPORTING
file_name = lv_filename.
p_fname = lv_filename.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_UPLOADFILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_uploadfile .
DATA: gt_raw TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_field_seperator = 'X'
i_line_header = 'X'
i_tab_raw_data = gt_raw
i_filename = p_fname
TABLES
i_tab_converted_data = gt_doc
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e398(00) WITH TEXT-002.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_PROCESSDATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_processdata .
DATA: gt_unique TYPE STANDARD TABLE OF gty_doc,
gwa_unique TYPE gty_doc.
SORT gt_doc BY werks lgort spec_stock lifnr matnr.
LOOP AT gt_doc ASSIGNING FIELD-SYMBOL(<fs_doc>).
CONCATENATE <fs_doc>-werks <fs_doc>-lgort
<fs_doc>-spec_stock <fs_doc>-lifnr
INTO <fs_doc>-key.
ENDLOOP.
gt_unique = gt_doc.
DELETE ADJACENT DUPLICATES FROM gt_unique COMPARING key.
SORT gt_doc BY key.
LOOP AT gt_unique INTO gwa_unique.
CLEAR: gwa_items,gt_items,gwa_header,gwa_doc.
gwa_header-plant = gwa_unique-werks.
gwa_header-stge_loc = gwa_unique-lgort.
gwa_header-doc_date = gwa_unique-doc_date.
gwa_header-plan_date = gwa_unique-doc_date.
gwa_header-post_block = gwa_unique-post_block.
gwa_header-spec_stock = gwa_unique-spec_stock.
IF gwa_unique-spec_stock IS NOT INITIAL AND gwa_unique-lifnr IS NOT INITIAL.
CLEAR: gwa_doc.
READ TABLE gt_doc INTO gwa_doc WITH KEY key = gwa_unique-key BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT gt_doc INTO gwa_doc FROM sy-tabix.
IF gwa_unique-key EQ gwa_doc-key.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-matnr
IMPORTING
output = gwa_items-material.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-lifnr
IMPORTING
output = gwa_items-vendor.
gwa_items-batch = gwa_doc-charg.
gwa_items-stock_type = 1.
APPEND gwa_items TO gt_items.
CLEAR: gwa_items.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
CLEAR: gwa_doc.
READ TABLE gt_doc INTO gwa_doc WITH KEY key = gwa_unique-key BINARY SEARCH.
IF sy-subrc EQ 0.
LOOP AT gt_doc INTO gwa_doc FROM sy-tabix.
IF gwa_unique-key EQ gwa_doc-key.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gwa_doc-matnr
IMPORTING
output = gwa_items-material.
gwa_items-stock_type = gwa_doc-stock_type.
gwa_items-batch = gwa_doc-charg.
APPEND gwa_items TO gt_items.
CLEAR: gwa_items.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
PERFORM p_bapicall.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_BAPICALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_bapicall .
DATA: lt_return TYPE STANDARD TABLE OF bapiret2,
lwa_return TYPE bapiret2.
CALL FUNCTION 'BAPI_MATPHYSINV_CREATE_MULT'
EXPORTING
head = gwa_header
TABLES
items = gt_items
return = lt_return.
READ TABLE lt_return INTO lwa_return WITH KEY type = 'E'.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
LOOP AT lt_return INTO lwa_return.
gwa_log-type = lwa_return-type.
gwa_log-id = lwa_return-id.
gwa_log-number = lwa_return-number.
gwa_log-message = lwa_return-message.
gwa_log-lgort = gwa_header-stge_loc.
gwa_log-werks = gwa_header-plant.
gwa_log-spec_stock = gwa_header-spec_stock.
IF lwa_return-type = 'S' and lwa_return-id = 'M7' and lwa_return-number = '710'.
gwa_log-iblnr = lwa_return-message_v1.
ENDIF.
APPEND gwa_log TO gt_log.
CLEAR: lwa_return.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form P_DISPLAYLOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM p_displaylog .
CALL FUNCTION 'ZDISPLAY_ALV'
EXPORTING
i_title = 'Log Report'
i_program = sy-repid
TABLES
t_alv = gt_log.
ENDFORM.