SAP在做大批量处理数据的时候,需要和本地文件交互,以获取文件的路径,系统根据路径读取文件内容到内存中。有三种实现的方式

1、最原始的方式就是将路径写死,直接写入变量中,这样也无从谈及文件交互。简单粗暴的同时也将程序的灵活性直接归零。

2、在程序界面中给用户一个输入框,让用户手动写入文件地址。虽然程序的灵活性有了一定的提升,但是由于是用户直接输入路径,

     难免存在错误,从而导致程序在读取文件路径时出错,大大提升了人工作业成本。

3、在程序界面给用户一个输入框,并能够点击按钮后打开一个对话框,用户直接点击鼠标就可以获取到文件类型,

     在这个对话框中能够做一些限定条件,过滤掉某些条件。也程序是最常采用的方式。

代码如下:

 PARAMETERS P_FILE LIKE RLGRAP-FILENAME .   "定义输入框
	AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. "触发检验条件
		PERFORM FRM_GET_FILE.
FORM FRM_GET_FILE.
  DATA: lt_filetab TYPE filetable,
            l_rc       TYPE i.
           CLEAR lt_filetab.
           REFRESH lt_filetab.
    CALL METHOD cl_gui_frontend_services=>file_open_dialog
       EXPORTING
         window_title            = '打开.xls文件' "弹出对话框的抬头
 "       default_extension       = '*.xls'"默认的扩展名
         default_filename        = '123'  "默认的文件名
         file_filter             = cl_gui_frontend_services=>FILETYPE_EXCEL "只显示某中文件类型
*        with_encoding           =
         initial_directory       = 'd:\TEXT' ""默认打开文件地址
*         multiselection          = abap_false "是否可以选择多个文件
      CHANGING
        file_table              = lt_filetab
        rc                      = l_rc
*        user_action             =
*        file_encoding           =
*      EXCEPTIONS
*        file_open_dialog_failed = 1
*        cntl_error              = 2
*        error_no_gui            = 3
*        not_supported_by_gui    = 4
*        others                  = 5
            .
    IF sy-subrc <> 0.
*     Implement suitable error handling here
    ENDIF.

  CHECK l_rc EQ 1.

  READ TABLE lt_filetab INDEX 1 INTO P_FILE .

ENDFORM.
START-OF-SELECTION.
write: P_FILE.

从上面的代码中可以看出,除了file_filter这个字段比较有用的话,其他字段设置默认即可。

但是我们手动添加这些代码的话会比较麻烦,所以SAP很贴心的给我们封装了这些变量,

查询CL_GUI_FRONTEND_SERVICES属性就能查询到一下常量。

FILETYPE_ALL

FILETYPE_TEXT

FILETYPE_XML

FILETYPE_HTML

FILETYPE_EXCEL

FILETYPE_RTF

FILETYPE_WORD

FILETYPE_POWERPOINT

他们值如下:

FILETYPE_ALL = 'All Files (*.*)|*.*|'

FILETYPE_TEXT = 'Text Files (*.TXT)|*.TXT|'

FILETYPE_XML = 'XML (*.XML)|*.XML|'

FILETYPE_HTML = 'HTML files (*.HTML, *.HTM)|*.HTML;*.HTM|'

FILETYPE_EXCEL = 'Microsoft Excel Files (*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|'

FILETYPE_RTF = 'RTF Files (*.RTF)|*.RTF|'

FILETYPE_WORD = 'Microsoft Word Files (*.DOC;*.DOCX;*.DOCM)|*.DOC;*.DOCX;*.DOCM|'

FILETYPE_POWERPOINT = 'Microsoft PowerPoint Files (*PPT;*.PPTX;*.PPTM)|*PPT;*.PPTX;*.PPTM|'

除了使用cl_gui_frontend_services这类让SAP和本地文件交互外还有其他方法实现,不过底层还是调用

cl_gui_frontend_services=>FILETYPE_EXCEL实现的。

CALL FUNCTION 'F4_FILENAME'

CALL FUNCTION 'WS_FILENAME_GET'

CALL FUNCTION 'KD_GET_FILENAME_ON_F4'

CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'

GUI_FILE_LOAD_DIALOG

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      PROGRAM_NAME        = SYST-CPROG
      DYNPRO_NUMBER       = SYST-DYNNR
      FIELD_NAME          = ' '
    IMPORTING
      FILE_NAME           = P_FILE .

结论:不能限制上传文件类型



CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME           = ' '
      DEF_PATH = 'D:\'
      MASK     = ',All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc'
*     MODE     = ' '
*     TITLE    = ' '
    IMPORTING
      FILENAME = P_FILE
     "RC       =
 EXCEPTIONS
     INV_WINSYS             = 1
     NO_BATCH = 2
     SELECTION_CANCEL       = 3
     SELECTION_ERROR        = 4
     OTHERS   = 5 .

结论可以限制上传文件类型,能设置默认路径,默认文件,增加抬头

CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
  EXPORTING
*   PROGRAM_NAME        = SYST-REPID
*   DYNPRO_NUMBER       = SYST-DYNNR
*   FIELD_NAME          = ' '
*   STATIC              = ' '
    MASK                = 'Microsoft Excel Files (*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|'
*   FILEOPERATION       = 'R'
*   PATH                =
  CHANGING
    file_name           = P_FILE
*   LOCATION_FLAG       = 'P'
* EXCEPTIONS
*   MASK_TOO_LONG       = 1
*   OTHERS              = 2
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
结论 :可以限制上传文件类型,不能设置默认路径


data: ld_path type char40,
         ld_file type char40.

CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME           = ' '
      DEF_PATH = 'D:\'
      MASK     = 'All Files (*.*)|*.*|Excel Files (*.xls)|*.xls|Word files(*.doc)|*.doc'
*     MODE     = ' '
*     TITLE    = ' '
    IMPORTING
      FILENAME = P_FILE
    path =                       ld_path
    file =                       ld_file
* EXCEPTIONS
*     SELECTION_CANCEL       = 1
*     SELECTION_ERROR        = 2
*     OTHERS   = 3
    .
结论:可以限制上传文件类型,能设置默认路径,默认文件

Comments are closed.

Post Navigation