SAP ABAP 面向对象编程:实现选择屏幕和 ALV 结果同屏显示
一、CL_GUI_FRONTEND_SERVICES 概述
介绍 CL_GUI_FRONTEND_SERVICES 主要操作对象为客户端本地环境,包含众多静态方法可进行各种操作。
CL_GUI_FRONTEND_SERVICES 是一个在 SAP 系统中非常实用的类,它能够对客户端本地环境进行多种操作。这个类主要针对客户端的本地 IP、文件夹、磁盘等进行操作。其中多数方法为静态方法,可以直接用 “=>” 来引用。
例如,DIRECTORY_BROWSE 方法可以浏览文件夹,DIRECTORY_CREATE 用于创建文件夹,DIRECTORY_DELETE 则可以删除文件夹。如果想要检查文件夹是否存在,可以使用 DIRECTORY_EXIST 方法。此外,DIRECTORY_LIST_FILES 能够列出文件夹内的文件列表。
在文件操作方面,FILE_COPY 可复制文件,FILE_DELETE 能删除文件,FILE_EXIST 用于判断文件是否存在。FILE_GET_ATTRIBUTES 可以获取文件属性,FILE_GET_SIZE 能够获取文件大小。而 FILE_OPEN_DIALOG 和 FILE_SAVE_DIALOG 分别可以选择打开文件浏览器和选择保存文件浏览器。
该类还能获取一些重要的客户端信息,如 GET_IP_ADDRESS 可以获取 IP 地址,GET_USER_NAME 能够获取用户名。
总的来说,CL_GUI_FRONTEND_SERVICES 为 SAP 系统与客户端本地环境的交互提供了强大的工具,使得在 SAP 开发和应用中能够更加灵活地处理本地资源。
二、常见操作案例展示
(一)文件上传与下载
在 SAP 系统中,可以使用 CL_GUI_FRONTEND_SERVICES 类进行文件的上传与下载操作。例如,在 REPORT ZHAO00001 中,可以通过调用 cl_gui_frontend_services=>file_open_dialog 方法选择要上传的文件,然后进行数据处理。对于文件下载,可以使用 cl_gui_frontend_services=>file_save_dialog 方法选择保存文件的路径,再进行下载操作。
(二)文件夹操作
使用 cl_gui_frontend_services=>DIRECTORY_CREATE 方法可以创建文件夹。例如,以下代码可以创建一个名为 'E:\TESTDIR' 的文件夹:
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_CREATE EXPORTING DIRECTORY = 'E:\\TESTDIR' CHANGING RC = RC. |
而使用 cl_gui_frontend_services=>DIRECTORY_DELETE 方法可以删除文件夹。如要删除 'E:\TESTDIR' 文件夹,可以这样写:
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_DELETE EXPORTING DIRECTORY = 'E:\\TESTDIR' CHANGING RC = RC. |
(三)文件操作
通过 cl_gui_frontend_services=>FILE_EXIST 方法可以判断文件是否存在。例如:
DATA:filename TYPE string,rc TYPE i,rc2 TYPE c. filename = 'c:/test.txt'. CALL METHOD cl_gui_frontend_services=>file_exist EXPORTING file = filename RECEIVING result = rc2. IF sy-subrc =0 AND rc2 = 'X'. CALL METHOD cl_gui_frontend_services=>file_delete EXPORTING filename = filename CHANGING rc = rc. WRITE sy-subrc. WRITE rc. else. write 'the file is not exists!'. ENDIF. |
(四)获取客户端信息
使用 cl_gui_frontend_services=>GET_IP_ADDRESS 方法可以获取客户端 IP 地址。例如:
data: myip type. CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_IP_ADDRESS RECEIVING IP_ADDRESS = myIP EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_GUI = 3 OTHERS =4. |
使用 cl_gui_frontend_services=>GET_USER_NAME 方法可以获取用户名。
(五)复制粘贴操作
CL_GUI_FRONTEND_SERVICES 类中的 CLIPBOARD_EXPORT 和 CLIPBOARD_IMPORT 方法可以实现内表与剪贴板内容的导入导出。例如,以下代码将内表内容复制到剪贴板:
DATA rc TYPE i. DATA:BEGIN OF itab OCCURS 0, line(200) TYPE c, END OF itab. itab-line = '好吧,你已经把我复制了……'. APPEND itab. CALL METHOD cl_gui_frontend_services=>clipboard_export IMPORTING data = itab[] CHANGING rc = rc. IF sy-subrc <>0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. |
而以下代码将剪贴板内容导入到内表中:
DATA rc TYPE i. DATA:BEGIN OF itab OCCURS 0, line(200) TYPE c, END OF itab. CALL METHOD cl_gui_frontend_services=>clipboard_import IMPORTING DATA = itab[] LENGTH = rc EXCEPTIONS CNTL_ERROR = 1 ERROR_NO_GUI = 2 NOT_SUPPORTED_BY_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. |
三、平台使用优势与应用场景
(一)平台使用优势
CL_GUI_FRONTEND_SERVICES 在不同平台上具有显著的使用优势。首先,其提供的众多静态方法使得在各种开发环境中都能快速、高效地与客户端本地环境进行交互。例如,在 ABAP 开发中,开发人员可以直接使用 “=>” 引用这些方法,无需复杂的对象实例化过程,大大提高了开发效率。
在跨平台性方面,CL_GUI_FRONTEND_SERVICES 的方法在不同的操作系统上表现出较好的稳定性和兼容性。无论是在 Windows 还是 Linux 等操作系统下,开发人员都可以使用相同的方法来操作客户端本地资源,降低了开发过程中因平台差异而带来的复杂性。
此外,该类提供的方法涵盖了文件、文件夹和客户端信息等多个方面的操作,为开发人员提供了一站式的解决方案。开发人员无需再寻找其他工具或方法来实现这些功能,节省了开发时间和成本。
(二)应用场景
1.文件管理
在实际业务中,CL_GUI_FRONTEND_SERVICES 可用于文件管理场景。例如,企业内部的文档管理系统可以利用该类的文件操作方法实现文件的上传、下载、复制、删除等功能。开发人员可以通过调用 FILE_COPY、FILE_DELETE 等方法,轻松实现文件的管理操作,提高企业文档管理的效率。
2.数据导入与导出
在数据导入与导出方面,该类也发挥着重要作用。例如,在 ABAP 开发中,可以使用 GUI_UPLOAD 和 GUI_DOWNLOAD 方法将文本文件或 Excel 文件读取到内表中,或者将内表中的数据导出为文件。这在数据迁移、报表生成等场景中非常实用。
以读取文本文件并用 ALV 显示为例,首先通过 CL_GUI_FRONTEND_SERVICES 的静态方法 FILE_OPEN_DIALOG 打开文件对话框,选择要上传的文本文件。然后使用 GUI_UPLOAD 方法将文本文件读取到内表中。最后,将内表中的数据在 ALV 中列出,方便用户查看和分析。
3.系统配置与个性化设置
CL_GUI_FRONTEND_SERVICES 还可以用于系统配置和个性化设置场景。例如,通过获取客户端 IP 地址和用户名,可以实现基于用户身份和位置的个性化配置。开发人员可以根据用户的 IP 地址或用户名,为用户提供特定的服务或设置特定的权限,提高系统的安全性和用户体验。
总之,CL_GUI_FRONTEND_SERVICES 在 SAP 系统开发中具有广泛的应用场景,为开发人员提供了强大的工具,帮助他们更加高效地实现各种业务需求。
FILETYPE_ALL = 'All Files (*.*)|*.*|'
FILETYPE_EXCEL = 'Microsoft Excel Files (*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|'
FILETYPE_WORD = 'Microsoft Word Files (*.DOC;*.DOCX;*.DOCM)|*.DOC;*.DOCX;*.DOCM|'
FILETYPE_TEXT = 'Text Files (*.TXT)|*.TXT|'
FILETYPE_HTML = 'HTML files (*.HTML, *.HTM)|*.HTML;*.HTM|'
FILETYPE_RTF = 'RTF Files (*.RTF)|*.RTF|'
FILETYPE_XML = 'XML (*.XML)|*.XML|'
FILETYPE_POWERPOINT = 'Microsoft PowerPoint Files (*PPT;*.PPTX;*.PPTM)|*PPT;*.PPTX;*.PPTM|'
FORM frm_f4_file_path
CHANGING i_fullpath TYPE localfile.
DATA:
lit_file_table TYPE STANDARD TABLE OF file_table, "File table
lwa_file TYPE file_table, "file table work area
l_filename TYPE string, "file name
l_path TYPE string, "path
l_fullpath TYPE string. "full file path
DATA:
lo_frontend_services TYPE REF TO cl_gui_frontend_services, "frontend services
l_return_code TYPE i, "return code
l_user_action TYPE i, "user action
l_default_name TYPE string. "default name
File name filter and default name for the upload file
l_default_name = 'tempalte.xlsx'.
CREATE OBJECT lo_frontend_services.
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
default_filename = l_default_name
file_filter = cl_gui_frontend_services=>filetype_excel
CHANGING
file_table = lit_file_table[]
rc = l_return_code
user_action = l_user_action
EXCEPTIONS
OTHERS = 4 ).
CALL METHOD lo_frontend_services->free.
IF l_user_action <> lo_frontend_services->action_cancel.
READ TABLE lit_file_table INTO lwa_file INDEX 1.
IF sy-subrc = 0.
MOVE lwa_file-filename TO i_fullpath.
ENDIF.
ENDIF.
ENDFORM.
Description
During download, the data can be transferred in different formats, depending on the value of the FILETYPE parameter.
Value range
'ASC' :
ASCII format. The table is transferred as text. Conversion exits are performed. The output format additionally depends on the parameters CODEPAGE, TRUNC_TRAILING_BLANKS, and TRUNC_TRAILING_BLANKS_EOL.
'IBM' :
ASCII format with IBM codepage conversion (DOS). This format corresponds to the 'ASC' format when using target codepage 1103. This codepage is frequently used for data exchange via floppy disk.
'DAT' :
Column-by-column transfer. With this format, the data is transferred as text as with ASC. However, no conversion exits are performed and the columns are separated by tab characters. This format generates files than can be uploaded again using gui_upload or ws_upload.
'DBF' :
Data is downloaded in dBase format. Since in this format the data types of the individual columns are stored as well, you can often avoid import problems, for example, into Microsoft Excel, especially when interpreting numeric values.
'WK1' :
Data is downloaded in Lotus 1-2-3 format.
'BIN' :
Binary format. Data is transferred binarily. There is no formatting and no codepage conversion. The data is interpreted row by row; it is not formatted by columns. Specify the data length in parameter BIN_FILESIZE. The table should consist of a column of type X, because especially in Unicode systems, the conversion of structured into binary data causes errors.
Default
'ASC'
下面的类可以对文件夹和文件进行操作:
CL_GUI_FRONTEND_SERVICES
这个类下面的方法均为静态方法,引用的时候以=>来引用方法
1:创建文件夹
参数说明:RC为返回码类型为sy-subrc。
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_CREATE
EXPORTING
DIRECTORY = 'E:\TESTDIR'
CHANGING
RC = RC.
2.文件夹的删除
下面方法删除E盘下TESTDIR文件夹
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_DELETE
EXPORTING
DIRECTORY = 'E:\TESTDIR'
CHANGING
RC = RC.
3.目录选择框
CALL METHOD CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE
EXPORTING
WINDOW_TITLE = '选择目录'
INITIAL_FOLDER = 'D:\'
CHANGING
SELECTED_FOLDER = DIRPATH."该参数为string类型
其中exporting下面的参数均为可选。可以注释掉。
以下对该类下的方法不做详细举例,只做剪短说明。
DIRECTORY_EXIST 检查指定的目录文件夹是否存在
DIRECTORY_GET_CURRENT 返回当前所在路径(个人感觉不好用)
DIRECTORY_LIST_FILES 枚举指定目录下的文件及其文件夹。其中FILE_TABLE参数为FILE_INFO类型的标准表,无表头
DIRECTORY_SET_CURRENT 设置当前活动目录(不建议使用)
EXECUTE 执行windows程序或打开windows下文件夹
FILE_COPY 文件的复制
FILE_DELETE 删除一个文件
FILE_EXIST 判断指定文件是否存在
FILE_GET_ATTRIBUTES 取得指定文件的属性(只读,隐藏,Normal,active)
FILE_GET_SIZE 返回文件大小(不好用啊)
FILE_SET_ATTRIBUTES 设置文件的属性
GET_COMPUTER_NAME 获取计算机名称
GET_DESKTOP_DIRECTORY 获取桌面所在目录
GET_DRIVE_FREE_SPACE_MEGABYTE 获取磁盘可用空间单位MB
GET_DRIVE_TYPE 获得磁盘类型(不好用)
GET_GUI_VERSION 获得gui的版本
GET_IP_ADDRESS 获取当前主机的IP地址
GET_PLATFORM 返回操作系统版本
GET_SAPGUI_WORKDIR 返回SAP GUI工作目录
GET_SAPLOGON_ENCODING 获取SAP登陆的代码页
GET_SYSTEM_DIRECTORY 获得系统目录
GET_TEMP_DIRECTORY 获取TEMP目录
GET_UPLOAD_DOWNLOAD_PATH 获得上传和下载文件的路径
GET_USER_NAME 获得用户名
GET_WINDOWS_DIRECTORY 取得windows目录路径
IS_TERMINAL_SERVER 检查GUI是否在终端服务器上运行
REGISTRY_DELETE_KEY 删除注册KEY
REGISTRY_DELETE_VALUE 删除注册key值
cl_gui_frontend_services=>file_open_dialog文件类型过滤
>file_open_dialog打开文件选择框时,可以输入file_filter参数,来限定和过滤文件选择框内的文件类型。 =
常用的文件类型如下:
FILETYPE_ALL = 'All Files (*.*)|*.*|'
FILETYPE_EXCEL = 'Microsoft Excel Files (*.XLS;*.XLSX;*.XLSM)|*.XLS;*.XLSX;*.XLSM|'
FILETYPE_WORD = 'Microsoft Word Files (*.DOC;*.DOCX;*.DOCM)|*.DOC;*.DOCX;*.DOCM|'
FILETYPE_TEXT = 'Text Files (*.TXT)|*.TXT|'
FILETYPE_HTML = 'HTML files (*.HTML, *.HTM)|*.HTML;*.HTM|'
FILETYPE_RTF = 'RTF Files (*.RTF)|*.RTF|'
FILETYPE_XML = 'XML (*.XML)|*.XML|'
FILETYPE_POWERPOINT = 'Microsoft PowerPoint Files (*PPT;*.PPTX;*.PPTM)|*PPT;*.PPTX;*.PPTM|'
可以在类cl_gui_frontend_services的属性中找到,
FORM open_file .
"p_file
DATA:lt_files TYPE filetable.
DATA:wa_files TYPE file_table.
DATA:lv_subrc TYPE i.
DATA:lv_user_action TYPE i.
cl_gui_frontend_services=>file_open_dialog(
EXPORTING
file_filter = cl_gui_frontend_services=>filetype_excel
multiselection = space
CHANGING
file_table = lt_files
rc = lv_subrc
user_action = lv_user_action
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5 ).
IF lv_user_action EQ 0.
READ TABLE lt_files INTO wa_files INDEX 1.
IF sy-subrc EQ 0.
p_file = wa_files-filename.
ENDIF.
ENDIF.
" OPEN_FILE
FORM frm_screen .
DATA:result TYPE c.
DATA:lv_answer TYPE c.
DATA:rc TYPE i.
CALL METHOD cl_gui_frontend_services=>directory_exist
EXPORTING
directory = p_file
RECEIVING
result = result
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
wrong_parameter = 3
not_supported_by_gui = 4
OTHERS = 5.
IF result = ''."不存在路径是否创建
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
text_question = '不存在文件是否创建?'
text_button_1 = '是'(001)
text_button_2 = '否'(002)
IMPORTING
answer = lv_answer
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
ENDIF.
CASE lv_answer.
WHEN '1'."是
CALL METHOD cl_gui_frontend_services=>directory_create
EXPORTING
directory = p_file
CHANGING
rc = rc
EXCEPTIONS
directory_create_failed = 1
cntl_error = 2
error_no_gui = 3
directory_access_denied = 4
directory_already_exists = 5
path_not_found = 6
unknown_error = 7
not_supported_by_gui = 8
wrong_parameter = 9
OTHERS = 10.
IF sy-subrc <> 0.
MESSAGE '文件夹创建失败请重新选择目录' TYPE 'E'.
ENDIF.
WHEN 'A' OR '2'."取消 否
STOP.
WHEN OTHERS.
ENDCASE.
ENDIF.
" FRM_SCREEN
CALL METHOD cl_gui_frontend_services=>directory_browse
EXPORTING
window_title = '数据备份路径'
initial_folder = p_file
CHANGING
selected_folder = p_file
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
ENDIF.
*&---------------------------------------------------------------------*
Report ZHOUJH_GET_DESKTOP_DIRECTORY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZHOUJH_GET_DESKTOP_DIRECTORY.
"GET_DESKTOP_DIRECTORY
PARAMETERS:P_FILE TYPE LOCALFILE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
PERFORM SUB_FILE_F4. "* To provide F4 help for the file
*&---------------------------------------------------------------------*
Form SUB_FILE_F4
*&---------------------------------------------------------------------*
F4 help for file path
*----------------------------------------------------------------------*
FORM SUB_FILE_F4 .
DATA:
L_DESKTOP TYPE STRING,
L_I_FILES TYPE FILETABLE,
L_WA_FILES TYPE FILE_TABLE,
L_RCODE TYPE INT4.
Finding desktop
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_DESKTOP_DIRECTORY
CHANGING
DESKTOP_DIRECTORY = L_DESKTOP
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
MESSAGE E001(00) WITH
not found'.
ENDIF.
Update View
CALL METHOD CL_GUI_CFW=>UPDATE_VIEW
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2
OTHERS = 3.
DATA: L_USERACTION TYPE I.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE = 'Select Excel file'
DEFAULT_EXTENSION = '.xls'
default_filename =
FILE_FILTER = '.xls'
with_encoding =
INITIAL_DIRECTORY = L_DESKTOP
multiselection =
CHANGING
FILE_TABLE = L_I_FILES
RC = L_RCODE
USER_ACTION = L_USERACTION
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.
MESSAGE E001(00) WITH 'Error while opening file'.
ENDIF.
READ TABLE L_I_FILES INDEX 1 INTO L_WA_FILES.
IF SY-SUBRC = 0.
P_FILE = L_WA_FILES-FILENAME.
ELSE.
EXIT.
ENDIF.
" SUB_FILE_F4