ABAP中文件上传(转)

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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/donkey2004112103/archive/2008/10/27/3159854.aspx

原文地址:https://www.cnblogs.com/weichuo/p/1684140.html