今天学习制作一个报表,最基本的报表,显示效果和se11进去查看表数据差不多。用ALV制作报表大概有4个步骤:
1.定义一些数据结构,主要是用于存数和显示的内表和alv的一些参数变量。
2.制作屏幕(界面).
3.获取屏幕输入的数据,用该数据从数据库中获取所需的数据放到前面定义的内表中。
4.调用ALV生成函数。其中还要为ALV定义表结构,布局等信息,主要是layout和fieldcat。其中定义报表字段fieldcat的时候可以用子程序便捷的赋值。
下面是学习代码:主要功能是从屏幕输入学号范围,然后联合查询两个表,得到该学号范围内的数据。
*&---------------------------------------------------------------------*
*& 程序ID:ZTEST_YHY_06
*&程序名称:
*程序描述:联合查询两个表,使用alv显示结果
*&---------------------------------------------------------------------*
*开发人员:
*&---------------------------------------------------------------------*
*&修改日期 版本 修改人 修改描述
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_YHY_06.
*&---------------------------------------------------------------------*
*&INCLUDE 部分
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&表的声明
*&---------------------------------------------------------------------*
TABLES: zyhy_table01, "学生基本信息表
zyhy_table02. "学生其他信息表
*&---------------------------------------------------------------------*
*&数据类型声明
*&---------------------------------------------------------------------*
TYPES: BEGIN OF ty_data,
zxh2 TYPE zyhy_table01-zxh2, "学号
zxm2 TYPE zyhy_table01-zxm2, "姓名
zxb2 TYPE zyhy_table01-zxb2, "性别
zsg2 TYPE zyhy_table01-zsg2, "身高
znl2 TYPE zyhy_table01-znl2, "年龄
zdh2 TYPE zyhy_table01-zdh2, "电话
zzy2 TYPE zyhy_table02-zzy2, "专业
zjg2 TYPE zyhy_table02-zjg2, "籍贯
zsfz2 TYPE zyhy_table02-zsfz2, "身份证
END OF ty_data.
*&---------------------------------------------------------------------*
*&内表和工作区声明
*&---------------------------------------------------------------------*
DATA: it_data TYPE STANDARD TABLE OF ty_data, "学生信息表,就是用来显示报表的。
wa_data TYPE ty_data. "学生信息表工作区
*ALV 使用
DATA: it_fieldcat TYPE SLIS_T_FIELDCAT_ALV, "slis是一个类型组,se11可见或双击。
wa_fieldcat LIKE LINE OF it_fieldcat,
wa_layout TYPE SLIS_LAYOUT_ALV.
*&---------------------------------------------------------------------*
*&全局变量的声明
*&---------------------------------------------------------------------*
DATA: g_xh TYPE zyhy_table01-zxh2.
*&---------------------------------------------------------------------*
*&常量的声明
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&宏的定义
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&选择屏幕的定义
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_xh FOR g_xh. "学号
SELECTION-SCREEN END OF BLOCK blk0.
*&---------------------------------------------------------------------*
*&INITIALIZATION
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&选择屏幕事件
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&START-OF-SELECTION 程序开始
*&---------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM frm_data_get.
PERFORM frm_data_display.
*&---------------------------------------------------------------------*
*& END-OF-SELECTION 程序结束
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&子程序部分
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_DATA_GET
*&---------------------------------------------------------------------*
* 数据获取
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DATA_GET .
SELECT zyhy_table01~zxh2 "
zyhy_table01~zxm2 "
zyhy_table01~znl2 "
zyhy_table01~zxb2 "
zyhy_table01~zsg2 "
zyhy_table01~zdh2 "
zyhy_table02~zzy2 "
zyhy_table02~zjg2 "
zyhy_table02~zsfz2 "
INTO CORRESPONDING FIELDS OF TABLE it_data
FROM zyhy_table01
LEFT JOIN zyhy_table02 ON zyhy_table01~zxh2 = zyhy_table02~zxh2
WHERE zyhy_table01~zxh2 IN s_xh.
IF sy-subrc = 0.
SORT it_data BY zxh2 ASCENDING. "按学号升序排列
ELSE.
MESSAGE '没有找到符合条件的数据' TYPE 'S'.
ENDIF.
ENDFORM. " FRM_DATA_GET
*&---------------------------------------------------------------------*
*& Form FRM_DATA_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DATA_DISPLAY .
CLEAR: wa_layout,it_fieldcat,wa_fieldcat.
PERFORM frm_edit_fieldcat using:
'1' 'ZXH2' 'IT_DATA' '学号', "这里第三个参数都是it_data,所以你可以在子程序里直接赋值给第三个参数,就不用在这传参。。
'2' 'ZXM2' 'IT_DATA' '姓名',
'3' 'ZXB2' 'IT_DATA' '性别',
'4' 'ZNL2' 'IT_DATA' '年龄',
'5' 'ZSG2' 'IT_DATA' '身高',
'6' 'ZDH2' 'IT_DATA' '电话',
'7' 'ZZY2' 'IT_DATA' '专业',
'8' 'ZJG2' 'IT_DATA' '籍贯',
'9' 'ZSFZ2' 'IT_DATA' '身份证'.
wa_layout-colwidth_optimize = 'X'. "列宽最优显示
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "CALL标准SAP函数输出ALV报表
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
* I_BUFFER_ACTIVE = ' '
I_CALLBACK_PROGRAM = sy-repid
* 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 = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
IS_LAYOUT = wa_layout
IT_FIELDCAT = it_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* 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 = it_data
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_DATA_DISPLAY
*&---------------------------------------------------------------------*
*& Form FRM_EDIT_FIELDCAT
*&---------------------------------------------------------------------*
* 子程序用于生成列,每一列其实是一个结构体组成的。就是说一个结构体描述一列
*----------------------------------------------------------------------*
* -->P_COL_POS 显示列的位置
* -->P_FIELDNAME 字段ID
* -->P_TABNAME 表名
* -->P_SELTEXT 列名称
*----------------------------------------------------------------------*
FORM frm_edit_fieldcat USING p_col_pos TYPE any
p_fieldname TYPE any
p_tabname TYPE any
p_seltext TYPE any.
wa_fieldcat-col_pos = p_col_pos.
wa_fieldcat-fieldname = p_fieldname.
wa_fieldcat-tabname = p_tabname.
wa_fieldcat-seltext_m = p_seltext.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
ENDFORM. " FRM_EDIT_FIELDCAT " FRM_EDIT_FIELDCAT