REPORT ZTS_XSY_TEST10.
INCLUDE zsy_xy_tcus. "记录程序运行日志
INCLUDE ZTS_XSY_TEST10TOP.
INCLUDE ZTS_XSY_TEST10FORM.
INITIALIZATION.
* 增加图标
* TYPE-POOLS ICON.
WRITE ICON_CHANGE_TEXT AS ICON TO SSCRFIELDS-FUNCTXT_01+0(4).
SSCRFIELDS-FUNCTXT_01+4(*) = '下载模板'.
AT SELECTION-SCREEN.
PERFORM SELECTION_SCREEN_PAI.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILES.
PERFORM GET_FILENAME.
START-OF-SELECTION.
*取数
*1,从execl上传
*2.手工插入数据
* CLEAR GS_MATERIAL.
* GS_MATERIAL-MATNR = 'TEST01'.
* GS_MATERIAL-MAKTX = 'TEST BDC DATA'.
* GS_MATERIAL-BRGEW = '200'.
* GS_MATERIAL-NTGEW = '180'.
* GS_MATERIAL-GEWET = 'G'.
* APPEND GS_MATERIAL TO GT_MATERIAL.
PERFORM GET_DATA.
END-OF-SELECTION.
*转换
PERFORM APPEND_BDCDATA.
*PERFORM APPEND_BDCDATA_BATCH.
*&---------------------------------------------------------------------*
*& 包含 ZTS_XSY_TEST10TOP
*&---------------------------------------------------------------------*
TYPES: BEGIN OF GTY_MATERIAL,
MATNR TYPE C LENGTH 18,"物料代码
MAKTX TYPE C LENGTH 40,"物料描述
BRGEW TYPE C LENGTH 20,"毛重量
NTGEW TYPE C LENGTH 20, "净重量
GEWET TYPE C LENGTH 3, "单位
END OF GTY_MATERIAL.
DATA GT_MATERIAL TYPE TABLE OF GTY_MATERIAL.
DATA GS_MATERIAL TYPE GTY_MATERIAL.
DATA: BEGIN OF GT_TEMPLATE OCCURS 0,
TAB1 TYPE C LENGTH 10 VALUE '物料代码',
TAB2 TYPE C LENGTH 10 VALUE '物料描述',
TAB3 TYPE C LENGTH 10 VALUE '毛重量',
TAB4 TYPE C LENGTH 10 VALUE '净重量',
TAB5 TYPE C LENGTH 10 VALUE '重量单位',
END OF GT_TEMPLATE.
DATA BDCDATA TYPE TABLE OF BDCDATA WITH HEADER LINE.
TABLES SSCRFIELDS.
PARAMETERS P_FILES TYPE RLGRAP-FILENAME.
*应用工具栏增加按钮
SELECTION-SCREEN FUNCTION KEY 1." 数字1-5
*&---------------------------------------------------------------------*
*& 包含 ZTS_XSY_TEST10FORM
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM append_bdcdata .
DATA lv_message TYPE c LENGTH 200.
DATA : messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
LOOP AT gt_material INTO gs_material .
CLEAR : bdcdata,bdcdata[],messtab, messtab[]. "循环执行注意清空
PERFORM append_screen USING 'SAPLWBABAP' '0100'.
PERFORM append_field USING 'BDC_CURSOR' 'RS38M-PROGRAMM'.
PERFORM append_field USING 'BDC_OKCODE' '=STRT'.
PERFORM append_field USING 'RS38M-PROGRAMM' 'ZMM22004'.
PERFORM append_field USING 'RS38M-FUNC_EDIT' 'X'.
PERFORM append_screen USING 'ZMM22004' '1000'.
PERFORM append_field USING 'BDC_OKCODE' '/EENDE'.
PERFORM append_field USING 'BDC_CURSOR' 'S_LLIEF-LOW'.
PERFORM append_screen USING 'SAPLWBABAP' '0100'.
PERFORM append_field USING 'BDC_CURSOR' 'RS38M-PROGRAMM'.
PERFORM append_field USING 'BDC_OKCODE' '=LEAV'.
PERFORM append_field USING 'RS38M-PROGRAMM' 'ZMM22004'.
PERFORM append_field USING 'RS38M-FUNC_EDIT' 'X'.
CALL TRANSACTION 'MM02' USING bdcdata "使用内表调用
* OPTIONS FROM GS_OPTION " CTU_PARAMS
UPDATE 'S' "更新模式, s同步 A 异步
MODE 'A' "显示模式: A前台 N 后台 E只显示错误.
MESSAGES INTO messtab.
READ TABLE messtab WITH KEY msgid = 'M3'
msgnr = '801'. "物料修改成功
IF sy-subrc = 0.
WRITE:/ '物料',gs_material-matnr,'修改成功!'.
ELSE.
READ TABLE messtab WITH KEY msgid = 'M3'
msgnr = '810'.
IF sy-subrc = 0.
WRITE:/ '物料修改失败!'.
ELSE.
WRITE:/ '物料修改失败!'.
WRITE:/ '物料',gs_material-matnr, '失败原因:'.
LOOP AT messtab WHERE msgtyp = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = messtab-msgid
msgnr = messtab-msgnr
msgv1 = messtab-msgv1
msgv2 = messtab-msgv2
msgv3 = messtab-msgv3
msgv4 = messtab-msgv4
IMPORTING
message_text_output = lv_message.
WRITE:/ 'E',lv_message.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
FORM append_field USING VALUE(p_field)
VALUE(p_value).
CLEAR bdcdata.
bdcdata-fnam = p_field.
bdcdata-fval = p_value.
APPEND bdcdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_SCREEN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM append_screen USING VALUE(p_program)
VALUE(p_dynpro).
CLEAR bdcdata.
bdcdata-program = p_program.
bdcdata-dynpro = p_dynpro.
bdcdata-dynbegin ='X'.
APPEND bdcdata .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_data .
DATA lv_files TYPE string.
CHECK p_files IS NOT INITIAL.
TRANSLATE p_files TO UPPER CASE.
FIND '.TXT' IN p_files.
IF sy-subrc = 0.
lv_files = p_files.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_files
* FILETYPE = 'ASC'
has_field_separator = 'X '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = gt_material
* CHANGING
* isscanperformed = ' '
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.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ELSE.
FIND '.XLS' IN p_files.
IF sy-subrc = 0.
DATA lt_raw TYPE truxs_t_text_data.
*EXCEL文件上传
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
i_field_seperator = 'X'
i_line_header = 'X'
i_tab_raw_data = lt_raw
i_filename = p_files
TABLES
i_tab_converted_data = gt_material.
* EXCEPTIONS
* CONVERSION_FAILED = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_FILENAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_filename .
REFRESH gt_template.
APPEND gt_template.
*1.获取本地文件路径
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' ' "默认的文件名称
* DEF_PATH = ' ' " 默认的文件路径
mask = ',excel.xls,*.xlsx,text.txt,*.txt '
mode = ' O' " S 保存 O打开
title = ' 打开文件' "窗口的新手名称
IMPORTING
filename = p_files
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECTION_SCREEN_PAI
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM selection_screen_pai .
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM download_template. "模板下载
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DOWNLOAD_TEMPLATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM download_template .
DATA lv_file TYPE string.
REFRESH gt_template.
APPEND gt_template.
* 1.获取文件路径
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
* MASK = ' '
mode = ',EXECL,*.XLSX. '
title = ' S'
IMPORTING
filename = lv_file
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CHECK lv_file IS NOT INITIAL.
* 2.将内表下载到指定文件路径的文件中
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
* BIN_FILESIZE =
filename = lv_file
* FILETYPE = 'ASC'
* 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 = ' '
* 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
* VIRUS_SCAN_PROFILE = '/SCET/GUI_DOWNLOAD'
* IMPORTING
* FILELENGTH =
TABLES
data_tab = gt_template
* FIELDNAMES = gt_header "每列的描述的内表(char 一个字段的内表)
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.
* Implement suitable error handling here
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form APPEND_BDCDATA_BATCH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM append_bdcdata_batch .
DATA lv_message TYPE c LENGTH 200.
DATA gv_session TYPE apqi-groupid VALUE 'ZMM02_XSY01'.
*开启事务
CALL FUNCTION 'BDC_OPEN_GROUP'
EXPORTING
* CLIENT = SY-MANDT
* DEST = FILLER8
group = gv_session
* HOLDDATE = FILLER8
keep = 'X'
user = sy-uname
* RECORD = FILLER1
* PROG = SY-CPROG
* DCPFM = '%'
* DATFM = '%'
* IMPORTING
* QID =
EXCEPTIONS
client_invalid = 1
destination_invalid = 2
group_invalid = 3
group_is_locked = 4
holddate_invalid = 5
internal_error = 6
queue_error = 7
running = 8
system_lock_error = 9
user_invalid = 10
OTHERS = 11.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT gt_material INTO gs_material .
DATA : messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
CLEAR : bdcdata,bdcdata[],
messtab, messtab[]. "循环执行注意清空
PERFORM append_screen USING 'SAPLWBABAP' '0100'.
PERFORM append_field USING 'BDC_CURSOR' 'RS38M-PROGRAMM'.
PERFORM append_field USING 'BDC_OKCODE' '=STRT'.
PERFORM append_field USING 'RS38M-PROGRAMM' 'ZMM22004'.
PERFORM append_field USING 'RS38M-FUNC_EDIT' 'X'.
PERFORM append_screen USING 'ZMM22004' '1000'.
PERFORM append_field USING 'BDC_OKCODE' '/EENDE'.
PERFORM append_field USING 'BDC_CURSOR' 'S_LLIEF-LOW'.
PERFORM append_screen USING 'SAPLWBABAP' '0100'.
PERFORM append_field USING 'BDC_CURSOR' 'RS38M-PROGRAMM'.
PERFORM append_field USING 'BDC_OKCODE' '=LEAV'.
PERFORM append_field USING 'RS38M-PROGRAMM' 'ZMM22004'.
PERFORM append_field USING 'RS38M-FUNC_EDIT' 'X'.
CALL TRANSACTION 'MM02' USING bdcdata "使用内表调用
* OPTIONS FROM GS_OPTION " CTU_PARAMS
UPDATE 'S' "更新模式, s同步 A 异步
MODE 'A' "显示模式: A前台 N 后台 E只显示错误.
MESSAGES INTO messtab.
*向SESSION中插入事务
CALL FUNCTION 'BDC_INSERT'
EXPORTING
tcode = 'MM02'
* POST_LOCAL = NOVBLOCAL
* PRINTING = NOPRINT
* SIMUBATCH = ' '
* CTUPARAMS = ' '
TABLES
dynprotab = bdcdata
EXCEPTIONS
internal_error = 1
not_open = 2
queue_error = 3
tcode_invalid = 4
printing_invalid = 5
posting_invalid = 6
OTHERS = 7.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
*关闭SESSION
CALL FUNCTION 'BDC_CLOSE_GROUP'
EXCEPTIONS
not_open = 1
queue_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
WRITE:/ 'SESSION创建成功!'.
ENDIF.
ENDFORM.