ABAP ALV的创建流程

流程顺序

在这里插入图片描述
ALV的组成主要分为以下3大部分:

  • 工具栏
  • 标题栏
  • 显示数据的网格控制器(必要时可以隐藏工具栏和标题栏)

ALV开发注意事项

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

开发ALV的基本流程

第一步:声明变量

定义ALV所要用到的类型池:type-pools:slis.
针对ALV的控制信息数据(Layout & Fieldcat)

type-pools:slis.  "引入slis包定义使用专门ALV

data: gs_fielcat type lvc_s_fcat,  "ALV控制:字段目录
      gt_fielcat type lvc_t_fcat.  "字段目录的工作区

data: gs_layout type lvc_s_layo.   "ALV控制:布局结构

data: gs_listheader type slis_t_listheader,   "表头的设置
	  gs_setting    type lvc_s_glay.       "网格设置

data: lt_event type slis_t_event,    "事件的内表
      ls_event type slis_alv_event.  "事件的工作区

data: gs_sort type lvc_s_sort,   "ALV控制:排序顺序
	  gt_sort type lvc_t_sort.

data:gs_stbl type lvc_s_stabl.  "ALV控制:刷新稳定性

第二步:定义内表

存放自定义数据文件的数据,以及在ALV中显示

*方法一:
data: begin of gs_out,
    	sel,
      id    type zxytest-id,   "学号
      name  type zxytest-name,  "姓名
      age   type zxytest-age,   "年龄
      sex   type zxytest-sex,   "性别
      hobby type zxytest-hobby,  "爱好

      end of gs_out.
data:gt_out like table of gs_out.
field-symbols: <fs_out> like gs_out. "定义gs_out的指针

* 方法二
types:begin of ls_out,
    	sel,
      id    type zxytest-id,   "学号
      name  type zxytest-name,  "姓名
      age   type zxytest-age,   "年龄
      sex   type zxytest-sex,   "性别
      hobby type zxytest-hobby,  "爱好
      end of ls_out.

data: gs_out    type ls_out,
    	gt_out    type ls_out,
      gs_out_pc type ls_out,
      gt_out_pc type ls_out.

field-symbols:<fs_out> type lt_out.

第三步:读取数据

读取数据存放至Internal Table(内表)

form frm_get_data.
	select * 
   into corresponding fields of table gt_out
    from zxytest
    where id   in s_id
      and name in s_name
      and age  in s_age.
endform.

第四步:ALV格式控制

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

ALV参数控制

在列栏位属性主要用到的参考表
lvc_s_fcat;
lvc_t_fcat.

data:  gs_fielcat  type lvc_s_fcat,
  		  gt_fielcat  type lvc_t_fcat.

fieldcat的部分属性

属性说明
fieldcat-col_pos = n.输出列
fieldcat-fieldname= ‘FIELDNAME’.对应的内表字段名称
fieldcat-reptext = ‘名称’.数据元素文本
fieldcat-ref_field = ‘NAME’.内部表字段的参考字段名称
fieldcat-ref_table = ‘ZXYTEST’.内部表字段的参考表名称
fieldcat-seltext_s/m/l = ‘列名’.输出列文本(_s:短文本,_l:长文本,_m:中文本)
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,‘X’,‘L’,‘C’.对齐方式
fieldcat-lzero = ‘X’.输出前导零
fieldcat-no_sign = ‘X’.输出抑制符号
fieldcat-no_zero = ‘X’.为输出隐藏零
fieldcat-edit_mask = SAPACE,mask.输出编辑掩码格式
fieldcat-edit准备输入
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…定义数据类型

gs_fielcat的代码用例

form frm_fieldcat.
	data:lv_colpos type i.
   "定义一个宏
   define alv_fieldcat.
   clear:gs_fielcat.
   gs_fielcat-col_pos      = lv_pos.  "输出列
   gs_fielcat-fieldname    =  &1.   "ALV控制:内部表字段的字段名称
   gs_fielcat-reptext      =  &2.   "标题
   gs_fielcat-scrtextl     =  &2.   "长字段标签
   gs_fielcat-scrtextm     =  &2.   "中字段标签
   gs_fielcat-scrtexts     =  &2.   "短字段标签
   gs_fielcat-ref_field    =  &3.   "ALV 控制:内部表字段的参考字段名称
   gs_fielcat-ref_table    =  &4.   "ALV控制:内部表字段的参考表名称
   gs_fielcat-key          =  &5.   "ALV控制:关键字段
   gs_fielcat-emphasize    =  &6.   "ALV控制:带有颜色的高亮列
   gs_fielcat-outputlen    =  &7.   "ALV控制:列的字符宽度
   gs_fielcat-edit      	 =  &8.   "ALV控制:准备输入

   append gs_fielcat to gt_fielcat.   "将gs_fielcat中的值赋值给gt_fielcat
   lv_colpos += 1.
   end-of-definition.
   
   refresh gt_fielcat.
   lv_colpos = 1.

   "调用宏,创建ALV字段目录
   alv_fieldcat 'ID'    '学号'  'ID'    'ZXYTEST'  'X' ''     'X' ' '.
   alv_fieldcat 'NAME'  '姓名'  'NAME'  'ZXYTEST'  ' ' 'C111' 'X' 'X'.
   alv_fieldcat 'AGE'   '年龄'  'AGE'   'ZXYTEST'  ' ' ''     'X' ' '.
   alv_fieldcat 'SEX'   '性别'  'SEX'   'ZXYTEST'  ' ' ''     'X' 'X'.
   alv_fieldcat 'HOBBY' '爱好'  'HOBBY' 'ZXYTEST'  ' ' 'C610' 'X' 'X'.
endform.

以上代码主要是利用宏来创建ALV字段目录,其中字段目录最多可以有9个属性,因为宏的最大占字符为9.其中必须拥有的字段目录属性是fieldname(内部表的字段名称)、reptext(内部表的字段标题,其中与reptext在同一个占字符还有scrtext_l(长字段标签)、scrtext_m(中字段标签)、scrtext_s(短字段标签))、ref_field(内部表字段的参考字段名)、ref_table(内部表字段的参考表名称)。除了以上4个是必须存在的,其他根据要求选择,可以在lvc_s_fcat结构中查看。
定义宏的时候用了几个占字符,则在使用的时候就必须有几个占字符。

ALV参数控制(gs_layout)

在布局属性主要用到的参考表
lvc_s_layo

data:gs_layout type lvc_s_layo.

layout的部分属性
布局控制[Layout]
布局是用来控制整个ALV的一个布局,比如:ALV的标题是否可以编辑,行颜色,列颜色。
参照ALV的控制结构[LVC_S_LAYO]。
详细的结构说明如下:(注意这些字段的取值,单引号内,’ '空格代表否,'X’代表是)

字段名描述取值范围
cwidth_opt最优化宽度space, ‘X’
smalltitle小标题space,‘X’
grid_title标题,在网格和工具条之间最长70个字符
no_headers列标题隐藏space, ‘X’
no_hgridln隐藏水平线space, ‘X’
no_marging禁用单元格合并space, ‘X’
no_rowmark禁用系统自带的行选择‘X’为D和A的时候隐藏space, ‘X’
no_toolbar隐藏工具条space, ‘X’
no_vgridln隐藏垂直线space, ‘X’
sel_mode选择模式space, ‘X’
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个字符
box_fnameALV控制:内部表字段的字段名称space, ‘X’

gs_layout的代码用例

form frm_layout.
	clear: gs_layout.
 gs_layout-zebra  =  'X'.   "斑马线,ALV控制:可选行颜色
 gs_layout-cwidth_opt = 'X'.  "ALV控制:优化列宽
 gs_layout-box_fname  = 'SEL'.  "ALV控制:内部表字段的字段名称
 
endform.

zebra(ALV控制:可选行颜色)、cwidth_opt(ALV控制:优化列宽)、box_fname(ALV控制:内部表字段的字段名称)是ALV中最主要的三个样式,如果还需要其他样式可以在lvc_s_layo结构中查看需要添加的样式。

第五步:定义事件

建立事件清单(Event Catalogs),主要用到的参考表:
slis_t_event,
slis_alv_event.

data: gs_event type slis_t_event,
	    gt_event type slis_alv_event.

第六步:显示ALV

ALV数据的显示

调用ALV须有使用Function Module ‘REUSE_ALV_GRID_DISPLAY_LVC’.ALV的调用都需要调用这个方法在能实现。

form drm_display_data.
	call function 'REUSE_ALV_GRID_DISPLAY_LVC'
    exporting
*     I_INTERFACE_CHECK        = ' '
*     I_BYPASSING_BUFFER       =
*     I_BUFFER_ACTIVE          =
    	i_callback_program     	 = sy-repid
      i_callback_pf_status_set = 'SUB_STATUS_SET'  "设置标题栏和状态栏
      i_callback_user_command  = 'SUB_USER_COMMAND' "ALV触发事件
*     I_CALLBACK_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_setting   				 = gs_setting
      is_layout_lvc 					 = gs_layout
      it_fieldcat_lvc					 = gt_fielcat
*     IT_EXCLUDING             =
*     IT_SPECIAL_GROUPS_LVC    =
*     IT_SORT_LVC              =
*     IT_FILTER_LVC            =
*     IT_HYPERLINK             =
*     IS_SEL_HIDE              =
*     I_DEFAULT                = 'X'
    	i_save           				 = 'X'
*     IS_VARIANT               =  
      it_events								 = lt_event
*     IT_EVENT_EXIT            =
*     IS_PRINT_LVC             =
*     IS_REPREP_ID_LVC         =
*     I_SCREEN_START_COLUMN    = 0
*     I_SCREEN_START_LINE      = 0
*     I_SCREEN_END_COLUMN      = 0
*     I_SCREEN_END_LINE        = 0
*     I_HTML_HEIGHT_TOP        =
*     I_HTML_HEIGHT_END        =
*     IT_ALV_GRAPHICS          =
*     IT_EXCEPT_QINFO_LVC      =
*     IR_SALV_FULLSCREEN_ADAPTER        =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER  =
*     ES_EXIT_CAUSED_BY_USER   =
  	tables
       t_outtab    						 = gt_out
    exceptions
        program_error 				 = 1
        others								 = 2.
  if sy-subrc = 0.
    message id sy-msgid type sy-msgty number sy-msgno
    with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif
endform.
REUSE_ALV_GRID_DISPLAY_LVC方法中一些参数的解释
  1. i_structre_name参数
    为了制作输出表的形式输入ABAP数据字典结构体名字。只要设置这个参数会自动生成符合此结构体的字段目录。即在程序内部没有必要重新构成字段目录。
call function 'REUSE_ALV_GRID_DISPLAY_LVC'
    exporting
    i_structre_name = 'MARA'.  "系统将自动生成符合“mara”结构体的字段目录

mara(常规物料数据)是ABAP数据字典结构体中存在的结构体名字,只要i_structre_name = ‘MARA’,那么系统会自动生成与mara结构体相对应的字段目录,无需在内部重新构成字段目录。这样ALV将会显示mara整个表中的字段名。应该可以应用在只参考同一张abap数据字典结构体,且输出该结构体的所有字段名时可以用该参数。

  1. is_variant参数
    可以设置ALV列表变式(Variant)。列表变式把修改的画面字段顺序、排列字段等操作保存成一个变式,以便以后查询时以同样式显示。首先需要在报表程序中追加用于选择布局的参数及功能。
data: gs_variant type disvariant.

call screen 100.
gs_variant-report  = sy_repid.
gs_variant-username = sy-uname.

call function 'REUSE_ALV_GRID_DISPLAY_LVC'
    exporting
    is_variant = gs_variant

  1. i_save参数
功能
X只能设置全局变量
U只限特定用户的布局
A同时包含X和U
SPACE不保存布局
  1. i_default参数
    决定用户是否能保存默认变式
值 功能
X可以设置默认变式
SPACE不能设置默认变式
  1. t_outtab参数
    t_outtab参数是定义要显示数据的输出表的参数。换句话说就是指定包含要显示数据的内表的参数。
设置标题栏和状态栏
form sub_status_set using rt_extab    type slis_t_extab
                        	rs_selfield type slis_selfield.
	set pf-status 'STATUS01'.    "状态栏
  set titlebar 'TITLE'.        "标题栏,可以更改ALV最上面的标题
endform
ALV触发事件
form sub_user_command using rv_ucomm    like sy-ucomm
                          	rs_selfield type slis_selfield.
	"刷新ALV输出表数据
   data:lo_grid type ref to cl_gui_alv_grid.
   call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
   		importing
        e_grid = lo_grid.
    call method lo_grid->check_changed_data.  "检查改变的数据
    call method lo_grid->refresh_table_display.  "刷新ALV
endform.

第七步:用户事件

定义USER按键处理事件
在上述的ALV触发事件sub_user_command下面使用。

form sub_user_command using rv_ucomm    like sy-ucomm
                          	rs_selfield type slis_selfield.
  	case rv_ucomm.
     when '自定义按钮名'
       "该按钮的逻辑写在这里
     when others.
    endcase. 
endform.
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值