在 selection screen 中,经常要用到文件相关的对话框,比如选择本地文件上传,将数据从 iternal table 下载到本地等,为了增加程序的友好性,需要用到文件相关的对话框。

KD_GET_FILENAME_ON_F4

这个函数比较简单,只需要提供一个参数 file_name。

PARAMETERS: p_file TYPE localfile OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_get_filepath USING p_file.
START-OF-SELECTION.
  WRITE: / p_file.
FORM frm_get_filepath USING p_file TYPE localfile.
  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    EXPORTING
      static       = ''
      mask         = ',All Files(*.*),*.*,'
    CHANGING
      file_name    = p_file.
ENDFORM.

WS_FILENAME_GET

该函数的作用也是提供文件对话框,返回文件的完整路径。SAP 对这个函数已经标注为过时 (obosete)。所以不建议在代码中使用。

FORM frm_get_filepath USING p_file TYPE localfile.
  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path     = 'default_path'
      mask         = ',All Files(*.*),*.*,'
      mode         = '0' "0 For read"
    IMPORTING
      filename     = p_file
    EXCEPTION
      inv_winsys   = 1
      no_batch     = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS       = 5.
ENDFORM.

F4_FILENAME

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CALL FUNCTION 'F4_FILENAME'
    IMPORTING 
      file_name = p_file.

FILE_OPEN_DIALOG

cl_gui_frontend_services 类的静态方法 file_open_dialog 方法提供对话框的方式获取文件的完整路径。这个方法功能比较强大,比如可以修饰文件选择框,指定默认选择路径,设置文件类型过滤,同时打开多个文件,返回用户操作等。RC 是返回值, 如果成功获取文件名,返回值 rc 值为 1。

FORM frm_get_filepath USING p_file TYPE localfile.
  DATA: l_files TYPE filetable,
        l_file  TYPE LINE OF filetable,
        rc LIKE sy-subrc.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title          = 'File Select'
      initial_directory     = 'default_path'
      default_extension     = '*.xls'
      file_filter           = 'All Files (*.*)|*.*|Excel Files (*.xls)|*.xls'
    CHANGING
      file_table            = l_files
      rc                    = rc
    EXCEPTION
      file_open_dialog_failed   = 1
      cntl_error                = 2
      error_no_gui              = 3
      no_supported_by_gui       = 4
      OTHERS                    = 5.
  IF sy-subrc = 0 AND rc = 1.
    READ TABLE l_files INTO l_file INDEX 1.
    p_file = l_file.
  ENDIF.
ENDFORM.