MR21批量修改价格

来源:互联网 发布:mac装机必备 编辑:程序博客网 时间:2024/06/11 22:10

前两天吃中饭时同事说MR21修改价格用LSMW导入,每次只能导入一条商品价格,而每一个商品价格的修改都会产生一个凭证,问是否能批量导入。先去找了下BAPI,看了下BAPI_MATVAL_PRICE_CHANGE和BAPI_M_REVAL_CREATEPRICECHANGE两个BAPI,发现前一个每次只能修改一个商品价格,后一个根本就跑不起来,不知道咋回事,只能回头用SHDB解决问题。

  REPORT zmr21
       NO STANDARD PAGE HEADING LINE-SIZE 255.

INCLUDE bdcrecx1.

PARAMETERSdataset(132LOWER 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 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 data element use the
      comment without data element name
  3.) The second line shows the fieldname of the
      structure, the fieldname must consist of
      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  ***
DATABEGIN 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.
  DATAli_cur TYPE i VALUE 0,
      li_mod TYPE i,
      ls_fname(30TYPE c,
      ls_temp(2TYPE c,
      li_len TYPE i,
      li_inex TYPE i VALUE 0.
  li_mod LINESrecord ).
  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 STRLENls_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.
  DATAfilenm TYPE rlgrap-filename VALUE 'e:\mr21.xls'.
  FIELD-SYMBOLS: <fs1>.
  DATABEGIN OF iexcel OCCURS 0.
          INCLUDE STRUCTURE alsmex_tabline.
  DATAEND OF iexcel.
  DATAls_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.
        CLEARrecord.
      ENDAT.
    ENDLOOP.
  ENDIF.
ENDFORM                   "of_getexcel