ABAP BDC使用EXCEL模板批量修改物料

主要功能说明:

1.创建GOS对象,可供用户在服务器端上传/下载批量模板

2.Excel上传数据解析

3.执行SAP事务码SHDB,录好BDC导入代码,批次调用MM02修改物料描述(显示进度条百分比%)

4.ALV显示执行结果

*&---------------------------------------------------------------------*
*& Report zmmdd01
*&---------------------------------------------------------------------*
*& Request :Test Project
*& Author : DDong (XXX, IT)
*& Creation Date : 2022/03/22
*& Purpose: Test Batch Upload To Modify Material
*&---------------------------------------------------------------------*
REPORT zmmdd01.

DATA: BEGIN OF gs_upload,
        matnr LIKE rmmg1-matnr,
        maktx LIKE makt-maktx,
      END OF gs_upload.
DATA: gt_upload LIKE TABLE OF gs_upload.

DATA: bdc_params TYPE ctu_params.

DATA: it_bdc TYPE STANDARD TABLE OF bdcdata,
      wa_bdc TYPE bdcdata,
      it_message TYPE STANDARD TABLE OF bdcmsgcoll,
      wa_message TYPE bdcmsgcoll,
      l_mstring(100).

DATA: BEGIN OF wa_result,
        matnr LIKE rmmg1-matnr,
        status(8)  TYPE c,
        message(100)  TYPE c,
      END OF wa_result.
DATA: it_result LIKE TABLE OF wa_result.

DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: gw_fieldcat TYPE slis_fieldcat_alv.
DATA: gw_layout TYPE slis_layout_alv.
DATA: gw_grid_settings TYPE lvc_s_glay.

DEFINE add_fieldcat.
    gw_fieldcat-fieldname = &1.
    gw_fieldcat-seltext_m = &2.
    APPEND gw_fieldcat  TO gt_fieldcat.
    CLEAR gw_fieldcat.
END-OF-DEFINITION.

CONSTANTS: objtype TYPE borident-objtype VALUE 'ZGOS001'.
DATA: manager TYPE REF TO cl_gos_manager,
      obj  TYPE borident,
      gs_bc_object TYPE sibflpor.

DATA: wa_itab TYPE alsmex_tabline.
DATA: itab TYPE STANDARD TABLE OF alsmex_tabline WITH DEFAULT KEY.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
    PARAMETERS : s_path TYPE rlgrap-filename DEFAULT 'c:\'.
SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_path.
        PERFORM choose_input_file.
AT SELECTION-SCREEN OUTPUT.

* 创建GOS对象,上传模板附档
    CLEAR obj.
    obj-objtype = objtype.

    SELECT SINGLE name FROM trdir INTO obj-objkey
    WHERE name = sy-repid.

    CALL FUNCTION 'SWU_OBJECT_PUBLISH'
        EXPORTING
            objtype = obj-objtype
            objkey  = obj-objkey
       EXCEPTIONS
            objtype_not_found = 1
            OTHERS = 2.
    IF sy-subrc <> 0.
         MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ELSE.
        CREATE OBJECT manager
             EXPORTING
                 is_object       = obj
                 is_bc_object    = gs_bc_object
                 ip_start_direct = 'X'.
    ENDIF.


START-OF-SELECTION.
    IF s_path IS INITIAL.
        MESSAGE 'Please select file firest!' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.

* 上传excel数据
PERFORM upload_excel_data.

* 执行bdc MM02
PERFORM bdc_modfiy_material.

* 显示执行结果
PERFORM display_result.

FORM upload_excel_data.
    DATA: l_index TYPE i,
          l_line TYPE i.
    FIELD-SYMBOLS: <fs>.
    CLEAR: itab[].

* 导入excel数据到itab[]
    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
                filename  = s_path
                i_begin_col = '1'
                i_begin_row = '1'
                i_end_col = '256'
                i_end_row = '65536'
             TABLES
                intern = itab
             EXCEPTIONS
               inconsistent_parameters = 1
                upload_ole             = 2
                OTHERS                 = 3.

    DELETE itab WHERE row = 1 OR col > 2.

* itab[]数据整理到gt_upload[]
    LOOP AT itab INTO wa_itab.
        CONDENSE wa_itab-value.
        l_index = wa_itab-col.
        ASSIGN COMPONENT l_index OF STRUCTURE gs_upload TO <fs>.
        <fs> = wa_itab-value.
        TRANSLATE <fs> TO UPPER CASE.
        AT END OF row.
            APPEND gs_upload TO gt_upload.
            CLEAR  gs_upload.
        ENDAT.
    ENDLOOP.

    DESCRIBE TABLE gt_upload LINES l_line.

* no upload data found!
    IF l_line = 0.
        MESSAGE ID 'ZDD' TYPE 'S' NUMBER 001 DISPLAY LIKE 'E'.
        STOP.
    ENDIF.

* upload  line limit 9999!
    IF l_line > 9999.
        MESSAGE ID 'ZDD' TYPE 'S' NUMBER 002 DISPLAY LIKE 'E'.
        STOP.
    ENDIF.
ENDFORM.

FORM choose_input_file.
    CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
        EXPORTING
            mask            = ''
            static            = 'X'
         CHANGING
            file_name = s_path.
ENDFORM.

FORM display_result.

* ALV fieldcat
    add_fieldcat 'matnr' 'Material'.
    add_fieldcat 'status' 'Status'.
    add_fieldcat 'message' 'Message'.

* ALV layout
  gw_layout-colwidth_optimize = 'X'.

* ALV display
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      i_grid_settings    = gw_grid_settings
      is_layout          = gw_layout
      it_fieldcat        = gt_fieldcat[]
    TABLES
      t_outtab           = it_result[].

ENDFORM.

FORM bdc_modfiy_material.
    DATA: l_count TYPE i,
          l_line TYPE i,
          l_prec TYPE i,
          l_prec_text(4) TYPE c.

    CLEAR: it_bdc[], bdc_params.

* bdc启动参数
    bdc_params-defsize = 'X'.
    bdc_params-dismode = 'N'.   "A:调试 N:不显示 E:错误时调试
    bdc_params-updmode = 'A'.   "A:异步 S:同步 L:本地更新
    bdc_params-cattmode = ''.

    DESCRIBE TABLE gt_upload LINES l_count.

    l_line = 0.
* gt_upload值传入bdc屏幕参数
    LOOP AT gt_upload INTO gs_upload.
        CLEAR wa_result.

        wa_result-matnr = gs_upload-matnr.

        l_line = l_line + 1.
        l_prec = l_line * 100 DIV l_count.
        l_prec_text+0(3) = l_prec.
        l_prec_text+3(1) = '%'.

* 显示bdc处理进度条百分比%
        CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
             EXPORTING
                percentage       = l_prec
                text             = l_prec_text.

* 传入bdc屏幕/OKCODE/FIELD参数
        PERFORM bdc_field       USING 'X' 'SAPLMGMM' '0060'.
        PERFORM bdc_field       USING '' 'BDC_OKCODE' '=ENTR'.
        PERFORM bdc_field       USING '' 'RMMG1-MATNR' gs_upload-matnr.
        PERFORM bdc_field       USING 'X' 'SAPLMGMM' '0070'.
        PERFORM bdc_field       USING '' 'BDC_OKCODE' '=ENTR'.
        PERFORM bdc_field       USING '' 'MSICHTAUSW-KZSEL(01)' 'X'.
        PERFORM bdc_field       USING 'X' 'SAPLMGMM' '4004'.
        PERFORM bdc_field       USING '' 'BDC_OKCODE' '=BU'.
        PERFORM bdc_field       USING '' 'MAKT-MAKTX' gs_upload-maktx.

* 执行bdc事物码'MM02',执行错误消息保存到it_result[]
        CALL TRANSACTION 'MM02' USING it_bdc OPTIONS FROM bdc_params MESSAGES INTO it_message.

        WAIT UP TO '0.5' SECONDS.

        IF it_message[] IS NOT INITIAL.
            LOOP AT it_message INTO wa_message WHERE msgtyp = 'E' OR msgtyp = 'I' .
                CALL FUNCTION 'MESSAGE_TEXT_BUILD'
                    EXPORTING
                        msgid                     = wa_message-msgid
                        msgnr                     = wa_message-msgnr
                        msgv1                     = wa_message-msgv1
                        msgv2                     = wa_message-msgv2
                        msgv3                     = wa_message-msgv3
                        msgv4                     = wa_message-msgv4
                    IMPORTING
                        message_text_output       =  l_mstring.

                CONDENSE l_mstring.
                wa_result-status = 'fail'.
                wa_result-message = l_mstring.
                EXIT.
            ENDLOOP.
        ENDIF.
        IF wa_result-status IS INITIAL.
            wa_result-status = 'success'.
            wa_result-message = ''.
        ENDIF.
        APPEND wa_result TO it_result.


        CLEAR: it_message[], wa_message, l_mstring, it_bdc[].
    ENDLOOP.
ENDFORM.

* bdc 执行参数it_bdc[]
FORM bdc_field USING flag v1 v2.
    CLEAR wa_bdc.
    IF flag = 'X'.
        wa_bdc-program = v1.
        wa_bdc-dynpro = v2.
        wa_bdc-dynbegin = 'X'.
    ELSE.
        wa_bdc-fnam = v1.
        wa_bdc-fval = v2.
    ENDIF.
    APPEND wa_bdc TO it_bdc.
ENDFORM.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值