正文

ABAP?ALV最常规写法及常用功能详解(abap for all)干货分享

文章摘要

### ABAP ALV 开发总结 本文简要介绍ABAP中ALV(报表视图)的开发流程与核心功能。ALV主要用于报表展示,其开发步骤包括: 1. **变量声明**:声明类型池(TYPE-POOLS:SILS)、FIELDCAT(字段属性)和LAYOUT(布局属性)。 2. **内表定义**:定义内表的字段结构,确保每个字段对应实际数据。 3. **数据读取**:从数据库读取数据并存储至内表中。 4. **布局控制**:定义列宽、标题、总计等功能,调整界面显示。 5. **事件处理**:定义用户响应事件(如按钮点击),实现动态更新。 6. **显示与排序**:调用功能模块显示数据,可选择排序方式。 文章强调以下关键点: - **FIELDCAT**:用于定义字段属性(如类型、宽度、颜色)。 - **LAYOUT**:控制整体布局(如标题、行颜色、对齐方式)。 - **宏定义与子例程**:减少代码量,复用功能。 - **数据库操作**:读取、排序、更新数据。 示例代码展示了如何定义变量、配置布局和事件处理,进一步优化功能。此示例为入门级,适合初学者理解ALV开发基础。 本文为ABAP ALV开发的入门指南,帮助开发者掌握基本语法和功能。


目录先导流程顺序开发ALV的基本流程:ALV 界面介绍ALV 开发注意事项ALV 基本参数ALV 对象参数ALV 参数控制LayoutALV 参数控制FieldcatALV定义事件ALV DEMO1:声明alv2:定义内表3:读取数据4:字段配置 ALV格式控制.着重解释5:定义事件6:排序(常用功能)7:显示alv数据8:按钮操作标题栏等配置总结

记得刚学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…   定义数据类型
* 建立事件清单(Event Catalogs) *需定义事件块,否则出错 eventcat_ln-name=’TOP_OF_PAGE’. eventcat_ln-form=’PAGE_HEADER’. APPEND eventcat_ln TO eventcat. 事件块: FORM PAGE_HEADER. ENDFORM.

代码

REPORT YALVDEMO1. *第一步 :声明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.

代码

*第四部: ALV 的格式控制. layout 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-name=’USER_COMMAND’ .”用户响应事件 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

–>按回车.–>自动生成代码

代码

*第七部分显示alv 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:选择使用的解除注释并赋值

代码

*按钮 gui 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 写法功能的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:APAP?ALV进阶写法及优化详解