动态内表实现

动态内表

主程序

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) '&nbsp' '至' '&nbsp' 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.

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值