Function ALV
ALV:SAPListViewer
ALV显示格式分为GRID及LIST两种模式,一个以网格显示,另一个以表格显示,两者都有工具栏稍有不同
Layout结构
Layout主要用于设置ALV整体输出格式,为ALV可选项参数。属于类型池 TYPE-POOLS:SLIS
TYPE-POOLS:slis.
DATA: layout TYPE slis_layout_alv.
Layout结构所定义的所有字段如下(各字段详细使用说明,可参考REUSE_ALV_GRID_DISPLAY的 is_layout参数文档说明):
no_colhead() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) type c, " Text for item button
countfname type lvc_fname,
* Display options
colwidth_optimize() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) type c, "ACC: Switch from FullGrid to List
Fieldcat结构
Fieldcat主要用于ALV数据显示结构的定义,包括具体的栏位名称、类型、各字段的输出格式(与Layout不一样的是输出格式只针对某个字段),为ALV必选参数
TYPE-POOLS:slis.
DATA: fieldcatTYPE slis_t_fieldcat_alv WITH HEADER LINE.
Fieldcat结构所定义的所有字段如下(各字段详细使用说明,可参考REUSE_ALV_GRID_DISPLAY的 it_fieldcat参数文档说明):
row_pos ) ) ) ) ) ) ) ) ) ) ) )时不输出,所以不输出零时应该最好同时设置lzero = sapce与no_zero = X,相反如果要输出,则应同时设置lzero = X 与no_zero = space
no_convext() ) ) ) ) ) type c, " technical field该字段为技术字段:设置为技术列的列将不会再显示出来,即使是在布局设置里也是看不到的
outputlen like dd03p-outputlen,列的字符输出宽度
offset type dd03p-outputlen, " offset
调整输出列抬头的文本:文本可以随着用户调整列的宽度而变化,其文本即是在对应data element中定义的,如果需要定制,则可以指定以下字段
seltext_l ) type c, " (S)hort (M)iddle (L)ong设置以长、中还是短名称来显示,取值分别为 S、M、L。直接指定文本显示为长文本、中、还是短文本, 指定这个字段后则会固定下来,不会随着用户的宽度调整变化.
reptext_ddic like dd03p-reptext, " heading (ddic),(header) Analogous(相似) to the Data element main header
rollname like dd03p-rollname,F1帮助需参照的DataElement,在ALV的显示界面将鼠标放到该字段的位置后按F1会弹出该字段的说明。另外,可以不指明字段的描述(如seltext_l、seltext_m、seltext_s),函数会自动将字段的描述显示为该参照的数据元素
下面datatype两个属性在字段如果是金额或P小数(数量)类型时,需要对datatype此属性进行设置,否则,如果不设置时,在修改对应单元格内容时,会自动将你所输入的数除100,即小数点提前两位;并且如果是数量类型,除了设置datatype外,inttype也需要进行设置,且为 C,具体实现请参考这里
datatypelike dd03p-datatype,
inttype like dd03p-inttype,
intlen like dd03p-intlen,
lowercase like dd03p-lowercase,
ref_fieldname ) type c, " decimals in write statement控制小数点的位数
text_fieldname type slis_fieldname,
ddic_outputlen like dd03p-outputlen,
key_sel() ) ) ) ) ) ) type c, " hotspot设置字段内容下面是否有热点(有下划线,可点击,单击即可触发相应事件)
ALV相关函数
REUSE_ALV_GRID_DISPLAY:Grid 格式的ALV
REUSE_ALV_LIST_DISPLAY: LIST格式的 ALV
REUSE_ALV_FIELDCATALOG_MERGE:根据程序中的数据内表结构,来自动生成FIELDCAT[]内表,会根据内表结构所参照的词典类型来自动完成如表标题字段名的生成,得到大概的FIELDCAT[]后,可以再根据特殊情况再修改FIELDCAT[]内表,这样可以大大减少FIELDCAT[]内表的创建工作。注:程序中用来输出的内表结构中的每个字段都要参考了数据字典中的Data element,否则无法获取字段的相关信息,此时在自动构建FIELDCAT后再手动对无参照字典类型的字段进行手工设置
注:还有一种以 LVC结尾的ALV函数REUSE_ALV_GRID_DISPLAY_LVC,此函数中引用到的类型大部分都不再从类型池slis 中来引用(TYPE-POOLS:slis.),而是直接引用字典中已定义好的表或结构类型,这种函数属于新性函数,与面向对象的CL_GUI_ALV_GRID生成的ALV参数类型上基本相同,所以以后一般如果使用函数方式来产生ALV,推荐使用REUSE_ALV_GRID_DISPLAY_LVC函数,而非REUSE_ALV_GRID_DISPLAY函数因为这样方便修改面向对象方式的ALV
REUSE_ALV_GRID_DISPLAY与REUSE_ALV_LIST_DISPLAY函数的参数基本相同:
CALLFUNCTION'REUSE_ALV_GRID_DISPLAY' |
CALLFUNCTION'REUSE_ALV_LIST_DISPLAY' * I_CALLBACK_PF_STATUS_SET = ' ' * I_STRUCTURE_NAME = * IS_LAYOUT = * I_SAVE = ' ' * IS_VARIANT = * IT_EXCEPT_QINFO = |
简单实例
.
lt_stock-color = 'C300'.
APPEND lt_stock .
ENDFORM.
Fieldcat动态创建
通过编程创建
注:通过此种方式实现时,显示内表中的所有列都会输出,只是那些没有参照字典中的类型字段没有字段标题名而已,这需要在FieldCat生产后,通过代码修改即可。
.
lt_stock-color = 'C300'.
APPEND lt_stock .
ENDFORM.
通过REUSE_ALV_FIELDCATALOG_MERGE函数创建
.
T_STOCK-color = 'C300'.
APPEND T_STOCK .
ENDFORM.
自定义ALV工具条
默认输出的ALV已供了很多标准的按钮了:
自定义ALV工具栏有两种方式:第一处是自已创建一个GUI Status(通常作法是从SLVC_FULLSCREEN函数组中的拷贝STANDARD_FULLSCREENGui Status,再在此基础之上新增按钮即可);第二种是调用系统已定义好的标准ALV工具栏;
系统已定义好的标准ALV GUI Status 在程序SAPLKKBL中,可以通过SET PF-STATUS … OF PROGRAM语句直接来调用,如:
SET PF-STATUS 'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL'.
SAPLKKBL程序中定义的系统标准的ALV GUI Status有以下几种:
l STDPOPUP_FULLSCREEN
l STANDARD_FULLSCREEN 与SLVC_FULLSCREEN函数组中的STANDARD_FULLSCREEN是一样的,都是标准的(函数组SALV中的STANDARDstatus也是标准的)
l STDPOPBX_FULLSCREEN
l STDPOPUP_FULLSCREEN
l STANDARD_FULLSCR_HR
l STDPOPBX_FS_LIGHT
l STDPOPUP_FS_LIGHT
l STD_LIGHT_FULLSCREEN
这些工具条中的按钮都已经设置了Function Code,且都是保留字,这些Funcode都已经在ALV Guid控件中实现,不需得新分配Funcode功能代码,按钮默认功能码:
ALV中自定义工具栏需要通过REUSE_ALV_GRID_DISPLAY函数的I_CALLBACK_PF_STATUS_SET参数,传递设置GUI Status的Form的名称,在此Form使用SET PF-STATUS语句来重新定义ALV工具栏,该Form接口如下:
FORMset_pf_status USING rt_extab TYPE slis_t_extab
rt_extab是要排除掉的按钮,根据Funcode来排除。另外,也可以通过REUSE_ALV_GRID_DISPLAY函数IT_EXCLUDING内表参数来直接排除哪些预置按钮不可用,IT_EXCLUDING内表结构只有一个fcode字段,即根据保留的FunCode即可disabled掉。
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
it_fieldcat = fieldcat[]
I_CALLBACK_PF_STATUS_SET= 'SET_PF_STATUS'
TABLES
t_outtab = t_stock1.
FORMset_pf_status USING rt_extab TYPE slis_t_extab.
"去激活Function code为&ETA的详情按钮
APPEND '&ETA' TO rt_extab.
SET PF-STATUS'STANDARD_FULLSCREEN' OF PROGRAM 'SAPLKKBL' EXCLUDING
rt_extab.
ENDFORM.
如果没有重定义ALV工具栏,则会默认使用函数组SLVC_FULLSCREEN中定义的STANDARD_FULLSCREEN工具条
快速拷贝GUI Status
在自定义工具栏时,通常从标准GUI Status上拷贝出来,再新加按钮。
函数组 SLVC_FULLSCREEN中定义的STANDARD_FULLSCREEN GUI Status拷贝方式如下,通过 SE41可以快速拷贝:
如果不是ALV,是Write输出时,拷贝:
ALV事件
ALV触发的事件(如双击某行数据、单击热点、点ALV工具栏上的自定义的按钮时),会回调I_CALLBACK_USER_COMMAND参数指定的Form,接口如下:
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
Parameter R_UCOMM 为触发的function code
结构 RS_SELFIELD 包括了以下字段:
- tabname: Name of the internal output table 输出内表名
- tabindex : Index of the internal output table 数据行索引
- endsum: Cursor is located on the totals line
- sumindex : If >0, the cursor is located on a subtotals line
- value : Value of the field on the list 光标所在单元格的值
- refresh: (Exporting) List should be set up again为X时,当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
- col_stable:(Exporting) Keep column position when list is set up again
- row_stable:(Exporting) Keep row position when list is set up again
- exit :(Exporting) Exit list (and ALV)
- before_action: Call before standard action execution
- after_action : Call after standard action execution, before list setup
) WITH '事件触发时当前行:' rs_selfield-tabindex.
ENDFORM.
所支持事件
ALV可触发的事件可用REUSE_ALV_EVENTS_GET 函数来获得,输出一个内表,类型是slis_t_event,行项为slis_alv_event,包含两个字段:一个为事件名,另一个是事件处理的FORM名
:表示获取的是通过函数REUSE_ALV_LIST_DISPLAY产生的ALV所支持的事件
IMPORTING
et_events = i_events[].
LOOP AT i_events.
WRITE:/ i_events-name,i_events-form.
ENDLOOP.
触发USER_COMMAND事件时,会调用以下签名的Form:
触发PF_STATUS_SET事件时,会调用以下签名的Form(其中pf_status_set名是自定义的,非固定为 pf_status_set):
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
事件名 |
何时触发 |
触发时所回调Form的签名要求 |
回调方式 |
USER_COMMAND |
用户点击工具栏中自定义按钮、预置按钮(需通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENT_EXIT参数来特殊处理才会回调指定的Form)、数据行双击、单元格热点点击等一系列用户操作 |
FORMuser_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. (其中user_command名是自定义的,而不是固定为 user_command) |
1. 通过REUSE_ALV_GRID_DISPLAY函数的I_CALLBACK_USER_COMMAND参数接口回调 2. 通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数接口回调 |
PF_STATUS_SET |
ALV工具栏显示前,可自定义工具条 |
FORMpf_status_set USING rt_extab TYPE slis_t_extab (其中 pf_status_set 名是自定义的,而不是固定为 pf_status_set ) |
1. 通过REUSE_ALV_GRID_DISPLAY函数的I_CALLBACK_PF_STATUS_SET参数接口回调 2. 通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数接口回调 |
更多事件详细介绍可参考REUSE_ALV_GRID_DISPLAY函数的IT_EVENTS参数文档说明 |
),"事件触发时需回调的Form名
end of slis_alv_event.
工具条预置按钮回调出口IT_EVENT_EXIT
点击ALV默认提供的工具栏按钮时,不会回调I_CALLBACK_USER_COMMAND = 'USER_COMMAND'参数中指定的Form ,因为那些按钮所对应的功能代码已被设为保留Funcode了,如果要想在点击这些标准的按钮时也回调指定的Form,可通过REUSE_ALV_GRID_DISPLAY函数的IT_EVENT_EXIT参数实现的,可以向IT_EVENT_EXIT参数内表填充需要被拦截的保留Funcode,及在是执行对应功能代码之前还是之后调用,具体应用请参考这里:
DATA: event_exit TYPE slis_t_event_exit WITH HEADER LINE.
event_exit-ucomm = '&OAD'."此Funcode为点击AlV工具栏上的选择布局按钮时会被USER_COMMAND Form拦截
event_exit-after = 'X'.
APPEND event_exit.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program= sy-repid
it_fieldcat = fieldcat[]
i_callback_user_command= 'USER_COMMAND'
IT_EVENT_EXIT = event_exit[]
TABLES
t_outtab = gt_result.
FORMuser_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
...
ENDFORM.
颜色
注意:
颜色设置中有优先级顺序,他们是单元格中更改颜色的方法,则列的颜色会被行的颜色覆盖掉,而行的颜色又会被单元格的颜色覆盖掉,最终只会显示出单元格的颜色。
如果这列被设置为关键列,就是LS_FCAT-KEY = 'X' ,那么颜色设置就不会起作用
行颜色
ALV中的每行数据颜色是通过LayOut来控制的。需要在显示输出内表结构中增加一列字段,用来存储数据行的颜色
颜色值定义为4位字符,首位固定为字母“C”,第2位为颜色,由0~7表示,不同的数字表示不同的颜色属性,如:
0 = background color 1 = Gray-blue 2 = Light gray 3 = yellow
4 = blue-gray 5 = green 6 = red 7 = orange
第3位表示输出文字是否高亮显示,由0~1表示,为1时表示高亮显示。位测试了一下,基本上0~9颜色都差不多,唯一就是当取值为1时,底色又回到了灰色(且只是在第3位为0时才有此效果)。
ALV中的颜色是由4位数组成:'C'+COL+INT+INV
*** Structure for colors
types: begin of slis_color,
col type i,
int type i,
inv type i,
end of slis_color.
第1位:固定取值为C
第2位COL:颜色值,取值为0~7
第3位、1。1表示加深显示
第4位、1。为1时表示设置的是前景色,即输出字符本身的颜色位为0时才有效?)
以下是各种颜色值测试表:
列颜色
.
APPEND gt_data.
ENDFORM.
单元格颜色
除了可为整行设置行颜色外,每个单元格(不只是整列)的颜色也是可以单独进行设置。当然既然可以给单元格设置颜色,则整列相同颜色也是可以采用此方式来设置的
可编辑
可以通过layout(slis_layout_alv)中的edit参数来设置整个网格(所有单元格)是否可编辑:
DATA: gs_layout TYPE slis_layout_alv.
gs_layout-edit = 'X'.
如果只想让某列(一整列)可修改,而不是整个网格,则可对fieldcat中的edit参数来设置某列是否可编辑:
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
gt_fieldcat-edit = 'X'.
如果想对某些单元格进行设置,在满足一定条件的单元格才能修改,此时只能使用以LVC结尾的REUSE_ALV_GRID_DISPLAY_LVC函数,而非REUSE_ALV_GRID_DISPLAY函数:
),
cellstab TYPE lvc_t_styl,"单元格可编辑控制
END OF gt_data.
"单元格可编辑控制内表
DATA: gt_cellstab TYPE lvc_t_styl WITH HEADER LINE.
START-OF-SELECTION.
PERFORM inital.
DEFINE fill_fdcat.
clear gt_fieldcat.
gt_fieldcat-fieldname = &1.
gt_fieldcat-scrtext_l = &2.
"设置单元格为可编辑状态:此处设置所有单元格都可编辑
gt_fieldcat-edit = 'X'.
append gt_fieldcat.
END-OF-DEFINITION.
fill_fdcat 'VAL1' '列1'.
fill_fdcat 'VAL2' '列2'.
gs_layout-stylefname = 'CELLSTAB'."设置可编辑信息
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat[]
TABLES
t_outtab = gt_data.
FORM inital .
gt_data-val1 = 'cell1'.
gt_data-val2 = 'cell2'.
gt_cellstab-fieldname = 'VAL1'.
"将原本可编辑的单元格切换到不可编辑样式。注:这里
"只是样式的切换,不能仅仅使用cl_gui_alv_grid=>mc_style_enabled来将单元格设置为
"可编辑状态,单元格真正是否可编辑是由fieldcat-edit或layout-edit来决定的,而仅
"设置为cl_gui_alv_grid=>mc_style_enabled是不可编辑的
gt_cellstab-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND gt_cellstab.
gt_data-cellstab = gt_cellstab[].
APPEND gt_data.
ENDFORM.