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 . 结论:可以限制上传文件类型,能设置默认路径,默认文件