ALV GRID CONTROL (ALV网格控制器)
ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供方法,以响应它的动作。
使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.
3.2、ALV GRID CONTROL 实例
ALV GRID实例的定义,参照CL_GUI_ALV_GRID类
data ALV_GRID1 type ref to cl_gui_alv_grid.
3.3、简单对象ALV的开发流程
3.3.1、OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的。首先ALV的显示需要有几个先决条件:
1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.
2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.
这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.
第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.
DATA:
WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .
*--- 存放字段目录的内表
DATA gt_fieldcat TYPE lvc_t_fcat .
*--- 布局结构
DATA gs_layout TYPE lvc_s_layo .
*----声明需要显示的内表(以SFLIGHT为例)
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA END OF gt_list .
第二步: 创建ALV这个对象,它的父组件是那个容器.
在PBO中写入如下代码:
PROCESS BEFORE OUTPUT .
MODULE display_alv .
创建DISPLAY_ALV的MODULE后,写下如下代码:
MODULE display_alv OUTPUT .
PERFORM display_alv .
ENDMODULE .
在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:
IF WCL_ALV IS INITIAL .
CREATE OBJECT: WCL_CONTAINER
EXPORTING
CONTAINER_NAME = \'ALV_CON\'.
CREATE OBJECT WCL_ALV
EXPORTING
I_PARENT = WCL_CONTAINER.
*-----准备获取字段目录
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*-----设置布局
PERFORM prepare_layout CHANGING gs_layout .
*-----显示ALV
CALL METHOD gr_alvgrid->set_table_for_first_display
*----刷新ALV
CALL METHOD gr_alvgrid->refresh_table_display
第三步,获取要显示数据的字段目录.有两种方式.
1.手动创建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
ls_fcat-fieldname = \'CARRID\' .
ls_fcat-inttype = \'C\' .
ls_fcat-outputlen = \'3\' .
ls_fcat-coltext = \'Carrier ID\' .
ls_fcat-seltext = \'Carrier ID\' .
APPEND ls_fcat to pt_fieldcat .
CLEAR ls_fcat .
ENDFORM.
2.半自动的创建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
CALL FUNCTION \'LVC_FIELDCATALOG_MERGE\'
EXPORTING
i_structure_name = \'SFLIGHT\'
CHANGING
ct_fieldcat = pt_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
LOOP AT pt_fieldcat INTO ls_fcat .
CASE pt_fieldcat-fieldname .
WHEN \'CARRID\' .
ls_fcat-outpulen = \'10\' .
ls_fcat-coltext = \'Airline Carrier ID\' .
MODIFY pt_fieldcat FROM ls_fcat .
WHEN \'PAYMENTSUM\' .
ls_fcat-no_out = \'X\' .
MODIFY pt_fieldcat FROM ls_fcat .
ENDCASE .
ENDLOOP .
ENDFORM .
第四步,设置布局
FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-zebra = \'X\' .
ps_layout-grid_title = \'Flights\' .
ps_layout-smalltitle = \'X\' .
ENDFORM. " prepare_layout
第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)
在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.
如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".
FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_mb_sum .
APPEND ls_exclude TO pt_exclude.
ENDFORM .
以上步骤,详见“示例程序”部分:示例二(对象ALV)。