• ALV细节再梳理2022.8.5


    ALV实质是一个屏幕控件对象,它通过程序传递数据内表的方式来显示数据
    实现方法:
    1.调用标准函数
    2.优化接口:用户可以实现对字段的排序,筛选以及统计等功能

    fieldcat TYPE slis_t_fieldcat_alv
    作用
    1.列格式设置(表单)
    2.字段名称,列是否可修改,列宽度等设置

    layout TYPE slis_layout_alv
    作用:
    1.全局格式设置(结构)
    2.整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等

    函数:REUSE_ALV_FIELDCATLOG_MERGE
    作用:
    1.根据内表结构返回FIELDCAT字段结构信息

    函数:REUSE_ALV_GRID_DISPLAY/REUSE_ALV_LIST_DISPLAY
    作用:
    1.使用GRID/LIST模式输出ALV报表

    START-OF-SELECION
    作用:
    数据表单的选取

    END-OF-SELECTION
    作用:
    1.对FIELDCAT赋值:设置每列格式
    2.对LAYOUT赋值:设置表单格式(可选)
    3.对SORT表等赋值:设置排序内容等(可选)
    4.给EVENT表赋值:增加程序交互事件(可选)
    5.调用函数,输出ALV

    REPORT		ZHQ_10   MESSAGE-ID		ZHQ.
    INCLUDE	ZHQ_10TOP.
    INCLUDE	ZHQ_10FORM.
    
    START-OF-SELECTION.
    	PERFORM 	GET_DATA.
    
    END-OF-SELECTION.
    	IF GT_MARD[]	IS  NOT  INITAL.
    		PERFORM  WRITE_DATA.
    	ELSE.
    		MESSAGE S001		DISPLAY   LIKE  'E' .
    	ENDIF.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    FORM  WRITE_DATA.
    	PERFORM BUILD_FIELDCAT.
    	PERFORM	BUILD_LAYOUT.
    	PERFORM	BUILD_SORT.
    	PERFORM	BUILD_EVENT.
    	PERFORM	BUILD_ALV.
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    我们一般的的习惯是,在START-OF-SELECTION下面写GET_DATA 获取数据
    在END-OF-SELECTION 后面写展示数据。

    START-OF-SELECTION.
    	PERFORM GET_DATA.
    
    END-OF-SELECTION.
    	PERFORM	DISPLAY_DATA.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们一般如此定义我们数据所在的内表 GT_STUDENT
    以及我们数据所在的工作区 GS_STUDENT

    DATA  GT_STUDENT  TYPE TABLE OF ZSTUDENT_HQ_03.
    DATA  GS_STUDENT	 TYPE TYPE  ZSTUDENT_HQ_03.
    
    • 1
    • 2

    我们如此命名 FUNCTION ALV 来控制我们的列属性

    DATA 	GT_FIELDCAT 	TYPE SLIS_T_FIELDCAT_LAV.		"列属性
    DATA	GS_FIELDCAT	TYPE SLIS_FIELDCAT_ALV.			" 
    
    • 1
    • 2

    其中我们的display_DATA.这样写

    FORM DISPLAY_DATA.
    	PERFORM	BUILD_FIELDCAT.
    
    	PERFORM	BUILD_ALV.
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后下面是我们BUILD_的具体内容

    FORM BUILD_FIELDCAT.
    	CLEAR  GS_FIELDCAT.
    	GS_FIELDCAT-COL_POS		= '1'.
    	GS_FIELDCAT-FIELDNAME  = 'ZCODE'.
    	GS_FIELDCAT-OUTPUTLEN = '10'.
    	GS_FIELDCAT-SELTEXT_M	= '学生编号'.
    	APPEND	GS_FIELDCAT	TO	GT_FIELDCAT.
    
    	CLEAR	GS_FIELDCAT.
    	GS_FIELDCAT-COL_POS		= '2'.
    	GS_FIELDCAT-FIELDNAME	=	'ZNAME'.
    	GS_FIELDCAT-OUTPUTLEN	= '20'.
    	GS_FIELDCAT-SELTEXT_M	=	'学生姓名'.
    	APPEND		GS_FIELDCAT	TO	GT_FIELDCAT. 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    我们是这样创建宏的

    *每个宏中最多可以定义9个参数
    DEFINE  %%APPEND_FIELDCAT.			"两个百分号是为了与其他变量形成命名上的区别,不是强制要求的
    	CLEAR	GS_FIELDCAT.
    	GS_FIELDCAT-COL_POS		= &1.		"&代表对应的占位符
    	GS_FIELDCAT-FIELDNAME	= &1.
    	GS_FIELDCAT-OUTPUTLEN = &1.
    	GS_FIELDCAT-SELTEXT_M	=	&1.
    	APPEND	GS_FIELDCAT	TO	GT_FIELDCAT. 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上述这样的代码写完之后我们 FORM BUILD_FIELDCAT中的内容就可以变成

    FORM BUILD_FIELDCAT.
    
    	%%APPEND_FIELDCAT:	'1'  'ZCODE'		'10'    '学生编号',
    												'2'  'ZNAME'		'20'    '学生姓名'.
    
    • 1
    • 2
    • 3
    • 4

    我们需要一列来定义图标输出的内容

    TYPES:	BEGIN	OF GTY_STUDENT.
    	INCLUDE STRUCTURE	ZSTUDENT_HQ_03.
    TYPES:	ICON	TYPE C	LENGTH 	4 . 	"图标
    TYPES:	CHCHK	TYPE C	LENGTH	1.		"复选框
    TYPES:	END	OF 	GTY_STUDENT.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果我们选择了加上图标或者复选框
    那么我们对应的宏定义应该修改成如下的样子

    CASE &2.
    	WHEN	'ZCODE'	.
    		GS_FIELDCAT-KEY	= 'X' .
    	WHEN	'ICON'	,
    		GS_FIELDCAT-ICON	=	'X'.
    	WHEN 'CHECK'.
    		GS_FIELDCAT-CHECKBOX	= 'X'.
    	WHEN 'WEIGHT'.
    		  GS_FIELDCAT-DO_SUM	= 'X'.		''DO-SUM会在最下面一行显示合计数量
    	ENDCASE.
    
    	APPEND GS_FIELDCAT	TO GT_FIELDCAT.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    同时要注意在宏定义里面进行修改

    	%%APPEND_FIELDCAT:	'1'  'ZCODE'		'10'    '学生编号',
    												'2'  'ZNAME'		'20'    '学生姓名',
    												'3'  'SEX'			'3'    '姓名',
    												'4'  'ZSCHOOL'		'10'    '学校',
    												'5'  'WEIGH'		'20'    '体重',
    												'6'  'ZUNIT'		'20'    '单位',
    												'7'  'ICON'		'20'    '图标',
    												'8'  'CHECK'		'20'    '复选框'.							
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    我们在子程序DISPLAY_DATA中,专门创建一个perform BUILD_LAYOUT

    FORM	DISPLAY_DATA.
    	PERFORM	BUILD_FIELDCAT.
    	PERFORM	BUILD_LAYOUT.
    	PERFORM	BUILD_ALV.
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    并创建FORM BUILD_LAYOUT.

    FORM	BUILD_LAYOUT.
    	GS_LAYOUT-colwidth_optimize	= 'X'.
    	GS_LAYOUT-ZEBRA	= 'X'.
    	GS_LAYOUT-KEY_HOTSPOT = 'X'. 
    ENDFORM.	
    
    • 1
    • 2
    • 3
    • 4
    • 5

    FORM BUILD_LAYOUT.
    我们还可以这样设置

    FORM	BUILD_LAYOUT.
    	GS_LAYOUT-colwidth_optimize	= 'X'.		"优化列宽
    	GS_LAYOUT-ZEBRA	= 'X'	.					"斑马纹输出
    	GS_LAYOUT-KEY-HOTSPOT = 'X'.		"热点
    	GS_LAYOUT-BOX_FIELDNAME = 'BOX' .	"内表中字段名称 - 定义为当前行的选择
    
    	GS_LAYOUT-DETALL_INITIAL_LINES	= 'X'.
    	
    	GS_LAYOUT-WINDOW_TITLEBAR	= '窗体抬头'.
    	GS_LAYOUT-confirmation_prompt		= 'X'.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们的FORM BUILD_SORT.可以这么写

    FORM BUILD_SORT.
    *1.按照学生升序
    	CLEAR GS_SORT.
    	GS_SORT-spos	= '1'.
    	GS_SORT-fieldname	=	'ZSCHOOL'.
    	GS_SORT-UP				=	'X'.
    	GS_SORT-subtot		= 'X'.
    	APPEND	GS_SORT	TO	GT_SORT.
    *2.按照性别降序
    	CLEAR	GS_SORT.
    	GS_SORT-spos = '2'.
    	GS_SORT-fieldname = 'SEX'.
    	GS_SORT-DOWN	  = 'X' .
    	APPEND GS_SORT 	TO	GT_SORT .
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    此时FUNCITON ALV 应该如下

    DATA  GT_FIELDCAT	TYPE SLIS_T_FIELDCAT_ALV.			"列属性
    DATA  GS_FIELDCAT	TYPE SLIS_FIELDCAT_ALV.
    
    DATA	GS_LAYOUT	TYPE SLIS_LAYOUT_ALV	.			"全局参数
    
    DATA	GT_SORT		TYPE	SLIS_T_SORTINFO_ALV.		"排序
    DATA	GS_SORT		TYPE	SLIS_SORTINFO_ALV.			
    
    DATA	GT_FILTER		TYPE	SLIS_T_FILTER_ALV.				"筛选
    DATA	GS_FILTER		TYPE 	SLIS_FILTER_ALV	.				
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    现在我们要写这样一个ALV
    要求如下:
    1.从STUDENT表单进行取数,使用FUNCTION ALV进行输出
    2.设置重量单位的关联
    3.设置斑马纹
    4.设置学号字段为KEY

    测试it_filter字段:
    要求:性别不为空

    字段名
    插入类型select-option的限制
    SIGN OPTION LOW
    E EQ ‘’

    现在我们来写这样一个FORM BUILD_FILTER.

    FORM	BUILD_FILTER.
    	CLEAR	GS_FILTER.
    	GS_FILTER-FIELDNAME	=	'SEX'.		"字段名
    	GS_FILTER-SIGN0				=	'E'			"不包含
    	GS_FILTER-OPTIO			=	'EQ'			"等于
    	GS_FILTER-VALUF			=	' '       		"空值
    	APPEND			GS_FILTER		TO	GT_FILTER.
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ALV事件

    处理ALV事件我们一般就是控制 ‘REUSE_ALV_GRID_DISPLAY’ 中的 CALLBACK选项
    例如
    I_CALLBACK_PROGRAM
    I_CALLBACK_PF_STATUS_SET
    I_CALLBACK_USER_COMMAND
    I_CALLBACK_TOP_OF_PAGE
    I_CALLBACK_HTML_TOP_OF_PAGE
    I_CALLBACK_HTML_END_OF_LIST

    还有IT_EVENT 选项,并需要定义内表

    DATA	GT_EVENTS		TYPE SLIS_T_EVENT.
    DATA	GS_EVENTS		TYPE SLIS_ALV_EVENT.
    
    • 1
    • 2

    并创建 FORM BUILD_EVENTS.

    FORM	BUILD_EVENTS.
    	CLEAR GS_EVENTS.
    	GS_EVENTS-NAME = 'PF_STATUS_SET'.		
    	GS_EVENTS-FORM = 'SET_STATUS'.				“自定义的子程序名
    	APPEND		GS_EVENTS	TO	GT_EVENTS.
    
    	CLEAR	GS_EVENTS.
    	GS_EVENTS-NAME	=	'USER_COMMAND'.
    	GS_EVENTS-FORM	=	'FM_USER_COMMAND'.
    	APPEND		GS_EVENTS	TO	GT_EVENTS.
    ENDFORM.
    
    *根据自定义的子程序名来定义
    FORM	SET_STATUS   USING  RT_EXTAB 	TYPE SLIS_T_EXTAB.
    	SET		PF-STATUS		'STATUS'		EXCLUDING		RT_EXTAB.	
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    FORM	FM_USER_COMMAND	USING  R_UCOMM		LIKE	SY-UCOMM
    																  R_SELFIELD	TYPE	SLIS_SELFIELD
    		CASE	R_UCOMM.
    			WHEN	'CALLSF'.
    				"PERFORM		CALL_SMARTFORMS.
    			WHEN	'DOWNLOAD'.
    				"PERFORM		DOWNLOAD_FILE.
    		ENDCASE.
    ENDFORM.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    ALV如何增加按钮

    那么便是通过 IT_EVENTS 这个选项
    1.此处增加按钮到应用工具栏
    2.创建GUI_STATUS

    FORM	SET_STATUS	USING P_EXTAB	TYPE	SLIS_T_EXTAB,
    	SET	PF-STAUS	'STATUS'.
    ENDFORM.
    
    • 1
    • 2
    • 3
    DATA:	GT_EVENT	TYPE SLIS_T_EVENT,
    			GS_EVENT	TYPE	SLIS_ALV_EVENT.
    
    • 1
    • 2

    3.增加一个FORM
    传入参数参照SLIS_T_EXTAB
    使用SET PF-STATUS语句设置按钮

    4.向EVENT表中增加事件
    事件名:PF_STATUS_SET
    子程序名:设置按钮的子程序

    5修改ALV调用参数
    给IT_EVENTS传EVENT表

    FORM BUILD_EVENT.
    	GS_EVENT-NAME	= 'PF_STATUS_SET'.
    	GS_EVENT-FORM	= 'SET_STATUS'.
    	APPEND		GS_EVENT	  TO  GT_EVENT.
    ENDFORM.
    	
    	
    
    6.或者不向EVENT传值,而是在ALV的创建函数中,向 I_CALLBACK_PF_STATUS_SET直接传子程序的名称。
    
    ```abap
    CALL FUNCTION	'REUSE_ALV_GRID_DISPLAY'
    	EXPORTING
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    IT_EVENT						=   GT_EVENT
    
    • 1

    假设我们要取如下字段,分为 SPFLI 和 SFLIGHT 两张表 并且我们查出来两个表中的关联关系如下图,
    在这里插入图片描述
    那么我们根据上表中的关联关系(即两张表都共有的属性,可以写出如下的SQL语句来取数)

    第一步,去航线信息 SPFLI (包括选择界面的4个条件)
    第二步,取航班信息,for all entries in 航线信息
    第三步,要注意循环数据量更大的表,例如在上图中,SPFLI 航线信息为15条数据,而SFLIGHT为150条信息,若选择
    SPFLI,则一定有135条数据无法被读到。

    SELECT 	CARRID 	CONNID  COUNTRYFR 	CITYFROM 	COUNTRYTO		CITYTO
    	FROM		SPFLI
    	INTO	CORRESPONDING	FIELDS	OF	TABLE	GT_SPFLI
    WHERE	CARRID		IN	S_CARRID
    	AND	CONNID		IN	S_CONNID
    	AND	COUNTRYFR		IN	S_CONFR
    	AND	COUNTRYTO		IN	S_CONTO.
    
    CHECK	GT_SPFLI[] 	IS		NOT	INITIAL.
    SELECT	CARRID  CONNID	FLDATE	PRICE		CURRENCY
    	FROM		SFLIGHT
    	INTO	CORRESPONDING	FIELDS	OF	TABLE GT_SFLIGHT
    		FOR	ALL	ENTRIES	IN	GT_SPFLI
    	WHERE	CARRID	=	GT_SPFLI-CARRID
    		AND	CONNID	=	GT_SPFLI-CONNID
    		AND	FLDATE	IN	S_FLDATE.
    
    LOOP	AT	GT_SFLIGHT.
    	MOVE-CORRESPONDING	GT_SFLIGHT	TO	GT_TOTAL.
    	READ	TABLE	GT_SPFLI	WITH	KEY	CARRID	=	GT_SFLIGHT-CARRID	CONNID	= GT_SFIGHT-CONNID	BINARY	SEARCH
    	IF	SY-SUBRC	= 0.
    		GT_TOTAL-PRICE	= …….				
    		GT_TOTAL-CURRENCY=......
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    mard 物料在库存地点下的数据
    mara 物料的一般数据
    makt 物料描述文本

    ALV的布局管理

    ALV中,若想保存布局,要添加I_SAVE参数
    I_SAVE 定义为C数据类型,值如下:
    - ‘’ = 不能保存布局
    - ‘X’ = 布局只能被保存为标准布局
    - ‘U’ = 只能指定用户布局
    - ‘A’ = 既能选择标准布局,也可以选择指定用户布局

    为了进一步管理布局,则需要加入 IS_VARIANT参数
    - 其数据结构参考DISVARIANT
    - 设置字段
    - REPORT = SY-REPID "程序名称
    - VARIANT 为布局保存格式
    - 有三个有用函数供调用保存的格式布局,分别为
    - REUSE_ALV_VARIANT_DEFAULT_GET 读取默认的布局
    - REUSE_ALV-VARIANT_EXISTENCE 检测指定布局是否存在
    - REUSE_ALV_VARIANT_F4 显示布局格式选择对话窗

    优先级
    - 当排序,筛选等也设置时,以布局管理参数设置优先
    - 当用户设置布局参数默认值时,以布局参数传值优先

  • 相关阅读:
    strcmp和stricmp,C 标准库 string.h
    头歌答案--数据持久化(非数据库)
    springboot 多线程实现
    Deepin Linux系统怎安装打印机? 兄弟1618w打印机驱动安装图文教程
    JAVA计算机毕业设计蔬菜水果销售系统源码+系统+mysql数据库+lw文档
    笔记本重装系统找回预装的office
    eNSP-OSPF协议其他区域不与骨干区域相连解决方法3
    焱融全闪系列科普| 为什么 SSD 需要 NVMe?
    SpringBoot 学习(六)Shiro
    企业专线成本高?贝锐蒲公英轻松实现财务系统远程访问
  • 原文地址:https://blog.csdn.net/weixin_43847969/article/details/126170547