最近写的一个批量上传程序,功能两个:下载模板和上传数据
然后选中数据点击更新,就可以调用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
效果: