一、一次创建,多次调用
当使用OOALV开发平台,存在点击不同位置,跳转到一个ALV,除ALV内容不一致以外,其他都一样。
常规方法,即跳转到多少个ALV,就创建多少个SCREEN。而屏幕对应的输入输出流,事件,fieldcat,ALV等等出现大量相似代码。
那么是否可以创建一个SCREEN,多次调用,修改调用时的fieldcat和展示ALV的GT_ALV内表。
二、解决方法
DATA:g_grid_9001 TYPE REF TO cl_gui_alv_grid, "ALV容器的实例 g_container_9001 TYPE REF TO cl_gui_docking_container, "ALV容器 不用画屏幕容器 cl_gui_custom_container, "ALV container容器 需要画屏幕容器 gt_exclude_9001 TYPE ui_functions, " 用于去掉不要的菜单栏 gs_layout_9001 TYPE lvc_s_layo, "ALV 控制: 布局结构 gt_fieldcat_9001 TYPE lvc_t_fcat.
每次离开上一个ALV时,调用析构函数,清理两个对象
MODULE user_command_9000 INPUT. DATA: lt_row TYPE lvc_t_row, lt_roid TYPE lvc_t_roid, ls_row TYPE lvc_s_row. save_code = ok_code. CLEAR ok_code. CASE save_code. WHEN '&BACK'."设置功能键返回按钮单击事件 "将9001屏幕释放 IF g_container_9001 IS BOUND. CALL METHOD g_container_9001->free EXCEPTIONS cntl_error = 1 cntl_system_error = 2 OTHERS = 3. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDIF. "将9001屏幕释放 IF g_grid_9001 IS BOUND. CALL METHOD g_grid_9001->free EXCEPTIONS cntl_error = 1 cntl_system_error = 2 OTHERS = 3. IF sy-subrc <> 0. * MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDIF. PERFORM frm_refresh_alv USING g_grid_9000. LEAVE TO SCREEN 0. WHEN '&EXIT'. LEAVE PROGRAM. ENDCASE. ENDMODULE.
调用9001SCREEN时,重新调用方法,再清理并实例化这两个对象
MODULE display_alv_9001 OUTPUT. FREE:g_container_9001,g_grid_9001. PERFORM frm_create_container_9000. PERFORM frm_alv_sort_9000. PERFORM frm_alv_fieldcat_9001. PERFORM frm_alv_layout_9000. PERFORM frm_alv_btn_exclude_9000. CASE gv_9001name. WHEN 'ZCGPS'."采购计划评审 display_alv g_grid_9001 gs_layout_9000 gt_exclude_9000 gt_fieldcat_9001 gt_cgpsalv. WHEN 'ZSCPS'."生产计划评审 display_alv g_grid_9001 gs_layout_9000 gt_exclude_9000 gt_fieldcat_9001 gt_scpsalv. WHEN OTHERS. ENDCASE. ENDMODULE.