SAP BP客户主数据基本视图批量修改

此代码示例展示了如何使用BAPI'BUPA_CENTRAL_CI_CHANGE'批量更新业务伙伴(BP)主数据的基本视图字段。程序首先从上传的Excel文件中读取数据,然后通过循环处理每一项,调用转换函数处理输入,接着查询数据库匹配BP主数据,最后使用BAPI进行更新操作。如果更新失败,则回滚事务,否则提交事务并记录成功信息。
摘要由CSDN通过智能技术生成

BAPI:  BUPA_CENTRAL_CI_CHANGE

可以通过以上BAPI对BP主数据基本视图里面的字段进行修改处理

关键处理代码如下:

*&---------------------------------------------------------------------*
*& Form frm_process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_process_data .
  TYPES: BEGIN OF lty_but000,
           partner      TYPE but000-partner,
           partner_guid TYPE but000-partner_guid,
         END OF lty_but000.
  DATA: lt_but000 TYPE TABLE OF lty_but000,
        ls_but000 TYPE lty_but000.
  CLEAR: lt_but000,
         ls_but000.
  FIELD-SYMBOLS: <lfs_upload> TYPE gty_upload.

  IF gt_upload IS NOT INITIAL.
    LOOP AT gt_upload ASSIGNING <lfs_upload>.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <lfs_upload>-partner
        IMPORTING
          output = <lfs_upload>-partner.

    ENDLOOP.

    SELECT partner
           partner_guid
      INTO TABLE lt_but000
      FROM but000
      FOR ALL ENTRIES IN gt_upload
      WHERE partner = gt_upload-partner.

    LOOP AT gt_upload ASSIGNING <lfs_upload>.
      READ TABLE lt_but000 INTO ls_but000 WITH KEY partner = <lfs_upload>-partner.
      IF sy-subrc = 0.
        CLEAR: ls_eewb,
               ls_eewb_x,
               lt_return,
               ls_return,
               l_fail.

        ls_eewb-partnr_guid = ls_but000-partner_guid.
        ls_eewb-zrc_adrc = <lfs_upload>-zrc_adrc.
        ls_eewb-zrc_ps = <lfs_upload>-zrc_ps.
        ls_eewb-zrc_tel = <lfs_upload>-zrc_tel.

        ls_eewb_x-zrc_adrc = 'X'.
        ls_eewb_x-zrc_ps = 'X'.
        ls_eewb_x-zrc_tel = 'X'.

        CALL FUNCTION 'BUPA_CENTRAL_CI_CHANGE'
          EXPORTING
            is_bus000_eew   = ls_eewb
            is_bus000_eew_x = ls_eewb_x
          IMPORTING
            et_return       = lt_return.

        LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A' .
          l_fail = 'X'.
        ENDLOOP.

        IF l_fail = 'X'.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          gs_alv-partner = <lfs_upload>-partner.
          gs_alv-msg_ty = 'E'.
          LOOP AT lt_return INTO ls_return.
            CONCATENATE gs_alv-msg_txt ls_return-message INTO gs_alv-msg_txt SEPARATED BY ';'.
          ENDLOOP.
          APPEND gs_alv TO gt_alv.
          CLEAR: gs_alv.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.

          gs_alv-partner = <lfs_upload>-partner.
          gs_alv-msg_ty = 'S'.
          CONCATENATE '客户编号' <lfs_upload>-partner '已修改.' INTO gs_alv-msg_txt SEPARATED BY space.
          APPEND gs_alv TO gt_alv.
          CLEAR: gs_alv.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDIF.

ENDFORM.

 完整代码如下:

*&---------------------------------------------------------------------*
*& Report ZSD2001
*&---------------------------------------------------------------------*
*&客户主数据批量修改(运输细节)
*&---------------------------------------------------------------------*
REPORT zsd2001.
TYPES: BEGIN OF gty_upload,
         partner  TYPE but000-partner,
         zrc_adrc TYPE but000-zrc_adrc,
         zrc_ps   TYPE but000-zrc_ps,
         zrc_tel  TYPE but000-zrc_tel,
       END OF gty_upload,

       BEGIN OF gty_alv,
         partner TYPE but000-partner,
         msg_ty  TYPE c, "消息类型
         msg_txt TYPE string, "消息
       END OF gty_alv.
DATA: ls_eewb         TYPE bus000_eew,
      ls_eewb_x       TYPE bus000_eew_x,
      lv_partner_guid TYPE bu_partner_guid,
      lt_return       TYPE TABLE OF bapiret2,
      ls_return       TYPE bapiret2,
      l_fail          TYPE c,
      gt_upload       TYPE TABLE OF gty_upload,
      gs_upload       TYPE gty_upload,
      gt_alv          TYPE TABLE OF gty_alv,
      gs_alv          TYPE gty_alv,
      gs_layout       TYPE slis_layout_alv,
      gt_fieldcat     TYPE TABLE OF slis_fieldcat_alv,
      gs_fieldcat     TYPE slis_fieldcat_alv,
      gv_objid        TYPE w3objid.

*--------------------------------------------------------------------*
*选择屏幕
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_file TYPE rlgrap-filename. "选择导入文件
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME TITLE TEXT-002.
  SELECTION-SCREEN PUSHBUTTON /1(10) button USER-COMMAND cli1 MODIF ID m02.
SELECTION-SCREEN END OF BLOCK blk2.

*--------------------------------------------------------------------*
*INITIALIZATION
*--------------------------------------------------------------------*
INITIALIZATION.
  PERFORM frm_init.

*--------------------------------------------------------------------*
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR
*--------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_select_path."选择路径

*--------------------------------------------------------------------*
*AT SELECTION-SCREEN
*--------------------------------------------------------------------*
AT SELECTION-SCREEN.
  IF sy-ucomm = 'CLI1'.
    PERFORM frm_download_file USING gv_objid.
  ENDIF.
*--------------------------------------------------------------------*
*START-OF-SELECTION
*--------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_upload_data."数据导入

  PERFORM frm_process_data. "处理数据

*--------------------------------------------------------------------*
*END-OF-SELECTION
*--------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM frm_display_alv.

*&---------------------------------------------------------------------*
*& Form frm_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init .
  CLEAR: lv_partner_guid,
         ls_eewb_x,
         ls_eewb,
         lt_return,
         ls_return,
         l_fail,
         gt_upload,
         gs_upload,
         gt_alv,
         gs_alv,
         gs_layout,
         gt_fieldcat,
         gs_fieldcat.
  gv_objid = 'ZSD2001'.
  button = '下载'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_select_path
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_select_path .
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      mask             = ',*.* ,*.*.'
      mode             = '0'
      title            = '请选择要上传的信息文件'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0.
    "    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    "            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_upload_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_upload_data .
*&--- 导入内表
*&---EXCEL导入内表
  DATA : lt_excel LIKE TABLE OF alsmex_tabline.
  DATA : ls_excel  TYPE alsmex_tabline,  "excel structure
         ls_upload LIKE LINE OF gt_upload.
  FIELD-SYMBOLS : <field>.
*&---读取EXCEL到内表
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 14
      i_end_row               = 30000
    TABLES
      intern                  = lt_excel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*    MESSAGE 'EXCEL导入错误或文件路径错误' TYPE 'E'.
  ENDIF.


  LOOP AT lt_excel INTO ls_excel.

    ASSIGN COMPONENT ls_excel-col OF STRUCTURE ls_upload TO <field>.
    <field> = ls_excel-value.

    AT END OF row.
      APPEND ls_upload TO gt_upload.
      CLEAR : ls_upload.
    ENDAT.
    CLEAR : ls_excel.
  ENDLOOP.

  SORT gt_upload BY partner.
  DELETE ADJACENT DUPLICATES FROM gt_upload COMPARING ALL FIELDS.

  FREE : lt_excel.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_process_data .
  TYPES: BEGIN OF lty_but000,
           partner      TYPE but000-partner,
           partner_guid TYPE but000-partner_guid,
         END OF lty_but000.
  DATA: lt_but000 TYPE TABLE OF lty_but000,
        ls_but000 TYPE lty_but000.
  CLEAR: lt_but000,
         ls_but000.
  FIELD-SYMBOLS: <lfs_upload> TYPE gty_upload.

  IF gt_upload IS NOT INITIAL.
    LOOP AT gt_upload ASSIGNING <lfs_upload>.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          input  = <lfs_upload>-partner
        IMPORTING
          output = <lfs_upload>-partner.

    ENDLOOP.

    SELECT partner
           partner_guid
      INTO TABLE lt_but000
      FROM but000
      FOR ALL ENTRIES IN gt_upload
      WHERE partner = gt_upload-partner.

    LOOP AT gt_upload ASSIGNING <lfs_upload>.
      READ TABLE lt_but000 INTO ls_but000 WITH KEY partner = <lfs_upload>-partner.
      IF sy-subrc = 0.
        CLEAR: ls_eewb,
               ls_eewb_x,
               lt_return,
               ls_return,
               l_fail.

        ls_eewb-partnr_guid = ls_but000-partner_guid.
        ls_eewb-zrc_adrc = <lfs_upload>-zrc_adrc.
        ls_eewb-zrc_ps = <lfs_upload>-zrc_ps.
        ls_eewb-zrc_tel = <lfs_upload>-zrc_tel.

        ls_eewb_x-zrc_adrc = 'X'.
        ls_eewb_x-zrc_ps = 'X'.
        ls_eewb_x-zrc_tel = 'X'.

        CALL FUNCTION 'BUPA_CENTRAL_CI_CHANGE'
          EXPORTING
            is_bus000_eew   = ls_eewb
            is_bus000_eew_x = ls_eewb_x
          IMPORTING
            et_return       = lt_return.

        LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A' .
          l_fail = 'X'.
        ENDLOOP.

        IF l_fail = 'X'.
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          gs_alv-partner = <lfs_upload>-partner.
          gs_alv-msg_ty = 'E'.
          LOOP AT lt_return INTO ls_return.
            CONCATENATE gs_alv-msg_txt ls_return-message INTO gs_alv-msg_txt SEPARATED BY ';'.
          ENDLOOP.
          APPEND gs_alv TO gt_alv.
          CLEAR: gs_alv.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.

          gs_alv-partner = <lfs_upload>-partner.
          gs_alv-msg_ty = 'S'.
          CONCATENATE '客户编号' <lfs_upload>-partner '已修改.' INTO gs_alv-msg_txt SEPARATED BY space.
          APPEND gs_alv TO gt_alv.
          CLEAR: gs_alv.
        ENDIF.
      ENDIF.
    ENDLOOP.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .
  DATA: lv_pos TYPE i.

  CLEAR: lv_pos.

  gs_layout-zebra = 'X'.
  gs_layout-colwidth_optimize = 'X'.

  DEFINE d1.
    lv_pos = lv_pos + 1.
    gs_fieldcat-col_pos = lv_pos.
    gs_fieldcat-fieldname = &1.
    gs_fieldcat-seltext_l = &2.
    gs_fieldcat-seltext_m = &2.
    gs_fieldcat-seltext_s = &2.
    APPEND gs_fieldcat TO gt_fieldcat.
    CLEAR: gs_fieldcat.

  END-OF-DEFINITION.

  d1: 'PARTNER' '客户编号',
      'MSG_TY' '消息类型',
      'MSG_TXT' '消息'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK  = ' '
*     I_BYPASSING_BUFFER = ' '
*     I_BUFFER_ACTIVE    = ' '
      i_callback_program = sy-repid
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME   =
*     I_BACKGROUND_ID    = ' '
*     I_GRID_TITLE       =
*     I_GRID_SETTINGS    =
      is_layout          = gs_layout
      it_fieldcat        = gt_fieldcat
*     IT_EXCLUDING       =
*     IT_SPECIAL_GROUPS  =
*     IT_SORT            =
*     IT_FILTER          =
*     IS_SEL_HIDE        =
*     I_DEFAULT          = 'X'
*     I_SAVE             = ' '
*     IS_VARIANT         =
*     IT_EVENTS          =
*     IT_EVENT_EXIT      =
*     IS_PRINT           =
*     IS_REPREP_ID       =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE  = 0
*     I_HTML_HEIGHT_TOP  = 0
*     I_HTML_HEIGHT_END  = 0
*     IT_ALV_GRAPHICS    =
*     IT_HYPERLINK       =
*     IT_ADD_FIELDCAT    =
*     IT_EXCEPT_QINFO    =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*     O_PREVIOUS_SRAL_HANDLER           =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
    TABLES
      t_outtab           = gt_alv
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.

*调用模板
FORM frm_download_file  USING  p_gv_objid.

  DATA: lv_filename    TYPE string,
        lv_path        TYPE string,
        lv_fullpath    TYPE string,
        lv_user_action TYPE i,
        lv_destination LIKE rlgrap-filename,
        ls_objdata     LIKE wwwdatatab,
        lv_objid       TYPE wwwdatatab-objid,
        lv_rc          TYPE sy-subrc.

  IF sy-ucomm = 'CLI1'.
    lv_filename = '客户主数据批量修改模板 - 运输细节'.

    CONCATENATE sy-datum
                '_'
                sy-uzeit
                '_'
                lv_filename
           INTO lv_filename.

    CALL METHOD cl_gui_frontend_services=>file_save_dialog
      EXPORTING
        default_extension    = 'XLSX'
        default_file_name    = lv_filename
        initial_directory    = lv_path
      CHANGING
        filename             = lv_filename
        path                 = lv_path
        fullpath             = lv_fullpath
        user_action          = lv_user_action
      EXCEPTIONS
        cntl_error           = 1
        error_no_gui         = 2
        not_supported_by_gui = 3
        OTHERS               = 4.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
         WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ELSE.
      CLEAR: lv_destination.
      lv_destination = lv_fullpath.
    ENDIF.

    CHECK lv_user_action <> 9.

    SELECT SINGLE relid objid
      FROM wwwdata
      INTO CORRESPONDING FIELDS OF ls_objdata
     WHERE srtf2 = 0
       AND objid = p_gv_objid
       AND relid = 'MI'.

    IF sy-subrc = 0.
      CLEAR: lv_rc.
      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'                   "#EC *
        EXPORTING
          key         = ls_objdata
          destination = lv_destination
        IMPORTING
          rc          = lv_rc.
      IF lv_rc NE 0.
        MESSAGE '该数据模板不存在!' TYPE 'E'.
      ELSE.
        MESSAGE '模板下载成功' TYPE 'S'.
      ENDIF.
    ELSE.
      MESSAGE '该数据模板不存在!' TYPE 'E'.
    ENDIF.
  ENDIF.
  CLEAR sy-ucomm.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值