SAP 中的读取及上传文件方法总结
*&---------------------------------------------------------------------*
*& Form GET_DATA : old method , only for local PC path
*&---------------------------------------------------------------------*
FORM GET_DATA.
data: lv_count type I.
clear:lv_filename.
CALL FUNCTION 'KCD_FRONT_END_DIRECTORY_READ'
EXPORTING
I_PATH = filepath
* IMPORTING
* E_PURE_PATH = L_PURE_PATH
TABLES
E_DIRECTORY = L_DIRECTORY
EXCEPTIONS
DOWNLOAD = 1
UPLOAD = 2
EXECUTE = 3
DIRECTORY_NOT_EXIST = 4
DIRECTORY = 5
OTHERS = 6.
itab_filename[] = L_DIRECTORY[].
loop at itab_filename.
lv_tabix = sy-tabix.
SHIFT itab_filename-name UP TO '.'.
if itab_filename-name <> '.txt'.
delete itab_filename index lv_tabix.
endif.
ENDLOOP.
DESCRIBE table itab_filename lines lv_count.
if lv_count > 0.
concatenate 'pa_eform_' s_key into lv_filename.
loop at itab_filename.
lv_tabix = sy-tabix.
SEARCH itab_filename-name for lv_filename.
if sy-subrc ne 0.
DELETE itab_filename INDEX lv_tabix.
endif.
endloop.
endif.
DESCRIBE table itab_filename lines lv_count.
if lv_count = 1.
clear:itab_filename.
clear: data_tab[].
READ TABLE itab_filename index 1.
concatenate filepath '/' itab_filename-name into lv_filename.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME = lv_filename
FILETYPE = 'DAT'
HAS_FIELD_SEPARATOR = SPACE
HEADER_LENGTH = 0
READ_BY_LINE = 'X'
DAT_MODE = SPACE
CODEPAGE = SPACE
replacement = '#'
changing
data_tab = data_tab "itab_text
exceptions
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
no_authority = 6
unknown_error = 7
bad_data_format = 8
unknown_dp_error = 12
access_denied = 13
others = 17.
elseif lv_count > 1.
concatenate 'More than one pa_eform_' s_key '*.txt found' into lv_err_message.
lv_show_message = 'X'.
lv_err_flag = 'X'.
else. " lv_count = 0
concatenate 'pa_eform_' s_key '*.txt not found' into lv_err_message.
lv_show_message = 'X'.
lv_err_flag = 'X'.
endif.
check lv_err_flag ne 'X'.
clear lv_count.
DESCRIBE table data_tab lines lv_count.
if lv_count = 0.
concatenate 'No record found in file: ' lv_filename into lv_err_message.
clear lv_show_message.
lv_err_flag = 'X'.
endif.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form Get_FileName_ByPath
*&---------------------------------------------------------------------*
FORM Get_FileName_ByPath Using p_filepath
changing p_filename.
*"initial
MOVE '*' TO A_GENERIC_NAME.
classtype = ''. "help to the the file name
a_dir_name = p_filepath.
TRANSLATE a_dir_name TO LOWER CASE.
*"End
CALL 'C_DIR_READ_FINISH' " just to be sure
ID 'ERRNO' FIELD FILE_LIST-ERRNO
ID 'ERRMSG' FIELD FILE_LIST-ERRMSG.
CALL 'C_DIR_READ_START' ID 'DIR' FIELD A_DIR_NAME
ID 'FILE' FIELD A_GENERIC_NAME
ID 'ERRNO' FIELD FILE-ERRNO
ID 'ERRMSG' FIELD FILE-ERRMSG.
IF SY-SUBRC <> 0.
lv_err_message = 'No authorization to read the system folder.'.
lv_err_flag = 'X'.
lv_show_message = 'X'.
ELSE.
DO.
CLEAR FILE.
CALL 'C_DIR_READ_NEXT'
ID 'TYPE' FIELD FILE-TYPE
ID 'NAME' FIELD FILE-NAME
ID 'LEN' FIELD FILE-LEN
ID 'OWNER' FIELD FILE-OWNER
ID 'MTIME' FIELD FILE-MTIME
ID 'MODE' FIELD FILE-MODE
ID 'ERRNO' FIELD FILE-ERRNO
ID 'ERRMSG' FIELD FILE-ERRMSG.
FILE-DIRNAME = A_DIR_NAME.
MOVE SY-SUBRC TO FILE-SUBRC.
CASE SY-SUBRC.
WHEN 0.
WHEN 1.
EXIT.
WHEN OTHERS. " SY-SUBRC >= 2
ADD 1 TO ERRCNT.
IF ERRCNT > 10.
EXIT.
ENDIF.
IF SY-SUBRC = 5.
MOVE: '???' TO FILE-TYPE,
'???' TO FILE-OWNER,
'???' TO FILE-MODE.
ENDIF.
ENDCASE.
PERFORM P6_TO_DATE_TIME_TZ(RSTR0400) USING FILE-MTIME
FILE-MOD_TIME
FILE-MOD_DATE.
MOVE-CORRESPONDING FILE TO itab_filename.
APPEND itab_filename.
ENDDO.
CALL 'C_DIR_READ_FINISH'
ID 'ERRNO' FIELD FILE_LIST-ERRNO
ID 'ERRMSG' FIELD FILE_LIST-ERRMSG.
IF SY-SUBRC <> 0.
lv_err_flag = 'X'.
ENDIF.
ENDIF.
* end of file information retrival
*"---------------
if lv_err_flag ne 'X'.
loop at itab_filename.
lv_tabix = sy-tabix.
concatenate 'pa_eform_' s_key '*.txt' into p_filename.
if itab_filename-name np p_filename.
delete itab_filename index lv_tabix.
endif.
endloop.
clear lv_count.
describe table itab_filename lines lv_count.
if lv_count > 1.
concatenate 'More than one pa_eform_' s_key '*.txt found' into lv_err_message.
lv_show_message = 'X'.
lv_err_flag = 'X'.
elseif lv_count = 0.
concatenate 'pa_eform_' s_key '*.txt not found' into lv_err_message.
lv_show_message = 'X'.
lv_err_flag = 'X'.
else.
read table itab_filename index 1.
p_filename = itab_filename-name.
endif.
endif.
ENDFORM. " Get_FileName_ByPath
*&---------------------------------------------------------------------*
*& Form Get_Data_ByFile : for Network path
*&---------------------------------------------------------------------*
FORM Get_Data_ByFile Using p_fullfilename.
*"Open file "LEGACY TEXT MODE BIG ENDIAN."
open dataset p_fullfilename for input in TEXT MODE ENCODING UTF-8. "DEFAULT.
if sy-subrc ne 0.
lv_err_message = 'Can not get this file, pls check the file name, or Authorization'.
lv_show_message = 'X'.
lv_err_flag = 'X'.
else.
* read dataset p_fullfilename into lv_string.
Do.
clear lv_string.
read dataset p_fullfilename into lv_string.
If sy-subrc ne 0.
exit. " exit Do loop
EndIf.
* " read one line text into it_temp split by TAB
split lv_string at CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
into table it_temp.
* " assign every column to itab_text from it_temp
clear itab_text.
loop at it_temp.
assign COMPONENT sy-tabix of structure itab_text to <f1>.
<f1> = it_temp-line.
* write:/ <f1>.
endloop.
* " for UTF-8, replace special char
do g_fffe_count times.
ASSIGN itab_text-APPRAISAL_ID+0(1) TO <x_fffe> CASTING.
clear g_fffe_str.
write <x_fffe> to g_fffe_str.
if g_fffe_str eq 'FFFE' or g_fffe_str eq '1A00'.
Shift itab_text-APPRAISAL_ID left by 1 places.
else.
exit. " exit Do loop
endif.
enddo.
*------------------
if strlen( itab_text ) > 1.
append itab_text.
endif.
clear itab_text.
EndDo.
endif.
close dataset p_fullfilename.
check lv_err_flag ne 'X'.
clear lv_count.
DESCRIBE table itab_text lines lv_count.
if lv_count = 0.
concatenate 'No record found in file: ' p_fullfilename into lv_err_message.
clear lv_show_message.
lv_err_flag = 'X'.
endif.
ENDFORM.