ABAP讀寫SAP服務(wù)器文件
使用方式:
1、在應(yīng)用服務(wù)器中打開文件OPEN DATASET [options]此句打開文件。如果不指定任何模式選項(xiàng),則文件將按二進(jìn)制模式打開。如果系統(tǒng)不能打開文件,則將系統(tǒng)字段SY-SUBRC設(shè)置為8,否則SY-SUBRC返回0
2、打開文件讀取OPEN DATASET FOR INPUT IN TEXT MODE ENCODING DEFAULT .(以TXT文件打開)
3、打開文件寫入OPEN DATASET FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .(以TXT文件打開寫入,這種是打開文件完全重寫)
4、打開文件追加 OPEN DATASET FOR APPENDING IN TEXT MODE ENCODING DEFAULT .(以TXT文件打開寫入,這種是打開文件追加記錄)
5、關(guān)閉應(yīng)用服務(wù)器上的文件 CLOSE DATASET .
6、刪除應(yīng)用服務(wù)器上的文件 DELETE DATASET .
7、向應(yīng)用服務(wù)器上文件上寫入數(shù)據(jù)TRANSFER to [LENGTH ].
8、向應(yīng)用服務(wù)器上文件上讀取數(shù)據(jù)READ DATASET INTO [LENGTH ].
常用事務(wù)代碼:
1.AL11,服務(wù)器上的文件
2.CG3Y 下載文件
3.CG3Z 上傳文件
以上總結(jié)來自"蠟筆小彭"博主
以下是我測試的代碼
寫入效果:

寫入后最好使用CG3Y下載上傳至SAP服務(wù)器的文件看內(nèi)容是否有問題

寫入代碼:
REPORT ztest MESSAGE-ID 00. ************************************************************************ * Tables Definitions ************************************************************************ TABLES: rlgrap. ************************************************************************ * Data Definitions 定義數(shù)據(jù) ************************************************************************ TYPES: BEGIN OF ty_file, line(1024) TYPE x, END OF ty_file. DATA: gt_file TYPE TABLE OF ty_file. DATA: gv_file_name TYPE sdbah-actid, gv_file_type TYPE sdbad-funct, gv_file TYPE xstring. ************************************************************************ * Includes Module 包含模塊 ************************************************************************ ************************************************************************ * Selection Screen 選擇屏幕 ************************************************************************ PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY. ************************************************************************ * Initialization 初始化事件 ************************************************************************ INITIALIZATION. ************************************************************************ * At Selection Screen PAI事件 ************************************************************************ AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. PERFORM frm_f4_file. ************************************************************************ * At Selection Screen Output PBO事件 ************************************************************************ AT SELECTION-SCREEN OUTPUT. ************************************************************************ * Report Format 報(bào)表格式 ************************************************************************ TOP-OF-PAGE. END-OF-PAGE. ************************************************************************ * Main Process 主要邏輯 ************************************************************************ START-OF-SELECTION. "讀取上傳文件 PERFORM frm_read_upload_file. "上傳文件至SAP服務(wù)器 PERFORM frm_upload_file_to_sap. cl_demo_output=>write( '1' ). cl_demo_output=>write( '2' ). cl_demo_output=>display( ). END-OF-SELECTION. *&---------------------------------------------------------------------* *& Form FRM_F4_FILE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_f4_file . CALL FUNCTION 'F4_FILENAME' IMPORTING file_name = p_file. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_READ_UPLOAD_FILE *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_read_upload_file . DATA: lv_file_path TYPE string, lv_file_length TYPE i, lv_file_name TYPE dbmsgora-filename. lv_file_path = p_file. lv_file_name = p_file. CALL FUNCTION 'SPLIT_FILENAME' EXPORTING long_filename = lv_file_name "上傳文件路徑 IMPORTING pure_filename = gv_file_name "文件名稱 pure_extension = gv_file_type. "文件后綴 CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = lv_file_path filetype = 'BIN' IMPORTING filelength = lv_file_length TABLES data_tab = gt_file 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. MESSAGE s001 WITH '上傳文件失敗' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_FILE_TO_SAP *&---------------------------------------------------------------------* *& text *&---------------------------------------------------------------------* *& --> p1 text *& <-- p2 text *&---------------------------------------------------------------------* FORM frm_upload_file_to_sap . DATA: ls_file TYPE ty_file. DATA: lv_folder TYPE eps2filnam. "指定目錄和文件名 lv_folder = '/hybris/FI/2023/202307/' && gv_file_name && '.' && gv_file_type. "在應(yīng)用服務(wù)器打開文件(二進(jìn)制模式) OPEN DATASET lv_folder FOR OUTPUT IN BINARY MODE. IF sy-subrc = 0. LOOP AT gt_file INTO ls_file. "向應(yīng)用服務(wù)器上文件上寫入數(shù)據(jù) TRANSFER ls_file TO lv_folder. ENDLOOP. "關(guān)閉應(yīng)用服務(wù)器文件 CLOSE DATASET lv_folder. MESSAGE s001 WITH '寫入文件成功' DISPLAY LIKE 'S'. LEAVE LIST-PROCESSING. ELSE. MESSAGE s001 WITH '在應(yīng)用服務(wù)器打開文件失敗' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. ENDFORM.
讀取效果:

讀取代碼:
TYPES: BEGIN OF ty_upload_file, file_name TYPE string, file_type TYPE string, file_size TYPE i, file TYPE xstring, END OF ty_upload_file. DATA: lt_upload_file TYPE TABLE OF ty_upload_file, ls_upload_file TYPE ty_upload_file. DATA: lt_file TYPE TABLE OF eps2fili, ls_file TYPE eps2fili, lv_folder TYPE eps2filnam. DATA: lt_binary TYPE TABLE OF rcgrepfile, ls_binary TYPE rcgrepfile. DATA: lv_file_path TYPE dbmsgora-filename, lv_file_name TYPE sdbah-actid, lv_file_type TYPE sdbad-funct. DATA: lv_msg TYPE string, lv_xstring TYPE xstring, lv_file_len TYPE i, lv_len TYPE i. "指定目錄 lv_folder = '/hybris/FI/2023/202307/'. "獲取指定目錄下所有的文件 CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING' EXPORTING iv_dir_name = lv_folder TABLES dir_list = lt_file EXCEPTIONS invalid_eps_subdir = 1 sapgparam_failed = 2 build_directory_failed = 3 no_authorization = 4 read_directory_failed = 5 too_many_read_errors = 6 empty_directory_list = 7 OTHERS = 8. IF sy-subrc <> 0. lv_msg = '讀取指定目錄下的文件失敗'. ELSE. LOOP AT lt_file INTO ls_file WHERE name CS 'pdf' AND size > 0. CLEAR: lt_binary. "文件完整的路徑 lv_file_path = lv_folder && ls_file-name. "根據(jù)文件完整的路徑獲取文件名和后綴 CALL FUNCTION 'SPLIT_FILENAME' EXPORTING long_filename = lv_file_path "上傳文件路徑 IMPORTING pure_filename = lv_file_name "文件名稱 pure_extension = lv_file_type. "文件后綴 "在應(yīng)用服務(wù)器打開文件(二進(jìn)制模式) OPEN DATASET lv_file_path FOR INPUT IN BINARY MODE. IF sy-subrc = 0. "按照2550長度讀取文件,讀到最后不足2550長度則跳出讀取模式 DO. CLEAR lv_len. READ DATASET lv_file_path INTO ls_binary LENGTH lv_len. IF sy-subrc <> 0. IF lv_len > 0. ADD lv_len TO lv_file_len. ENDIF. APPEND ls_binary TO lt_binary. EXIT. ENDIF. ADD lv_len TO lv_file_len. APPEND ls_binary TO lt_binary. ENDDO. ENDIF. "關(guān)閉應(yīng)用服務(wù)器文件 CLOSE DATASET lv_file_path. "二進(jìn)制轉(zhuǎn)XString CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' EXPORTING input_length = lv_file_len IMPORTING buffer = lv_xstring TABLES binary_tab = lt_binary EXCEPTIONS failed = 1 OTHERS = 2. IF sy-subrc = 0. ls_upload_file-file_name = lv_file_name. ls_upload_file-file_type = lv_file_type. ls_upload_file-file_size = xstrlen( lv_xstring ). ls_upload_file-file = lv_xstring. APPEND ls_upload_file TO lt_upload_file. CLEAR ls_upload_file. ENDIF. ENDLOOP. ENDIF. cl_demo_output=>write( lv_msg ). cl_demo_output=>write( lt_upload_file ). cl_demo_output=>display( ).

浙公網(wǎng)安備 33010602011771號(hào)