今天看了下紫光的營運程式,又看到了WS_UPLOAD這個函數,想到還看過一個類cl_gui_frontend_services,它裡面也有一些靜態方法可以上傳檔案。今天就研究了下他們之間的區別還有類cl_gui_frontend_services。總結如下:
1. cl_gui_frontend_services類
這個類提供了很多對作業系統檔案的操作,例如拷貝,列出檔案名稱等等。這些方法和java裡還有我寫過的VBA裡那些放都差不多,所以以後如果要有一些對檔案的操作可以用這個類提供的靜態方法。順便說下TEST_FRONTEND_SERVICES在IDES是個範常式序可以在裡面看看,不過唯寫了幾個方法的運用。
2.WS_UPLOAD和GUI_UPLOAD
這兩者的區別我就從今天碰到的一個問題裡用現象去表明他們的區別吧,從底層代碼看太痛苦了。我寫了一個小的測試程式用來讀取一個txt文本,再輸出list中。txt文本是中文的。我分別用WS_UPLOAD和GUI_UPLOAD實現,發現怎樣都實現不了,只能實現英文。我覺得這不可能了啊!裝了Unicode不可能讀不了中文的,後來在同事的提醒下用中文登陸系統程式就可以實現了!可是我覺得仍然不對,在英文系統下也應該能讀中文,畢竟GUI和server都有Unicode,在參數列表裡我發現了code page這個參數,於是我加上code page = '8400' 。呵呵,終於發現可以在英文登陸狀態下上傳中文文本了,不過使用WS_UPLOAD仍然不能上傳中文,而GUI_UPLOAD此時就可以。
我又查閱了相關資料果然,WS_UPLOAD是一個要被GUI_UPLOAD替代的funtion,所以以後寫程式就都用GUI_UPLOAD就好了。
3.調用GUI_UPLOAD的兩種方式
GUI_UPLOAD雖然是cl_gui_frontend_services類的靜態方法但是也可以用function的方法調用!SAP估計將某些靜態方法封裝了一層所以就可以用調用函數的方式調用GUI_UPLOAD方法。我又測試了下GUI_DOWNLOAD和GET_WINDOWS_DIRECTORY,不過只有GUI_DOWNLOAD可以用函數調用。看來不是所有的靜態方法都可以用函數調用。下面的代碼提供了一個簡單的調用GUI_UPLOAD的代碼:
data: filename type string VALUE 'd:ToolsReadme.txt'.
TYPES: begin of itab,
fl1(300) type c,
end of itab.
DATA: data_tab type STANDARD TABLE OF itab,
wa_tab LIKE LINE OF data_tab.
call method cl_gui_frontend_services=>gui_upload
exporting
filename = filename
filetype = 'ASC'
codepage = '8400'
changing
data_tab = data_tab
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.
LOOP AT data_tab INTO wa_tab.
WRITE:/ wa_tab-fl1.
ENDLOOP.
經測試讀取中文文檔是沒有問題的,但是filetype是不能設定為BIN。
4.分享小程式
這是在SDN上尋找資料的過程中發現的,覺得比較有啟發的程式。完成的功能是開啟一個對話方塊,選擇多個檔案,接著將這些檔案名稱列印輸出。程式如下:
SELECT-OPTIONS: so_file FOR file_table NO INTERVALS.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR so_file-low.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
* WINDOW_TITLE =
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
initial_directory = 'e:study'
multiselection = 'X'
CHANGING
file_table = lt_file_names[]
rc = lv_subrc
* USER_ACTION =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
so_file-sign = 'I'.
so_file-option = 'EQ'.
LOOP AT lt_file_names INTO lwa_file_name.
so_file-low = lwa_file_name.
APPEND so_file.
ENDLOOP.
START-OF-SELECTION.
LOOP AT so_file.
WRITE: / so_file-low.
ENDLOOP.