记得刚学ABAP的时候问这问那,问东问西,常常一个可能不怎么用的东西,扣了好久好久.群里的大佬就说,学那么多没必要,以后是会天天写ALV , 讲真 因为 SAP 很多东西都已经通过配置就可以实现, 我们还真就是做表单相关的东西比较多,不能说全部,也是大部分. 好巧今天看到群友问ALV 相关的内容,这里整理一下,希望帮助更多的人 ヾ(?°∇°?).
第1步:声明变量
定义ALV所要用到的类型池:TYPE-POOLS: SLIS
针对ALV的控制信息数据(Layout & Fieldcat)
第2步:定义内表
存放自定义数据文件的数据,以及在ALV中显示
第3步:读取数据
读取数据存放至Internal Table
第4步:ALV格式控制
建立ALV显示样式(layout)和显示字段清单(Field Catalogs)
第5步:定义事件
建立事件清单(Event Catalogs)
第6步:显示ALV
调用ALV Function Module
第7步:用户事件
定义User按键处理事件
普通的ALV的流程如上图,包含所有常规流程.本质上是展示数据的报表. 以及常用语法的熟练使用,数据转换,逻辑计算等.
ALV组成3大部分
工具栏
标题栏
显示数据的网格控制器 (必要时可以隐藏工具栏和标题栏)
注意事项:
1、在ALV中,需要注意所有需要显示的列,都必须在相应的内表中有对应的字段, 字段名字不能写错。
2、在SAP ABAP程序中,字符串的大小写很重要,在单引号包围的字符串中, 一般来说都应该用大写,特别是在调用一些系统的方法时传入字符串参数时。
3、传入到ALV中的列对应的字段名称也必须使用大写字母,否则数据不会显示出来。
4、使用宏定义或者子例程可以减少代码量,并且尽可能实现代码的复用。
5、注意在FORM里定义的变量在离开FORM后,就会被系统释放掉,回收内存空间。
ALV开发中两个重要的对象——FIELDCAT和LAYOUT:
在调用ALV的函数中,除了定义所输出使用的内表之外,
还有两个部分是必需确认的:列栏位属性和布局属性。
列栏位属性FIELDCAT :
设置输出中具体字段的名称、类型、格式等属性;
对于系统结构表,函数可参照此结构自动创建列属性,可以没有调用列栏位属性
布局属性LAYOUT:
设置输出ALV列表的整体布局的属性,如输出字段的颜色、表格中的线条等。
没有调用布局属性时,系统按默 认布局输出,不做任何调整。
两对象同属于类型组SLIS,在ALV开发中必须声明类型组SLIS
布局控制[layout]
布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.
参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.
详细的结构说明(注意这些字段的取值,单引号内,’ ‘空格代表否,’X’ 代表是)
字段名 描述 Value range
CWIDTH_OPT 最优化宽度 SPACE, ‘X’
SMALLTITLE 小标题 SPACE, ‘X’
GRID_TITLE 标题,在网格和工具条之间 最长70个字符
NO_HEADERS 列标题隐藏 SPACE, ‘X’
NO_HGRIDLN 隐藏水平线 SPACE, ‘X’
NO_MERGING 禁用单元格合并 SPACE, ‘X’
NO_ROWMARK 禁用系统自带的行选择’X’为D和A的时候隐藏 SPACE, ‘X’
NO_TOOLBAR 隐藏工具条 SPACE, ‘X’
NO_VGRIDLN 隐藏垂直线 SPACE, ‘X’
SEL_MODE 选择模式 SPACE, ‘A’, ‘B’, ‘C’, ‘D’
EXCP_CONDS 合计例外 SPACE, ‘X’
EXCP_FNAME 字段名称带有例外编码 最长30个字符
EXCP_LED 例外作为 LED SPACE, ‘X’
EXCP_ROLLN 例外文档的数据元素 SPACE, ‘X’
CTAB_FNAME 带有复杂单元格颜色编码的字段名称 最长30个字符
INFO_FNAME 带有简单行彩色代码的字段名称 最长30个字符
ZEBRA 可选行颜色,如果设置了,出现了间隔色带 SPACE, ‘X’
NO_TOTLINE 没有总计 SPACE, ‘X’
NUMC_TOTAL 可以对NUMC字段进行合计 SPACE, ‘X’
TOTALS_BEF 总计输出在第一行,小计在新的值之前 SPACE, ‘X’
STYLEFNAME 设置单元格,比如PUSHBUTTON 最长30个字符
Fieldcat
data: fieldcat type slis_t_fieldcat_alv with header line.
it_fieldcat = fieldcat[]
属性
(用来定义表单中的各个列的相关信息)
Fieldcat-col_pos=n. 输出列
Fieldcat-tabname=‘FIELDNAME’. 对应的内表字段名
Fieldcat-seltext_s/m/l=‘列名’. 输出列文本( _s:短文本 _l:长文本)
Fieldcat-emphasize=‘CX10’. 带有颜色的高亮列(其中X=(1-7)颜色同format)
Fieldcat-hotspot=‘X’. 作为热点显示可触发鼠标触发事件
Fieldcat-currency=‘CURRKEY’. 表 TCURX 中的货币名称
Fieldcat-quantity(3) 计量单位
Fieldcat-qfieldname 参考计量单位的字段名称
Fieldcat-round=n. 四舍五入至小数位数下n 位
Fieldcat-exponent=n. 浮点数的幂指数为n
Fieldcat-key=‘X’. 关键字段
Fieldcat-icon=‘X’. 作为图标输出
Fieldcat-symbol=‘X’. 输出作为符号
Fieldcat-checkbox=‘X’. 作为复选框输出
Fieldcat-just=SPACE, ‘R’, ‘L’, ‘C’. 对齐方式
Fieldcat-lzero=‘X’. 输出前导零
Fieldcat-no_sign=‘X’. 输出抑制符号
Fieldcat-no_zero=‘X’. 为输出隐藏零
Fieldcat-edit_mask=SPACE, mask.. 输出为mask的模式
Fieldcat-fix_column=‘X’. 固定列
Fieldcat-do_sum=‘X’. 总计列值总和
Fieldcat-no_out=‘X’. 列不输出
Fieldcat-tech=‘X’. 该字段为技术字段
Fieldcat-outputlen=n 列的字符宽度为n
Fieldcat-decimals_out=n 能控制小数点的位数为n
Fieldcat-datatype=C,I,N… 定义数据类型
*需定义事件块,否则出错
eventcat_ln-name=’TOP_OF_PAGE’.eventcat_ln-form=’PAGE_HEADER’.
APPEND eventcat_ln TO eventcat.
事件块:
FORM PAGE_HEADER.
ENDFORM.
代码
*第一步 :声明alv相关 变量
TYPE-POOLS:SILS. “引入slis 包 定义 使用专门alv
data:LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV, “存储fieldcat 内表, 列表标签相关
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
*WA_FIELDCAT TYPE SLIS_FIELDCAT_ALV, “定义使用工作区
*ls_fieldcat like LINE OF LT_FIELDCAT,
LS_LAYOUT TYPE SLIS_LAYOUT_ALV, “ALV格式控制的结构体
LT_EVENT TYPE slis_T_event , ” 事件的内表
LS_EVENT TYPE slis_alv_event. “事件的工作区
DATA: pgm LIKE sy-repid.
DATA LT_SORT TYPE SLIS_T_SORTINFO_ALV .
DATA WA_SORT TYPE SLIS_SORTINFO_ALV.
DATA LS_SETTING TYPE LVC_S_GLAY.
DATA : LV_COLPOS TYPE INT2 .
着重解释
主要是生命变量
引入slis 包,
建立内表,
定义变量
代码
*定义类型.
TYPES:BEGIN OF ty_alvshow,
CARRID TYPE SPFLI-CARRID, “航线代码
CITYFROM type SPFLI-CITYFROM , “起飞城市.
CITYTO TYPE SPFLI-CITYTO , “目标城市
FLDATE type SFLIGHT-FLDATE ,”起飞时间
PLANETYPE TYPE SFLIGHT-PLANETYPE ,”飞机类型
SEATSMAX TYPE SFLIGHT-SEATSMAX ,”飞机容量
END OF ty_alvshow.
*定义内表和工作区
data : LT_ALVSHOW TYPE TABLE OF ty_alvshow, “定义内表
WA_ALVSHOW TYPE ty_alvshow.
着重解释
类型 可以直接写入字段类型中的 类型
或者干脆 直接写表名-字段 也可以.
代码
select
a~CARRID CITYFROM
CITYTO FLDATE
PLANETYPE SEATSMAX
FROM spfli as a inner join SFLIGHT as b on a~CARRID=b~CARRID
into table LT_ALVSHOW “内表需要增加table
UP TO 10 ROWS.
代码
LS_LAYOUT-zebra=’X’. “列输出位置
LS_LAYOUT-detail_popup=’X’ .”是否弹出详细明细窗口
LS_LAYOUT-detail_TITLEBAR=’详细信息’.
LS_LAYOUT-f2code=’&ETA’ . “设置触发弹窗信息功能
LS_LAYOUT-colwidth_optimize=’X’ . “设置自动优化列宽.
“fieldcat 界面配置
lv_colpos=1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’CARRID’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-key=’X’.
LS_FIELDCAT-DATATYPE=’CHAR’ .
LS_FIELDCAT-OUTPUTLEN=’10’.
LS_FIELDCAT-SELTEXT_M=’飞机id’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
“fieldcat 界面配置
lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’CITYFROM’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-key=’X’.
LS_FIELDCAT-DATATYPE=’CHAR’ .
LS_FIELDCAT-OUTPUTLEN=’30’.
LS_FIELDCAT-SELTEXT_M=’出发城市’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
“fieldcat 界面配置
lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’CITYTO’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-key=’X’.
LS_FIELDCAT-DATATYPE=’CHAR’ .
LS_FIELDCAT-OUTPUTLEN=’30’.
LS_FIELDCAT-SELTEXT_M=’到达城市’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
“fieldcat 界面配置
lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’FLDATE’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-key=’X’.
LS_FIELDCAT-DATATYPE=’DATS’ .
LS_FIELDCAT-OUTPUTLEN=’8′.
LS_FIELDCAT-SELTEXT_M=’到达时间’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
“fieldcat 界面配置
lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’PLANETYPE’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-key=’X’.
LS_FIELDCAT-DATATYPE=’char’ .
LS_FIELDCAT-EDIT=’X’.
LS_FIELDCAT-OUTPUTLEN=’20’.
LS_FIELDCAT-SELTEXT_M=’飞机类型’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
clear LS_FIELDCAT .
“fieldcat 界面配置
*lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
*ls_FIELDCAT-fieldname=’SEATSMAX’. “那个字段
*LS_FIELDCAT-col_pos=LV_COLPOS.
*LS_FIELDCAT-key=’X’.
*LS_FIELDCAT-DATATYPE=’int4′ .
*LS_FIELDCAT-OUTPUTLEN=’20’.
*LS_FIELDCAT-SELTEXT_M=’飞机容量’.
*APPEND LS_FIELDCAT to LT_FIELDCAT.
*clear LS_FIELDCAT .
“fieldcat 界面配置
lv_colpos=LV_COLPOS + 1 . “字段显示为第几行
ls_FIELDCAT-fieldname=’SEATSMAX’. “那个字段
LS_FIELDCAT-col_pos=LV_COLPOS.
LS_FIELDCAT-ref_fieldname=’SFLIGHT’ .
LS_FIELDCAT-do_sum=’X’ .
LS_FIELDCAT-SELTEXT_M=’飞机容量’.
APPEND LS_FIELDCAT to LT_FIELDCAT.
Clear LS_FIELDCAT .
着重解释
首先需要配置layout 相关内容
在配置每个字段的fieldcat .
注意:显示列数要设置逐级增加,并且要把内表数据覆盖内表 ,并清空内表数据.
代码
LS_EVENT-FORM=’FORM_USER_COMMAND’ .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .
LS_EVENT-name=’TOP_OF_PAGE’ .”显示标题
LS_EVENT-form=’FORM_TOP_OF_PAGE’ .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .
LS_EVENt-name=’PF_STATUS_SET’ .”显示状态栏
LS_EVENT-FORM=’FORM_PF_STATUS_SET’ .
APPEND LS_EVENT TO LT_EVENT .
CLEAR LS_EVENT .
代码
WA_SORT-fieldname=’SEATSMAX’ .
WA_SORT-DOWN=’X’.
APPEND WA_SORT TO LT_SORT .
CLEAR wa_sort . “清空工作区
操作
光标要留在数据的位置,然后点 模式–>调用功能输入–>REUSE_ALV_GRID_DISPLAY
–>按回车.–>自动生成代码
代码
LS_SETTING-EDT_CLL_CB=’X’ . “编辑单元格之后, 返回给程序编辑后的值.
pgm=sy-repid. “回调对象
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
* I_INTERFACE_CHECK=’ ‘
* I_BYPASSING_BUFFER=’ ‘
* I_BUFFER_ACTIVE=’ ‘
I_CALLBACK_PROGRAM=pgm
I_CALLBACK_PF_STATUS_SET=’PF_STATUS_SET’
I_CALLBACK_USER_COMMAND=’USER_COMMAND’
I_CALLBACK_TOP_OF_PAGE=’TOP_OF_PAGE’
* I_CALLBACK_HTML_TOP_OF_PAGE=’ ‘
* I_CALLBACK_HTML_END_OF_LIST=’ ‘
* I_STRUCTURE_NAME=* I_BACKGROUND_ID=’ ‘
* I_GRID_TITLE=I_GRID_SETTINGS=LS_SETTING “编辑单元格之后, 返回给程序编辑后的值.
IS_LAYOUT=LS_LAYOUT
IT_FIELDCAT=LT_FIELDCAT
* IT_EXCLUDING=* IT_SPECIAL_GROUPS=IT_SORT=LT_SORT
* IT_FILTER=* IS_SEL_HIDE=* I_DEFAULT=’X’
* I_SAVE=’ ‘
* IS_VARIANT=IT_EVENTS=LT_EVENT
* IT_EVENT_EXIT=* IS_PRINT=* IS_REPREP_ID=* I_SCREEN_START_COLUMN=0
* I_SCREEN_START_LINE=0
* I_SCREEN_END_COLUMN=0
* I_SCREEN_END_LINE=0
* I_HTML_HEIGHT_TOP=0
* I_HTML_HEIGHT_END=0
* IT_ALV_GRAPHICS=* IT_HYPERLINK=* IT_ADD_FIELDCAT=* IT_EXCEPT_QINFO=* IR_SALV_FULLSCREEN_ADAPTER=* IMPORTING
* E_EXIT_CAUSED_BY_CALLER=* ES_EXIT_CAUSED_BY_USER=TABLES
T_OUTTAB=LT_ALVSHOW
EXCEPTIONS
PROGRAM_ERROR=1
OTHERS=2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
解释
1:生成的代码都是注释的
2:选择使用的解除注释并赋值
代码
FORM FORM_PF_STATUS_SET USING RT_EXTAB TYPE SLIS_T_EXTAB .
SET PF-STATUS ‘YALVDEMO1_GUI’.
ENDFORM.
*标题
FORM FORM_TOP_OF_PAGE.
*定义数据 内表和工作区
DATA LT_COMMENTARY TYPE SLIS_T_LISTHEADER.
DATA WA_COMMENTARY TYPE SLIS_LISTHEADER.
WA_COMMENTARY-TYP=’H’ .
WA_COMMENTARY-INFO=’飞机飞行清单’ .
APPEND WA_COMMENTARY TO LT_COMMENTARY .
WA_COMMENTARY-TYP=’S’ .
WA_COMMENTARY-INFO=’中号标题’ .
APPEND WA_COMMENTARY TO LT_COMMENTARY .
CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’
EXPORTING
IT_LIST_COMMENTARY=LT_COMMENTARY.
* I_LOGO =* I_END_OF_LIST_GRID=* I_ALV_FORM =ENDFORM.
*用户操作按钮
FORM FORM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD .
data : lt_SFLIGHT TYPE table of SFLIGHT , “内表
wa_SFLIGHT type SFLIGHT. “工作区
IF R_UCOMM=’ZYDD1′ .
MESSAGE ‘你触发了按钮’ TYPE ‘I’.
ELSEIF R_UCOMM=’Z_SAVE1′ .
select * from SFLIGHT into table lt_SFLIGHT
for ALL ENTRIES IN LT_ALVSHOW
where CARRID=lt_alvshow-CARRID .
ENDIF .
loop at lt_SFLIGHT into wa_SFLIGHT . “从工作区取数 循环
READ TABLE LT_ALVSHOW into WA_ALVSHOW WITH KEY CARRID=wa_SFLIGHT-CARRID .
if sy-SUBRC=0 .
*MESSAGE WA_ALVSHOW-PLANETYPE TYPE ‘I’.
wa_SFLIGHT-PLANETYPE=WA_ALVSHOW-PLANETYPE .
MODIFY lt_SFLIGHT from wa_SFLIGHT. “内表更新
ENDIF .
CLEAR wa_SFLIGHT .
CLEAR WA_ALVSHOW.
ENDLOOP.
update SFLIGHT from table lt_SFLIGHT.
if sy-subrc=0 .
commit work . “数据库提交
MESSAGE ‘保存成功’ TYPE ‘I’.
else .
ROLLBACK work .
MESSAGE ‘保存失败’ TYPE ‘I’.
ENDIF.
ENDFORM .
这个demo 是最简单的DEMO 使用的是 系统内置表(飞机表) , 其中包含了用户操作,排序,求和等常规用户操作和界面优化 .
常规语法的通俗使用. 此demo还可以进一步优化,把常规重复性操作写入到函数或者宏中,后续会发更优化版本.
作为入门demo 可以让你充分了解ALV ,及ALV 常规用到的属性.
以上就是ABAP ALV最常规写法及常用功能详解的详细内容,更多关于ABAP ALV 写法功能的资料请关注脚本之家其它相关文章!