动态内表
主程序
REPORT ZQM040.
INCLUDE ZQM040_TOP."结构
INCLUDE ZQM040_S01."选择屏幕
INCLUDE ZQM040_F01."功能模块
INITIALIZATION."初始化
AT SELECTION-SCREEN.
* PERFORM FRM_CHECK."屏幕检查
START-OF-SELECTION.
PERFORM FRM_GET_DATA."获取数据
PERFORM FRM_SET_FIELDCATALOG."FIELDCAT设置
*创建动态表
PERFORM FRM_CREATE_TAB."创建动态表
* PERFORM FRM_GET_DATA."获取数据
END-OF-SELECTION.
IF GT_OUTPUT IS INITIAL.
MESSAGE '取数异常'TYPE 'I' DISPLAY LIKE 'E'. "
RETURN.
ELSE.
PERFORM FRM_DISPLAY_DATA."展示数据
ENDIF.
头部
INCLUDE ZQM040_TOP.
*&---------------------------------------------------------------------*
*& 包含 ZQM040_TOP
*&---------------------------------------------------------------------*
TYPES: BEGIN OF GY_OUTPUT,
CARRID LIKE SFLIGHT-CARRID,
CONNID LIKE SFLIGHT-CONNID,
PLANETYPE LIKE SFLIGHT-PLANETYPE,
END OF GY_OUTPUT.
DATA GS_OUTPUT TYPE GY_OUTPUT.
DATA GT_OUTPUT TYPE TABLE OF GY_OUTPUT.
DATA: GT_FIELDCAT TYPE LVC_T_FCAT, "打印的表格最开头,显示字段名称
GS_FIELDCAT TYPE LVC_S_FCAT,
GS_LAYOUT TYPE LVC_S_LAYO. "布局
*定义动态内表
DATA: DY_TABLE TYPE REF TO DATA, "不指定特定类型或结构,可以是结构或类型
DY_WA TYPE REF TO DATA.
FIELD-SYMBOLS:<DYN_TABLE> TYPE STANDARD TABLE, "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问
<DYN_FCAT> TYPE ANY,
<FS_WA> TYPE ANY.
选择屏幕
INCLUDE ZQM040_S01.
*&---------------------------------------------------------------------*
*& 包含 ZQM040_S01
*&---------------------------------------------------------------------*
TABLES:SFLIGHT.
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS S_CARR FOR SFLIGHT-CARRID ."航线代码
SELECT-OPTIONS S_CONN FOR SFLIGHT-CONNID ."航班连接编号
PARAMETERS p_PLAN like SFLIGHT-PLANETYPE DEFAULT '747-400' ."飞机类型
SELECTION-SCREEN END OF BLOCK BL1.
函数模块
INCLUDE ZQM040_F01.
*&---------------------------------------------------------------------*
*& 包含 ZQM040_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_CHECK
*&---------------------------------------------------------------------*
* text 屏幕检查
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CHECK .
IF P_PLAN IS INITIAL.
MESSAGE '请输入飞机类型' TYPE 'I' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text 获取数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
SELECT CARRID,
CONNID,
PLANETYPE
FROM SFLIGHT
INTO CORRESPONDING FIELDS OF TABLE @GT_OUTPUT
WHERE CARRID IN @S_CARR
AND CONNID IN @S_CONN
AND PLANETYPE = @P_PLAN.
SORT GT_OUTPUT BY CARRID.
DELETE ADJACENT DUPLICATES FROM GT_OUTPUT COMPARING CARRID. "删除相邻行的重复数据,只保留相邻重复行的第一行数据
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCATALOG
*&---------------------------------------------------------------------*
* text 定义FIELDCATA
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SET_FIELDCATALOG .
DATA: LS_FIELDCAT TYPE LVC_S_FCAT.
DATA: LV_COL_POS TYPE SYCUCOL.
DATA G_FNAME TYPE CHAR20.
DATA NUM TYPE N .
DEFINE MAC_SET_FIELDCATALOG.
lv_col_pos = lv_col_pos + 1.
ls_fieldcat-col_pos = lv_col_pos.
ls_fieldcat-fieldname = &1.
ls_fieldcat-SCRTEXT_L = &2.
LS_FIELDCAT-no_zero = &3."如果取值为零,则为空,既不输出零。lzero输出前导零(X或空),仅NUMC类型字段有效
LS_FIELDCAT-just = &4.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
MAC_SET_FIELDCATALOG 'CONNID' TEXT-002 '' ''.
MAC_SET_FIELDCATALOG 'PLANETYPE' TEXT-003 '' '' .
LOOP AT GT_OUTPUT INTO GS_OUTPUT ."航线代码
CONCATENATE GS_OUTPUT-CARRID NUM INTO G_FNAME.
MAC_SET_FIELDCATALOG GS_OUTPUT-CARRID G_FNAME '' '' .
NUM = NUM + 1.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CREATE_TAB
*&---------------------------------------------------------------------*
* text 构建动态内表
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CREATE_TAB .
* 调用方法,用于构建动态内表,输入的就是要构建的结构,输出的就是一个DY_TABLE
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = GT_FIELDCAT
IMPORTING
EP_TABLE = DY_TABLE
EXCEPTIONS
GENERATE_SUBPOOL_DIR_FULL = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE '创建动态内表失败!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING. "报错会返回选择屏幕
ENDIF.
*--------动态内表数据填充----------------------------------------------
*设定<dyntab>指向 t_dyntab:指定生成的内表到字段符号
ASSIGN DY_TABLE->* TO <DYN_TABLE>.
*建立一个<dyntab>类型的工作区Work area:创建动态工作区结构
CREATE DATA DY_WA LIKE LINE OF <DYN_TABLE>.
*同理设定指针 :创建动态工作区
ASSIGN DY_WA->* TO <FS_WA>.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_DATA
*&---------------------------------------------------------------------*
* text 显示数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_DISPLAY_DATA .
DATA: LS_GRID_SETTINGS TYPE LVC_S_GLAY."单元格设置
PERFORM FRM_SET_LAYOUT ."layout格式设置
* PERFORM FRM_SET_FIELDCATALOG."FIELDCAT设置
LS_GRID_SETTINGS-EDT_CLL_CB = 'X'."设置单元格
* ALV显示函数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID "当前字段的名字
I_GRID_SETTINGS = LS_GRID_SETTINGS
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_CALLBACK_HTML_TOP_OF_PAGE = 'HTML_TOP_OF_PAGE' "ALV表头信息
TABLES
T_OUTTAB = <DYN_TABLE>
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.
*&---------------------------------------------------------------------*
*& Form FRM_SET_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
CLEAR GS_LAYOUT.
GS_LAYOUT-ZEBRA = 'X'.
GS_LAYOUT-CWIDTH_OPT = 'X'.
GS_LAYOUT-DETAILTITL = SY-TITLE.
ENDFORM.
*定义form响应上述ALV属性:表头信息
FORM HTML_TOP_OF_PAGE USING DOCUMENT TYPE REF TO CL_DD_DOCUMENT.
DATA: TEXT TYPE SDYDO_TEXT_ELEMENT.
DATA: LV_P TYPE I,
LV_BUFFER TYPE STRING.
DATA: LV_BUTXT TYPE CHAR20.
DATA AREA1 TYPE REF TO CL_DD_AREA.
DATA AREA2 TYPE REF TO CL_DD_AREA.
*----------------------------------------------------------------------*
*&---------------------写法一:不推荐---------------------&*
* TEXT = '航班表信息'.
* CALL METHOD DOCUMENT->ADD_TEXT
* EXPORTING
* TEXT = TEXT
* SAP_STYLE = 'HEADING'.
**换行写另一标题
* CALL METHOD DOCUMENT->NEW_LINE.
** 或使用空格
* CALL METHOD DOCUMENT->ADD_GAP
* EXPORTING
* WIDTH = 10. "空格宽10
*&---------------------写法二----------------------------&*
*标题
CONCATENATE '<HTML><CENTER><H3>' '航班信息表' '</H3></CENTER></HTML>' INTO lv_buffer. " 居中 <H1>设置字体格式
CALL METHOD document->html_insert
EXPORTING
contents = lv_buffer
CHANGING
position = lv_p.
*输出时间
CONCATENATE '<HTML><P>' '日期范围:' sy-datum+0(4) '-'
sy-datum+4(2) '-' sy-datum+6(2) ' ' '至' ' ' sy-datum+0(4) '-'
sy-datum+4(2) '-' sy-datum+6(2) '</P></HTML>' INTO lv_buffer. " 居中 <H1>设置字体格式
CALL METHOD document->html_insert
EXPORTING
contents = lv_buffer
CHANGING
position = lv_p.
ENDFORM.