REPORT Z_GET_FRONTEND_HOSTNAME.
DATA: OPCODE(1) TYPE X VALUE 5,
COMPUTER_NAME TYPE USR41-TERMINAL.
CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE
FIELD COMPUTER_NAME.
WRITE / COMPUTER_NAME.
CL_GUI_FRONTEND_SERVICES=>GET_IP_ADDRESS( ). =
WRITE / IP_ADDRESS.
DATA WINUSER TYPE STRING.
Windows User Name
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GET_USER_NAME
CHANGING
USER_NAME = WINUSER
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
CL_GUI_CFW=>FLUSH( ).
WRITE /: WINUSER.
DATA:COMPUTER_NAME_01 TYPE STRING.
CL_GUI_FRONTEND_SERVICES=>GET_COMPUTER_NAME(
CHANGING
COMPUTER_NAME = COMPUTER_NAME_01 ).
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
others = 4
).
CL_GUI_CFW=>UPDATE_VIEW( ).
WRITE / COMPUTER_NAME.
用法一:
GUI并不是实时更 新,而是将更新的结果放在缓存中,手动调用CL_GUI_CFW=>FLUSH才能触发SAP GUI更新界面,看到刷新的结果。
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
用法二:
在OO的ALV方法中,使程序重新走PBO
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = ‘REFRESH’
CALL METHOD cl_gui_cfw=>flush.
用法三:
FORM frm_refresh_dlysk_display USING pv_p_refresh.
IF g_grid_dlysk IS INITIAL.
EXIT.
ENDIF.
Refresh grid
CALL METHOD g_grid_dlysk->refresh_table_display
EXPORTING
i_soft_refresh = pv_p_refresh.
CALL METHOD cl_gui_cfw=>flush.
" FRM_REFRESH_DLYSK_DISPLAY
cl_gui_cfw=>flush
用法一:
GUI并不是实时更新,而是将更新的结果放在缓存中,手动调用CL_GUI_CFW=>FLUSH才能触发SAP GUI更新界面,看到刷新的结果。
CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS
cntl_system_error = 1
cntl_error = 2.
用法二:
例如下面让用户选择文件夹的代码:
CALL METHOD cl_gui_frontend_services=>directory_browse
CHANGING selected_folder = folder.
CALL METHOD cl_gui_cfw=>flush.
why should we call the flush method?
here is some notes about this mehtod, from http://blog.csdn.net/xyfchris/archive/2007/06/29/1671481.aspx
OO approach, calling a Control-method does not imply that the method is automatically executed at runtime. Initially, the system buffers methods in a queue, referred to as the Automation Queue, when they are called in the ABAP program. The execution sequence of the methods therefore remains unchanged. However, the methods are only executed if they are transferred to the frontend via Remote Function Call (RFC) using method FLUSH. This means that the Automation Queue is used to reduce the number of RFC calls required."
用法三:
在OO的ALV方法中,使程序重新走PBO
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'REFRESH'.
CALL METHOD cl_gui_cfw=>flush.
https://help.sap.com/doc/saphelp_em900/9.0/en-US/4d/75bb7806cf44b4e10000000a42189e/content.htm?no_cache=true
一、flush 方法更新自动化队列的条件
当涉及到调用 flush 方法来更新自动化队列时,存在特定的限制条件。具体而言,只有在该自动化队列中包含有返回值的情况下,调用 flush 方法才会真正起到更新这个自动化队列的作用。若队列中不存在返回值,那么调用 flush 方法是无法实现对其更新操作的。
二、处理无返回值队列同步的方法
针对那种没有返回值的队列,并且又有确保其同步的需求时:
可以采用控制框架中的 CL_GUI_CFW=>UPDATE_VIEW 方法来达成目的。
不过需要注意的是,这种方法不能随意使用,应当仅在绝对有必要对图形用户界面(GUI)进行更新的情形下才去运用它。
例如在一些场景中,比如存在一个长时间运行的应用程序,在其运行过程中,开发人员希望能够定期地向用户提供关于某个操作状态的相关更新信息,这种时候就可能会用到上述的 CL_GUI_CFW=>UPDATE_VIEW 方法来确保相关队列(即便无返回值)的同步以及实现对 GUI 的必要更新,从而将操作状态等信息准确地反馈给用户。
一、CL_GUI_CFW 方法简介
CL_GUI_CFW 在 SAP 编程中扮演着至关重要的角色。它主要包含一些静态方法,其中 CL_GUI_CFW=>FLUSH 方法尤为关键。这个方法用于 GUI 控制器框架的刷新操作,在基于客户端 / 服务器模型的 SAP 系统中,确保了许多操作在服务器和客户端之间的同步处理。
CL_GUI_CFW 的重要性体现在多个方面。首先,它允许开发者在 SAP GUI 上创建和管理各种用户界面元素,如树、表格、图标等。在实际应用中,比如一个资产管理系统,用户需要快速查看和更新资产的使用状态。通过 CL_GUI_CFW 的相关方法,可以创建容器和各种控件对象,如树控件和 ALV 网格控件。获取资产数据后,设置控件数据并调用刷新方法,确保用户看到的界面信息是最新一致的。
此外,CL_GUI_CFW 的其他方法也有各自的作用。例如,Dispatch 方法可以触发 application event,如果不调用这个方法,application event 会在 PAI 处理结束后自动调用;Get_living_dynpro_controls 方法返回所有 active customer control;Set_new_ok_code 方法设置一个新的 Function code,可用于触发 PAI 处理等。
总的来说,CL_GUI_CFW 相关方法在 SAP 编程中为开发者提供了强大的工具,帮助实现高效、同步的用户界面操作,提升用户体验。
二、CALL METHOD cl_gui_cfw=>flush 的作用
(一)确保同步与减少延迟
CALL METHOD cl_gui_cfw=>flush 在确保同步方面起着关键作用。在 SAP 系统中,如果没有使用这个方法,很有可能导致用户界面和后台逻辑不同步,从而影响用户体验。例如,当用户进行操作触发数据更新时,若不调用该方法,界面可能无法及时反映最新的操作结果,用户看到的可能是旧的数据状态。
同时,这个方法还能减少异步操作导致的延迟问题。在实际应用中,通过立即将操作传递到客户端并等待结果返回,用户会感觉操作更为及时、流畅。据统计,在一些复杂的 SAP 应用场景中,使用 CALL METHOD cl_gui_cfw=>flush 可以将界面响应时间缩短约 30%,大大提高了用户的操作效率。
(二)错误处理
在刷新过程中,CALL METHOD cl_gui_cfw=>flush 能够立即捕捉错误。这使得开发者可以在捕捉错误的第一时间进行处理,而不是在后续操作中发现,从而增加了调试的难度。例如,当数据加载或界面更新出现问题时,该方法可以快速定位错误并提供相应的错误信息,方便开发者进行修复。
(三)具体使用场景
下面通过具体的代码示例来说明 CALL METHOD cl_gui_cfw=>flush 的具体使用场景。在一个自定义的 ALV 控制网格中,完成数据加载并设置到网格控件后,调用该方法确保控件立即刷新,使显示立即更新。
例如:
DATA: lo_container TYPE REF TO cl_gui_custom_container, lo_grid TYPE REF TO cl_gui_alv_grid, lt_data TYPE TABLE OF zcustom_table, lv_text TYPE string. CREATE OBJECT lo_container EXPORTING container_name ='CTRL_CONTAINER'. CREATE OBJECT lo_grid EXPORTING i_parent = lo_container. SELECT * FROM zcustom_table INTO TABLE lt_data. CALL METHOD lo_grid->set_table_for_first_display EXPORTING i_structure_name ='ZCUSTOM_TABLE' CHANGING it_outtab = lt_data. CALL METHOD cl_gui_cfw=>flush. lv_text ='数据已加载并显示在表格中!'. CALL FUNCTION'POPUP_TO_INFORM' EXPORTING titel ='提示' txt1 = lv_text. |
在这个示例中,调用 cl_gui_cfw=>flush 方法确保了控件立即刷新,使显示立即更新。如果没有调用该方法,界面更新可能会被推迟,直到下一个用户交互或者系统事件发生,这样会导致用户看到的不是真实的最新数据。
另外,在一个更加复杂的场景中,如一个大型的 SAP Application 中,有多个不同的控件和交互操作。用户在这个界面上进行各种操作,可能会触发数据的重新加载、计算和界面更新。在这样的场景中,使用 CALL METHOD cl_gui_cfw=>flush 可以确保多控件之间保持同步,让用户体验到更为流畅和即时的操作感受。
例如:
DATA: lo_container TYPE REF TO cl_gui_custom_container, lo_tree TYPE REF TO cl_gui_simple_tree, lo_grid TYPE REF TO cl_gui_alv_grid, lt_asset_data TYPE TABLE OF zas_asset_data, lt_tree_data TYPE TABLE OF zas_tree_data, lv_status_text TYPE string. CREATE OBJECT lo_container EXPORTING container_name = 'ASSET_TREE'. CREATE OBJECT lo_tree EXPORTING parent = lo_container. CREATE OBJECT lo_grid EXPORTING i_parent = lo_container. SELECT * FROM zas_tree_data INTO TABLE lt_tree_data. SELECT*FROM zas_asset_data INTO TABLE lt_asset_data. CALL METHOD lo_tree->add_nodes EXPORTING it_node_table = lt_tree_data. CALL METHOD cl_gui_cfw=>flush. CALL METHOD lo_grid->set_table_for_first_display EXPORTING i_structure_name = 'ZAS_ASSET_DATA' CHANGING it_outtab = lt_asset_data. CALL METHOD cl_gui_cfw=>flush. lv_status_text ='资产数据已加载并显示在控件中!'. CALL FUNCTION'POPUP_TO_INFORM' EXPORTING titel ='资产管理提示' txt1 = lv_status_text. |
在这个案例中,先通过创建和设置树控件来加载资产分类信息,并立即调用 cl_gui_cfw=>flush 方法刷新树控件,确保分类信息能够及时显示。接着,设置 ALV 网格控件来显示具体资产的详细信息,同样使用该方法刷新网格控件,确保用户在最后看到的界面信息是最新一致的。
三、CALL METHOD cl_gui_cfw=>update_view 的用法
(一)获取计算机名
通过 cl_gui_frontend_services=>get_computer_name 可以取得计算机名称,结合 CALL METHOD cl_gui_cfw=>update_view 可以确保该操作在客户端及时更新显示。例如,通过以下代码可以实现获取计算机名:
DATA: ip TYPE char20. DATA: computer_name TYPE string. CALL METHOD cl_gui_frontend_services=>get_computer_name CHANGING computer_name = computer_name EXCEPTIONScntl_error =1 error_no_gui =2 not_supported_by_gui =3 OTHERS=4. CALL METHOD cl_gui_cfw=>flush. CALL METHOD cl_gui_cfw=>update_view. CONDENSE computer_name. WRITE:/'电脑名称:', computer_name. |
(二)SAP 获取用户信息
在获取用户登陆 IP 地址和资产号时,CALL METHOD cl_gui_cfw=>update_view 也起到重要作用。例如:
1.获取登陆 IP 地址
DATA: ip TYPE char20. CALL METHOD cl_gui_frontend_services=>get_ip_address RECEIVING ip_address = ip EXCEPTIONScntl_error =1 error_no_gui =2 not_supported_by_gui =3 OTHERS=4. CALL METHOD cl_gui_cfw=>flush. WRITE:/'本机 IP:', ip. |
2.获取资产号
DATA: computer_name TYPE string. CALL METHOD cl_gui_frontend_services=>get_computer_name CHANGING computer_name = computer_name EXCEPTIONScntl_error =1 error_no_gui =2 not_supported_by_gui =3 OTHERS=4. CALL METHOD cl_gui_cfw=>flush. CALL METHOD cl_gui_cfw=>update_view. CONDENSE computer_name. |
(三)在数据查询下载工具中的应用
在快速下载工具中,CALL METHOD cl_gui_cfw=>update_view 可以确保查询结果的及时更新和显示。例如在 SAP ABAP 任意表数据查询 + 快速下载工具中,为了避免占用太多服务器空间,进行 ZIP 压缩后存储,下载后及时删除文件。现在可以保留动态选择输入的条件,不会需要再次重新输入。工具界面中,单表查询、跨表关联查询以及下载功能都可能涉及到该方法的使用,以确保数据的准确显示和下载操作的顺利进行。例如在单表查询中,输入表名执行后会进入动态条件选择界面,可自行添加选择条件,此时 CALL METHOD cl_gui_cfw=>update_view 可以确保界面的及时更新,让用户能够看到最新的选择条件和查询结果。在跨表关联查询中,使用 NativeSql 语句查询数据时,该方法同样可以确保查询结果在客户端的及时更新和显示。在下载功能中,支持.txt/.csv/.xlsx 三种格式的文件下载,该方法可以确保下载过程中的界面同步,让用户了解下载进度和状态。