*&---------------------------------------------------------------------*
*& Report Z4_ZSD_ALVTEST002
*&
*&---------------------------------------------------------------------*
*& CreatBy ShiQiang
*& 1.使用到的表sflight航班表
*& 2.定义选择屏幕,含有单值参数P_PRICE(PARAMETER)和S_DATE(SELECT-OPTIONS)
*& 3.为价格设定默认值5000,为查询周期设定默认值为当前月,即起止日期分别为当前月的第一天和最后一天
*& 4.查询航班日期(fldate)在指定周期范围内并且航空运费(price)高于指定价格的所有航班记录
*& 5.按航班日期降序排序
*& 6.使用alv方式输出查询结果
*&---------------------------------------------------------------------*
REPORT Z4_ZSD_ALVTEST002 NO STANDARD PAGE HEADING.
*引用类型组SLIS是系统定义的类型组,ALV相关操作的类型都在其中
TYPE-POOLS:SLIS.
*定义表工作区
TABLES:SFLIGHT.
DATA ITAB_SFLIGHT TYPE TABLE OF SFLIGHT. "定义内表,存放查询结果
DATA:LD_CURDATE LIKE SY-DATUM, "定义日期类型变量,记录当前日期
LD_LASTDATE LIKE SY-DATUM. "定义日期类型变量,记录当前日期所在月份最后一天的日期
DATA:WA_FIELD TYPE SLIS_FIELDCAT_ALV,
*定义字段属性工作区变量,定义内表中各字段变量在表格中输出的属性
IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV. "定义字段目录组变量,是与wa_field同结构类型的内表
DATA:G_REPID LIKE SY-REPID. "定义变量,记录当前程序名
*定义选择屏幕,可定义块区域对不同功能的选择条件进行分组显示
*此处注意:代码编辑完成后保存并激活,然后进入:系统菜单-〉转到->文本元素->选择文本
*定义屏幕块区域的文本标题和各相关选择条件的描述文本,完毕后同样需要对选择文本执行激活操作
*---------------------------------------------------------*
*SELECTION-SCREEN
*---------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLK WITH FRAME TITLE TEXT-001.
PARAMETER P_PRICE TYPE I OBLIGATORY. "定义单值输入参数,航班价格,类型为整型且为必选项
SELECT-OPTIONS S_DATE FOR SFLIGHT-FLDATE.
"定义选择区间参数,航班日期,可以多值输入,也可以直接定义上下限
SELECTION-SCREEN END OF BLOCK BLK.
*---------------------------------------------------------*
*INITIALIZATION
*---------------------------------------------------------*
INITIALIZATION.
G_REPID = SY-REPID.
P_PRICE = '2000'.
PERFORM INITDATE. "调用子程序InitDate,指定查询周期为当前月
*选择条件输入后,开始执行查询前,对所输入的条件进行约束性检查
*---------------------------------------------------------*
*AT SELECTION-SCREEN
*---------------------------------------------------------*
IF S_DATE-LOW IS INITIAL. "没用指定查询日期,则调用MESSAGE方法,提示错误信息,注意MESSAGE方法的使用
MESSAGE E888(SABAPDOCU) WITH '请输入查询日期'.
ENDIF.
*---------------------------------------------------------*
*START-OF-SELECTION
*---------------------------------------------------------*
START-OF-SELECTION.
PERFORM GETDATA. "从数据库中将符合指定日期和航班运费价格的数据取出存放到内表中
END-OF-SELECTION.
PERFORM SETFIELDCAT. "调用子程序,设置ALV输出的字段目录属性
PERFORM DISPLAYBYALV. "调用子程序以ALV方式输出查询结果
*---------------------------------------------------------*
*FORM INITDATE
*根据当前月份初始化查询日期区间
*---------------------------------------------------------*
FORM INITDATE.
LD_CURDATE = SY-DATUM."从系统变量sy-datum中获取当前日期,并赋值给变量ld_curdate
CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'
"调用功能模块RP_LAST_DAY_OF_MONTHS 取得当前月最后一天的日期,输出结果赋值给变量ld_lastdate
EXPORTING
DAY_IN = LD_CURDATE
IMPORTING
LAST_DAY_OF_MONTH = LD_LASTDATE
EXCEPTIONS
DAY_IN_NO_DATE = 1.
LD_CURDATE+6(2) = '01'. "修改当前日期为当前月的第一天
S_DATE-LOW = LD_CURDATE.
S_DATE-HIGH = LD_LASTDATE.
APPEND S_DATE.
ENDFORM. "INITDATE
*---------------------------------------------------------*
*FORM GETDATA
*从数据库中获取数据
*---------------------------------------------------------*
FORM GETDATA.
*从数据中将符合选择条件的航班记录读取到内表中
SELECT * FROM SFLIGHT
INTO TABLE ITAB_SFLIGHT
WHERE FLDATE IN S_DATE AND PRICE > P_PRICE.
*按照航班日期降序排列查询结果
SORT ITAB_SFLIGHT BY FLDATE DESCENDING.
ENDFORM. "GETDATA
*---------------------------------------------------------*
*FORM SETFIELDCAT
*根据业务需要,设定内表数据在ALV表格中输出的属性
*---------------------------------------------------------*
FORM SETFIELDCAT.
CLEAR WA_FIELD.
*定义宏代码
DEFINE ADDFIELDCAT.
WA_FIELD-COL_POS = &1. "字段在表格中对应的列顺序
WA_FIELD-FIELDNAME = &2. "内表中的字段名称,注意:必须用大写字母
WA_FIELD-SELTEXT_L = &3. "对应的列头文本
WA_FIELD-JUST = &4. "列对齐方式,可以取值:L 居左对齐,R 居右对齐, C 居中对齐
*添加字段属性到字段目录表中
APPEND WA_FIELD TO IT_FIELDCAT.
END-OF-DEFINITION.
*调用预定义的宏代码,逐个将要显示字段的属性设定添加到字段目录组中
ADDFIELDCAT 1 'CARRID' '航线承运人ID' 'L'.
ADDFIELDCAT 2 'CONNID' '航班连接ID' 'L'.
ADDFIELDCAT 3 'FLDATE' '航班日期' 'L'.
ADDFIELDCAT 4 'PRICE' '航空运费' 'R'.
ADDFIELDCAT 5 'PLANETYPE' '飞机类型' 'L'.
ADDFIELDCAT 6 'SEATSMAX' '座位数量' 'C'.
ENDFORM. "SETFIELDCAT
*---------------------------------------------------------*
*FORM DISPLAYBYALV
*用ALV方式显示查询结果
*---------------------------------------------------------*
FORM DISPLAYBYALV.
DATA:GS_LAYOUT TYPE SLIS_LAYOUT_ALV. "定义ALV表格属性变量,设置相关显示属性
GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'. "设置ALV表格输出的时候,列宽根据数据长度自动适应
GS_LAYOUT-ZEBRA = 'X'. "设置aLV表格输出的时候,数据行背景色交替显示
*调用功能模块REUSE_ALV_GRID_DISPLAY完成ALV的显示输出
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "
EXPORTING
I_CALLBACK_PROGRAM = G_REPID "回调的程序名
IT_FIELDCAT = IT_FIELDCAT "字段目录组
IS_LAYOUT = GS_LAYOUT "
TABLES
T_OUTTAB = ITAB_SFLIGHT "要显示的查询结果内表
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM. "DISPLAYBYALV
图片1.查询界面
图片2.显示效果