ABAP|ABAP ALV最常规写法及常用功能详解

目录

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

            先导 记得刚学ABAP的时候问这问那,问东问西,常常一个可能不怎么用的东西,扣了好久好久.群里的大佬就说,学那么多没必要,以后是会天天写ALV , 讲真 因为 SAP 很多东西都已经通过配置就可以实现, 我们还真就是做表单相关的东西比较多,不能说全部,也是大部分. 好巧今天看到群友问ALV 相关的内容,这里整理一下,希望帮助更多的人 ヾ(?°?°?)??.

            流程顺序 ABAP|ABAP ALV最常规写法及常用功能详解
            文章图片


            开发ALV的基本流程:
            第1步:声明变量
            定义ALV所要用到的类型池:TYPE-POOLS: SLIS
            针对ALV的控制信息数据(Layout & Fieldcat)
            【ABAP|ABAP ALV最常规写法及常用功能详解】第2步:定义内表
            存放自定义数据文件的数据,以及在ALV中显示
            第3步:读取数据
            读取数据存放至Internal Table
            第4步:ALV格式控制
            建立ALV显示样式(layout)和显示字段清单(Field Catalogs)
            第5步:定义事件
            建立事件清单(Event Catalogs)
            第6步:显示ALV
            调用ALV Function Module
            第7步:用户事件
            定义User按键处理事件
            普通的ALV的流程如上图,包含所有常规流程.本质上是展示数据的报表. 以及常用语法的熟练使用,数据转换,逻辑计算等.

            ALV 界面介绍
            ALV组成3大部分
            工具栏
            标题栏
            显示数据的网格控制器 (必要时可以隐藏工具栏和标题栏)
            ABAP|ABAP ALV最常规写法及常用功能详解
            文章图片


            ALV 开发注意事项
            注意事项:
            1、在ALV中,需要注意所有需要显示的列,都必须在相应的内表中有对应的字段, 字段名字不能写错。
            2、在SAP ABAP程序中,字符串的大小写很重要,在单引号包围的字符串中, 一般来说都应该用大写,特别是在调用一些系统的方法时传入字符串参数时。
            3、传入到ALV中的列对应的字段名称也必须使用大写字母,否则数据不会显示出来。
            4、使用宏定义或者子例程可以减少代码量,并且尽可能实现代码的复用。
            5、注意在FORM里定义的变量在离开FORM后,就会被系统释放掉,回收内存空间。

            ALV 基本参数
            ALV 对象参数
            ALV开发中两个重要的对象——FIELDCAT和LAYOUT:
            在调用ALV的函数中,除了定义所输出使用的内表之外,
            还有两个部分是必需确认的:列栏位属性和布局属性。
            列栏位属性FIELDCAT :
            设置输出中具体字段的名称、类型、格式等属性;
            对于系统结构表,函数可参照此结构自动创建列属性,可以没有调用列栏位属性
            布局属性LAYOUT:
            设置输出ALV列表的整体布局的属性,如输出字段的颜色、表格中的线条等。
            没有调用布局属性时,系统按默 认布局输出,不做任何调整。
            两对象同属于类型组SLIS,在ALV开发中必须声明类型组SLIS

            ALV 参数控制Layout
            布局控制[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例外作为 LEDSPACE, '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个字符

            ALV 参数控制Fieldcat
            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…定义数据类型

            ALV定义事件
            * 建立事件清单(Event Catalogs)*需定义事件块,否则出错eventcat_ln-name='TOP_OF_PAGE'. eventcat_ln-form='PAGE_HEADER'.APPENDeventcat_lnTOeventcat.事件块:FORM PAGE_HEADER.ENDFORM.


            ALV DEMO
            1:声明alv
            代码
            REPORT YALVDEMO1.*第一步 :声明alv相关 变量TYPE-POOLS:SILS."引入slis 包 定义 使用专门alvdata:LT_FIELDCATTYPE SLIS_T_FIELDCAT_ALV,"存储fieldcat 内表, 列表标签相关LS_FIELDCATTYPE SLIS_FIELDCAT_ALV,*WA_FIELDCATTYPE SLIS_FIELDCAT_ALV,"定义使用工作区*ls_fieldcatlike LINE OFLT_FIELDCAT,LS_LAYOUTTYPE SLIS_LAYOUT_ALV,"ALV格式控制的结构体LT_EVENT TYPE slis_T_event," 事件的内表LS_EVENT TYPE slis_alv_event."事件的工作区DATA:pgmLIKEsy-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 包,
            建立内表,
            定义变量

            2:定义内表
            代码
            *第二部:定义内表*定义类型.TYPES:BEGIN OF ty_alvshow,CARRID TYPE SPFLI-CARRID,"航线代码CITYFROMtype SPFLI-CITYFROM , "起飞城市.CITYTO TYPE SPFLI-CITYTO, "目标城市FLDATEtype SFLIGHT-FLDATE,"起飞时间PLANETYPE TYPESFLIGHT-PLANETYPE ,"飞机类型SEATSMAX TYPE SFLIGHT-SEATSMAX ,"飞机容量END OF ty_alvshow.*定义内表和工作区data : LT_ALVSHOW TYPE TABLE OF ty_alvshow,"定义内表WA_ALVSHOWTYPE ty_alvshow.

            着重解释
            类型 可以直接写入字段类型中的 类型
            或者干脆 直接写表名-字段也可以.

            3:读取数据
            代码
            *第三部:读取数据selecta~CARRIDCITYFROMCITYTO FLDATEPLANETYPE SEATSMAXFROM spfli as a innerjoinSFLIGHT asb on a~CARRID = b~CARRIDintotable LT_ALVSHOW"内表需要增加tableUP TO 10 ROWS.


            4:字段配置 ALV格式控制.
            代码
            *第四部: ALV 的格式控制. layoutLS_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 .
            注意:显示列数要设置逐级增加,并且要把内表数据覆盖内表 ,并清空内表数据.

            5:定义事件
            代码
            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 .


            6:排序(常用功能)
            代码
            *------第六步排序WA_SORT-fieldname = 'SEATSMAX'.WA_SORT-DOWN = 'X'.APPEND WA_SORT TO LT_SORT .CLEARwa_sort ."清空工作区


            7:显示alv数据
            操作
            光标要留在数据的位置,然后点 模式-->调用功能输入-->REUSE_ALV_GRID_DISPLAY
            -->按回车.-->自动生成代码
            代码
            *第七部分显示alvLS_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= pgmI_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_LAYOUTIT_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=TABLEST_OUTTAB= LT_ALVSHOWEXCEPTIONSPROGRAM_ERROR = 1OTHERS= 2.IF SY-SUBRC <> 0.* Implement suitable error handling hereENDIF.

            解释
            1:生成的代码都是注释的
            2:选择使用的解除注释并赋值

            8:按钮操作标题栏等配置
            代码
            *按钮 guiFORM FORM_PF_STATUS_SETUSING RT_EXTAB TYPE SLIS_T_EXTAB.SET PF-STATUS 'YALVDEMO1_GUI'.ENDFORM.*标题FORMFORM_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'EXPORTINGIT_LIST_COMMENTARY = LT_COMMENTARY.*I_LOGO=*I_END_OF_LIST_GRID=*I_ALV_FORM=ENDFORM.*用户操作按钮FORMFORM_USER_COMMANDUSING R_UCOMM LIKE SY-UCOMMRS_SELFIELD TYPE SLIS_SELFIELD.data : lt_SFLIGHTTYPE table of SFLIGHT ,"内表wa_SFLIGHT typeSFLIGHT."工作区IF R_UCOMM = 'ZYDD1' .MESSAGE '你触发了按钮' TYPE 'I'.ELSEIF R_UCOMM = 'Z_SAVE1' .select*from SFLIGHTinto tablelt_SFLIGHTfor ALL ENTRIES IN LT_ALVSHOWwhere 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 .*MESSAGEWA_ALVSHOW-PLANETYPETYPE 'I'.wa_SFLIGHT-PLANETYPE = WA_ALVSHOW-PLANETYPE .MODIFYlt_SFLIGHT fromwa_SFLIGHT."内表更新ENDIF .CLEAR wa_SFLIGHT .CLEAR WA_ALVSHOW.ENDLOOP.updateSFLIGHT from tablelt_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 写法功能的资料请关注脚本之家其它相关文章!

              推荐阅读