SAP ABAP 批量上传调用BAPI修改SO行项目的利润中心字段

最近写的一个批量上传程序,功能两个:下载模板和上传数据
然后选中数据点击更新,就可以调用BAPI修改SO行项目的利润中心字段
 

*&---------------------------------------------------------------------*
*& Report  ZCSD_001
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zcsd_001.

TYPE-POOLS:slis.
TABLES :vbap.

TYPES:BEGIN OF ty_line,
    vbeln TYPE c LENGTH 10,
    posnr TYPE c LENGTH 6,
    prctr TYPE c LENGTH 10,
  END OF ty_line.
DATA: itab TYPE STANDARD TABLE OF ty_line WITH HEADER LINE,
      wtab TYPE ty_line.

TYPES:BEGIN OF ty_vbap,
    vbeln TYPE vbap-vbeln,
    posnr TYPE vbap-posnr,
    prctr TYPE vbap-prctr,
  END OF ty_vbap.
DATA: t_vbap TYPE STANDARD TABLE OF ty_line WITH HEADER LINE,
      w_vbap TYPE ty_line.


TYPES:BEGIN OF ty_show,
    vbeln TYPE vbap-vbeln,
    posnr TYPE vbap-posnr,
    prctr TYPE  vbap-prctr,"修改值
    prctr1 TYPE vbap-prctr,"原值
    message TYPE bapiret2-message,
    box    TYPE c,
  END OF ty_show.
DATA: t_show TYPE STANDARD TABLE OF ty_show WITH HEADER LINE,
      w_show TYPE ty_show.


DATA:t_fieldcat TYPE slis_t_fieldcat_alv,
     w_fieldcat TYPE slis_fieldcat_alv,
     w_layout   TYPE slis_layout_alv,
     gt_fieldcat TYPE slis_t_fieldcat_alv,
     ls_setting  TYPE lvc_s_glay,
     g_repid     LIKE sy-repid VALUE sy-repid,
     ls_ord_header_inx TYPE bapisdh1x OCCURS 0 WITH HEADER LINE,
     ls_return LIKE bapiret2,
     lt_return TYPE TABLE OF bapiret2 WITH HEADER LINE,
     lt_bapisditm LIKE bapisditm  OCCURS 0 WITH HEADER LINE,
     lt_bapisditmx LIKE bapisditmx  OCCURS 0 WITH HEADER LINE.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-400.
SELECTION-SCREEN SKIP 1.
PARAMETERS:
            p_x3 TYPE c RADIOBUTTON GROUP x1,"模板下载
            p_x4 TYPE c RADIOBUTTON GROUP x1  DEFAULT 'X'."导入数据
SELECTION-SCREEN SKIP 1.

SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK bk2 WITH FRAME TITLE text-401.
PARAMETERS: p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK bk2.

AT SELECTION-SCREEN.

INITIALIZATION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

  PERFORM get_file."使用文件选择框

START-OF-SELECTION.
  IF p_x3 = 'X'.
    IF p_file IS  INITIAL.
      MESSAGE text-512 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING."返回initialization事件 .
    ELSE.
      PERFORM f_down_mode.
    ENDIF.
  ENDIF.
  IF p_x4 = 'X'.
    IF p_file IS  INITIAL.
      MESSAGE text-511 TYPE 'S' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING."返回initialization事件 .
    ELSE.
      PERFORM upload_data.
      PERFORM f_show_alv.
    ENDIF.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*

FORM f_down_mode  .
  DATA: l_name TYPE string.
  DATA:BEGIN OF imode OCCURS 0,
       col1(10) TYPE c,
       col2(10) TYPE c,
       col3(10) TYPE c,
END OF imode.

  imode-col1 = text-100.
  imode-col2 = text-101.
  imode-col3 = text-102.
  APPEND imode.
  CLEAR imode.

  l_name = p_file.
  CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
*     BIN_FILESIZE                    =
      filename                        = l_name
     filetype                        = 'DAT'
*     APPEND                          = ' '
     write_field_separator           = 'X'
     header                          = '00'
     trunc_trailing_blanks           = ' '
     write_lf                        = 'X'
     col_select                      = ' '
     col_select_mask                 = ' '
     dat_mode                        = ' '
     confirm_overwrite               = ' '
     no_auth_check                   = ' '
     codepage                        = '8400'
*     ignore_cerr                     = abap_true
     replacement                     = '#'
     write_bom                       = ' '
     trunc_trailing_blanks_eol       = 'X'
     wk1_n_format                    = ' '
     wk1_n_size                      = ' '
     wk1_t_format                    = ' '
     wk1_t_size                      = ' '
*     write_lf_after_last_line        = abap_true
*     show_transfer_status            = abap_true
*   IMPORTING
*     FILELENGTH                      =
    TABLES
      data_tab                        = imode
*     FIELDNAMES                      =
   EXCEPTIONS
     file_write_error                = 1
     no_batch                        = 2
     gui_refuse_filetransfer         = 3
     invalid_type                    = 4
     no_authority                    = 5
     unknown_error                   = 6
     header_not_allowed              = 7
     separator_not_allowed           = 8
     filesize_not_allowed            = 9
     header_too_long                 = 10
     dp_error_create                 = 11
     dp_error_send                   = 12
     dp_error_write                  = 13
     unknown_dp_error                = 14
     access_denied                   = 15
     dp_out_of_memory                = 16
     disk_full                       = 17
     dp_timeout                      = 18
     file_not_found                  = 19
     dataprovider_exception          = 20
     control_flush_error             = 21
     OTHERS                          = 22
            .
  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.                    "f_down_mode


*&---------------------------------------------------------------------*
*&      Form  f_show_alv
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM f_show_alv .
  PERFORM f_init_layout.
  PERFORM f_fieldcat1.
  PERFORM f_output_alv.
ENDFORM.                    " F_SHOW_ALV
*&---------------------------------------------------------------------*
*&      Form  F_INIT_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_init_layout .
  w_layout-zebra = 'X'.
  w_layout-box_fieldname = 'BOX'.
ENDFORM.                    " F_INIT_LAYOUT
*&---------------------------------------------------------------------*
*&      Form  F_FIELDCAT1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_fieldcat1 .
  CLEAR:gt_fieldcat[].
  DATA:num(2) TYPE n.

  CLEAR w_fieldcat.
  w_fieldcat-col_pos = num.
  w_fieldcat-fieldname = 'VBELN'.
  w_fieldcat-seltext_l = text-007.
  w_fieldcat-seltext_m = text-007.
  w_fieldcat-seltext_s = text-007.
  APPEND w_fieldcat TO gt_fieldcat.

  CLEAR w_fieldcat.
  w_fieldcat-col_pos = num.
  w_fieldcat-fieldname = 'POSNR'.
  w_fieldcat-seltext_l = text-004.
  w_fieldcat-seltext_m = text-004.
  w_fieldcat-seltext_s = text-004.
  APPEND w_fieldcat TO gt_fieldcat.

  CLEAR w_fieldcat.
  w_fieldcat-col_pos = num.
  w_fieldcat-fieldname = 'PRCTR'.
  w_fieldcat-seltext_l = text-001.
  w_fieldcat-seltext_m = text-001.
  w_fieldcat-seltext_s = text-001.
  APPEND w_fieldcat TO gt_fieldcat.

  CLEAR w_fieldcat.
  w_fieldcat-col_pos = num.
  w_fieldcat-fieldname = 'PRCTR1'.
  w_fieldcat-seltext_l = text-002.
  w_fieldcat-seltext_m = text-002.
  w_fieldcat-seltext_s = text-002.
  APPEND w_fieldcat TO gt_fieldcat.

  CLEAR w_fieldcat.
  w_fieldcat-col_pos = num.
  w_fieldcat-fieldname = 'MESSAGE'.
  w_fieldcat-seltext_l = text-009.
  w_fieldcat-seltext_m = text-009.
  w_fieldcat-seltext_s = text-009.
  w_fieldcat-outputlen = '35'.
  APPEND w_fieldcat TO gt_fieldcat.

ENDFORM.                    " F_FIELDCAT1
*&---------------------------------------------------------------------*
*&      Form  F_OUTPUT_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM f_output_alv .
  DATA: t_events TYPE slis_t_event WITH HEADER LINE.
  t_events-name = slis_ev_data_changed.
  t_events-form = 'ALV_DATA_CHANGED'.
  APPEND t_events.
  g_repid = sy-repid.
  ls_setting-edt_cll_cb = 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = g_repid
      i_callback_pf_status_set = 'ALV_PF_STATUS'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      i_grid_settings          = ls_setting
      is_layout                = w_layout       "
      it_fieldcat              = gt_fieldcat[]
*      it_events                =
      i_save                   = 'A'
    TABLES
      t_outtab                 = t_show[]
    EXCEPTIONS
      program_error            = 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.
  ENDIF.

ENDFORM.                    " F_OUTPUT_ALV


*&---------------------------------------------------------------------*
*&      Form  FR_REFRESH_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM fr_refresh_alv .
  "function-alv 刷新
  DATA: gr_alvgrid TYPE REF TO cl_gui_alv_grid.
  DATA ls_stable TYPE lvc_s_stbl.
  IF gr_alvgrid IS INITIAL.
    "1.先使用GET_GLOBALS_FROM_SLVC_FULLSCR接收屏幕ALV,放置容器
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = gr_alvgrid.
  ENDIF.
  IF NOT gr_alvgrid IS INITIAL.
    ls_stable-row = 'X'.
    ls_stable-col = 'X'.
                                                            "2.再调用刷新方法
    CALL METHOD gr_alvgrid->refresh_table_display
      EXPORTING
        i_soft_refresh = 'X'
        is_stable      = ls_stable
      EXCEPTIONS
        finished       = 1
        OTHERS         = 2.
    IF sy-subrc <> 0.
      LEAVE TO SCREEN 0.
    ENDIF.
  ENDIF.
ENDFORM.                    " FR_REFRESH_ALV
*&---------------------------------------------------------------------*

FORM alv_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD_FULLSCREEN' EXCLUDING rt_extab.
ENDFORM.                    "FRM_PLATFORM_OUTPUT2

*&---------------------------------------------------------------------*
*&      Form  alv_user_command
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm LIKE sy-ucomm
                             rs_selfield TYPE slis_selfield.
  DATA: commandname.
  DATA: l_str TYPE string.
  DATA: l_success TYPE c.
  DATA: l_message TYPE string.
  CASE r_ucomm.
    WHEN '&GNO'."当点击更新时
      PERFORM update_data.
    WHEN OTHERS.
  ENDCASE.
  rs_selfield-refresh = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.
ENDFORM.                    "alv_user_command




*&---------------------------------------------------------------------*
*&      Form  conversion_exit_alpha_input
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->FC_ALPHA   text
*----------------------------------------------------------------------*
FORM conversion_exit_alpha_input CHANGING fc_alpha.
  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
    EXPORTING
      input  = fc_alpha
    IMPORTING
      output = fc_alpha.
ENDFORM.                    "conversion_exit_alpha_input




*&---------------------------------------------------------------------*
*&      Form  SAVE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM update_data .
  DATA:l_tabix TYPE sy-tabix,
       ls_vbeln TYPE vbak-vbeln,
       ls_posnr TYPE vbap-posnr,
       ls_prctr TYPE vbap-prctr.

  IF t_show[] IS NOT INITIAL.
    LOOP AT t_show INTO w_show WHERE box = 'X' .
      CLEAR:l_tabix,ls_vbeln,lt_bapisditm,lt_bapisditmx,lt_return[].
      l_tabix = sy-tabix.
      IF w_show-prctr <> w_show-prctr1.
        ls_vbeln = w_show-vbeln.
        ls_posnr = w_show-posnr.
        ls_prctr = w_show-prctr.
        CLEAR lt_bapisditm[].
        lt_bapisditm-itm_number = ls_posnr.
        lt_bapisditm-profit_ctr = ls_prctr.

        IF  w_show-prctr IS NOT INITIAL.
          lt_bapisditmx-itm_number = ls_posnr.
          lt_bapisditmx-updateflag = 'U'.
          lt_bapisditmx-profit_ctr = 'X'.
        ENDIF.

        APPEND lt_bapisditm.
        APPEND lt_bapisditmx.
        ls_ord_header_inx-updateflag = 'U'.
        "调用Bapi修改SO
        CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
         EXPORTING
     salesdocument               = ls_vbeln
*     ORDER_HEADER_IN             =
     order_header_inx            = ls_ord_header_inx
*     SIMULATION                  =
*     BEHAVE_WHEN_ERROR           = ' '
*     INT_NUMBER_ASSIGNMENT       = ' '
*     LOGIC_SWITCH                =
*     NO_STATUS_BUF_INIT          = ' '
        TABLES
     return                      = lt_return
     order_item_in               = lt_bapisditm
     order_item_inx              = lt_bapisditmx
*     PARTNERS                   =
*     partnerchanges              = lt_partner
*     PARTNERADDRESSES            =
*     ORDER_CFGS_REF              =
*     ORDER_CFGS_INST             =
*     ORDER_CFGS_PART_OF          =
*     ORDER_CFGS_VALUE            =
*     ORDER_CFGS_BLOB             =
*     ORDER_CFGS_VK               =
*     ORDER_CFGS_REFINST          =
*     SCHEDULE_LINES              =
*     SCHEDULE_LINESX             =
*     ORDER_TEXT                  =
*     ORDER_KEYS                  =
*     CONDITIONS_IN               =
*     CONDITIONS_INX              =
*     EXTENSIONIN                 =
                  .
        DATA:l_not_pass TYPE c.

        CLEAR lt_return.
        READ TABLE lt_return WITH KEY type = 'E' .
        IF sy-subrc EQ 0.
          l_not_pass = 'X'.
        ENDIF.
        CLEAR lt_return.
        READ TABLE lt_return WITH KEY type = 'A'.
        IF sy-subrc EQ 0.
          l_not_pass = 'X'.
        ENDIF.

        IF l_not_pass = 'X'.
          "type是E和A都回滚 ,E还输出报错信息
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          LOOP AT lt_return WHERE type = 'E'.
            CONCATENATE lt_return-message w_show-message INTO w_show-message.
          ENDLOOP.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
          CONCATENATE '销售凭证'(t01) ':' w_show-vbeln ' ' '的利润中心更新成功'(t11) INTO w_show-message.
        ENDIF.
      ELSE.
        w_show-message = text-301.
      ENDIF.
      MODIFY  t_show FROM w_show INDEX l_tabix.
      CLEAR w_show.
    ENDLOOP.
  ENDIF.


ENDFORM.                    "update_data

*
*&---------------------------------------------------------------------*
*&      Form  UPLOAD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM upload_data .
  DATA: l_name TYPE string.

  l_name = p_file.
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                      = l_name
     filetype                      = 'DAT'
     has_field_separator           = 'X'
*     HEADER_LENGTH                 = 1
     read_by_line                  = 'X'
*     DAT_MODE                      = ' '
   codepage                      = '8400'
   ignore_cerr                   = abap_true
   replacement                   = '#'
*     CHECK_BOM                     = ' '
*     VIRUS_SCAN_PROFILE            =
*     NO_AUTH_CHECK                 = ' '
*   IMPORTING
*     FILELENGTH                    =
*     HEADER                        =
    TABLES
      data_tab                      = itab
   EXCEPTIONS
     file_open_error               = 1
     file_read_error               = 2
     no_batch                      = 3
     gui_refuse_filetransfer       = 4
     invalid_type                  = 5
     no_authority                  = 6
     unknown_error                 = 7
     bad_data_format               = 8
     header_not_allowed            = 9
     separator_not_allowed         = 10
     header_too_long               = 11
     unknown_dp_error              = 12
     access_denied                 = 13
     dp_out_of_memory              = 14
     disk_full                     = 15
     dp_timeout                    = 16
     OTHERS                        = 17.

  DELETE itab INDEX 1.
  IF itab[] IS INITIAL.
    MESSAGE '列表中没有数据!' TYPE 'E'.
  ENDIF.

  LOOP AT itab INTO wtab.
    w_show-vbeln =  wtab-vbeln.
    w_show-posnr =  wtab-posnr.
    w_show-prctr =  wtab-prctr.
    PERFORM conversion_exit_alpha_input CHANGING w_show-vbeln.
    PERFORM conversion_exit_alpha_input CHANGING w_show-posnr.
    APPEND w_show TO t_show .
    CLEAR: w_show,wtab.
  ENDLOOP.

  IF t_show[] IS NOT INITIAL.
    SELECT vbeln posnr prctr INTO TABLE t_vbap FROM vbap
    FOR ALL ENTRIES IN t_show
    WHERE vbeln = t_show-vbeln
      AND posnr = t_show-posnr.
    SORT t_vbap BY vbeln posnr.

    LOOP AT t_show INTO w_show.
      READ TABLE t_vbap INTO w_vbap WITH  KEY vbeln = w_show-vbeln
                                              posnr = w_show-posnr.
      IF sy-subrc = 0.
        w_show-prctr1 = w_vbap-prctr."原值
      ENDIF.
      MODIFY t_show FROM w_show .
      CLEAR:w_show,w_vbap.
    ENDLOOP.
  ENDIF.

ENDFORM.                    " UPLOAD_DATA

*&---------------------------------------------------------------------*
*&      Form  GET_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_file .
  CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME           = ' '
*     DEF_PATH               = ' '
     mask                   = ',*.TXT. '
     mode                   = 'O '
     title                  =  'Choose file'
    IMPORTING
     filename               =  p_file
*     PATH                   =
*     FILE                   =
    EXCEPTIONS
     selection_cancel       = 1
     selection_error        = 2
    OTHERS                 = 3
       .

  CASE sy-subrc.
    WHEN 0.
    WHEN 2.
      MESSAGE 'Cancel.' TYPE 'S'.
    WHEN OTHERS.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDCASE.
ENDFORM.                    " GET_FILE

*&      Form  CONVERSION_EXIT_ALPHA_OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_W_SHOW_VBELN  text
*----------------------------------------------------------------------*

FORM conversion_exit_alpha_output  CHANGING fa_alpha.

  CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
    EXPORTING
      input  = fa_alpha
    IMPORTING
      output = fa_alpha.
ENDFORM.                    " CONVERSION_EXIT_ALPHA_OUTPUT

效果:


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值