前两天吃中饭时同事说MR21修改价格用LSMW导入,每次只能导入一条商品价格,而每一个商品价格的修改都会产生一个凭证,问是否能批量导入。先去找了下BAPI,看了下BAPI_MATVAL_PRICE_CHANGE和BAPI_M_REVAL_CREATEPRICECHANGE两个BAPI,发现前一个每次只能修改一个商品价格,后一个根本就跑不起来,不知道咋回事,只能回头用SHDB解决问题。
REPORT zmr21
NO STANDARD PAGE HEADING LINE-SIZE 255.
INCLUDE bdcrecx1.
PARAMETERS: dataset(132) LOWER CASE.
*** DO NOT CHANGE - the generated data section - DO NOT CHANGE ***
*
* If it is nessesary to change the data section use the rules:
* 1.) Each definition of a field exists of two lines
* 2.) The first line shows exactly the comment
* '* data element: ' followed with the data element
* which describes the field.
* If you don't have a data element use the
* comment without a data element name
* 3.) The second line shows the fieldname of the
* structure, the fieldname must consist of
* a fieldname and optional the character '_' and
* three numbers and the field length in brackets
* 4.) Each field must be type C.
*
*** Generated data section with specific formatting - DO NOT CHANGE ***
DATA: BEGIN OF record OCCURS 0,
* data element: BUDAT
budat_001(010),
* data element: BUKRS
bukrs_002(004),
* data element: WERKS_D
werks_003(004),
* data element: SCREEN_VARIANT
screen_variant_004(030),
* data element: SCREEN_VARIANT
screen_variant_005(030),
* data element: MATNR
matnr_01_006(018),
* data element: VALPR
newvalpr_01_007(015),
END OF record.
*** End generated data section ***
START-OF-SELECTION.
* PERFORM open_dataset USING dataset.
PERFORM of_getexcel.
PERFORM open_group.
PERFORM of_processdata.
PERFORM close_group.
* PERFORM close_dataset USING dataset.
FORM of_processdata.
DATA: li_cur TYPE i VALUE 0,
li_mod TYPE i,
ls_fname(30) TYPE c,
ls_temp(2) TYPE c,
li_len TYPE i,
li_inex TYPE i VALUE 0.
li_mod = LINES( record ).
break ypcheng.
LOOP AT record.
li_cur = li_cur + 1.
li_inex = li_inex + 1.
IF li_inex = 1.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
PERFORM bdc_field USING 'BDC_CURSOR' 'MR21HEAD-WERKS'.
PERFORM bdc_field USING 'MR21HEAD-BUDAT' record-budat_001.
PERFORM bdc_field USING 'MR21HEAD-BUKRS' record-bukrs_002.
PERFORM bdc_field USING 'MR21HEAD-WERKS' record-werks_003.
ENDIF.
MOVE li_cur TO ls_temp.
li_len = STRLEN( ls_temp ).
IF li_len = 1.
CONCATENATE '0' ls_temp INTO ls_temp.
ENDIF.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'.
PERFORM bdc_field USING 'MR21HEAD-SCREEN_VARIANT' 'MR21_LAGERMATERIAL_0250'.
CONCATENATE 'CKI_MR21_0250-MATNR(' ls_temp ')' INTO ls_fname.
PERFORM bdc_field USING ls_fname record-matnr_01_006.
CONCATENATE 'CKI_MR21_0250-NEWVALPR(' ls_temp ')' INTO ls_fname.
PERFORM bdc_field USING ls_fname record-newvalpr_01_007.
li_mod = li_cur MOD 9.
IF li_mod = 0.
CLEAR li_cur.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
PERFORM bdc_field USING 'BDC_OKCODE' '=DOWN'.
ENDIF.
ENDLOOP.
PERFORM bdc_dynpro USING 'SAPRCKM_MR21' '0201'.
PERFORM bdc_field USING 'BDC_OKCODE' '=SAVE'.
PERFORM bdc_transaction USING 'MR21'.
ENDFORM. "of_processdata
*&---------------------------------------------------------------------*
*& Form of_getexcel
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM of_getexcel.
DATA: filenm TYPE rlgrap-filename VALUE 'e:\mr21.xls'.
FIELD-SYMBOLS: <fs1>.
DATA: BEGIN OF iexcel OCCURS 0.
INCLUDE STRUCTURE alsmex_tabline.
DATA: END OF iexcel.
DATA: ls_colname TYPE string,
li_currow TYPE i.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = filenm
i_begin_col = 1
i_begin_row = 1
i_end_col = 14
i_end_row = 30000
TABLES
intern = iexcel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
WRITE: / 'EXCEL UPLOAD FAILED ', filenm, sy-subrc.
ELSE.
SORT iexcel BY row col.
DELETE iexcel WHERE row = '0001'.
LOOP AT iexcel.
CASE iexcel-col.
WHEN '0001'.
record-budat_001 = iexcel-value.
WHEN '0002'.
record-bukrs_002 = iexcel-value.
WHEN '0003'.
record-werks_003 = iexcel-value.
WHEN '0004'.
record-matnr_01_006 = iexcel-value.
WHEN '0005'.
record-newvalpr_01_007 = iexcel-value.
ENDCASE.
AT END OF row.
APPEND record.
CLEAR: record.
ENDAT.
ENDLOOP.
ENDIF.
ENDFORM. "of_getexcel