ABAP 讀取文件 GUI_UPLOAD

今天看了下紫光的運維程序,又看到了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'.

TYPESbegin 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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章