前言:设置带有抬头子屏幕作为筛选条件的ALV报表程序。

1.效果图

image.png

2.实现步骤:

2.1 重点一:定义选择屏幕0101作为子屏幕

  1. ***********************************************************************
  2. **-----------------S E L E C T I O N---S C R E E N-------------------**
  3. ***********************************************************************
  4. SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN.
  5. SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.
  6. SELECT-OPTIONS : S_CARRID FOR SPFLI-CARRID,
  7. S_CONNID FOR SPFLI-CONNID.
  8. SELECTION-SCREEN END OF BLOCK 10.
  9. SELECTION-SCREEN END OF SCREEN 0101.

2.2 重点二: 定义逻辑流

PROCESS BEFORE OUTPUT.
  CALL SUBSCREEN: SUB01 INCLUDING SY-REPID '0101'.  "调用子屏幕"
  MODULE STATUS_1001.

PROCESS AFTER INPUT.

  CALL SUBSCREEN: SUB01.                            "调用子屏幕"
  MODULE USER_COMMAND_1001.

2.3 重点三:勾画子屏幕

image.png

3.源代码:

*&---------------------------------------------------------------------*
*& Report ZDEMO_DIALOG_01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO_DIALOG_01.

***********************************************************************
**----------------------------T Y P E S------------------------------**
***********************************************************************


***********************************************************************
**---------------------------T A B L E S-----------------------------**
***********************************************************************
TABLES : SPFLI.

***********************************************************************
**------------------------V A R I A B L E S--------------------------**
***********************************************************************
DATA :GT_DATA LIKE STANDARD TABLE OF SPFLI WITH HEADER LINE.
DATA :GS_LAYOUT         TYPE LVC_S_LAYO,  "布局
      GT_FIELDCAT       TYPE LVC_T_FCAT,  "定义GT_FIELDCAT对象
      GR_GRID           TYPE REF TO CL_GUI_ALV_GRID,  "定义ALV控件名
      GR_DOCK_CONTAINER TYPE REF TO CL_GUI_DOCKING_CONTAINER.

DATA:OK_CODE   TYPE SY-UCOMM.

***********************************************************************
**-----------------S E L E C T I O N---S C R E E N-------------------**
***********************************************************************
SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN.
  SELECTION-SCREEN BEGIN OF BLOCK 10 WITH FRAME TITLE TEXT-001.
    SELECT-OPTIONS : S_CARRID FOR SPFLI-CARRID,
                     S_CONNID FOR SPFLI-CONNID.
  SELECTION-SCREEN END OF BLOCK 10.
SELECTION-SCREEN END OF SCREEN 0101.

***********************************************************************
**-------------------I N I T I A L I Z A T I O N---------------------**
***********************************************************************


***********************************************************************
**-----------------S T A R T-O F-S E L E C T I O N-------------------**
***********************************************************************
START-OF-SELECTION.
  CALL SCREEN '1001'.

***********************************************************************
**------------------E N D-O F-S E L E C T I O N----------------------**
***********************************************************************



*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& 获取数据
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
  SELECT * FROM SPFLI
  INTO CORRESPONDING FIELDS OF TABLE GT_DATA
  WHERE CARRID IN S_CARRID
  AND   CONNID IN S_CONNID.

  IF GR_DOCK_CONTAINER IS INITIAL .   "检查是否创建容器对象
    PERFORM DISPLAY_ALV.
  ELSE.
    CALL METHOD GR_GRID->REFRESH_TABLE_DISPLAY.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY_ALV
*&---------------------------------------------------------------------*
*& 展示数据
*&---------------------------------------------------------------------*
FORM DISPLAY_ALV.
  PERFORM FRM_SET_LAYOUT.
  PERFORM FRM_SET_FIELDCAT.
  PERFORM FRM_SET_ALV.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& 设置ALV布局
*&---------------------------------------------------------------------*
FORM FRM_SET_LAYOUT .
* 设置布局
  CLEAR GS_LAYOUT.
  GS_LAYOUT-ZEBRA = 'X'.             "斑马线
  GS_LAYOUT-CWIDTH_OPT = 'X'.        "自动调整列宽
*  GS_LAYOUT-BOX_FNAME = 'SEL'.      "选择列
  GS_LAYOUT-SEL_MODE = 'D'.          "OOALV中,设置左边选择列
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& 设置字段目录
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
* 设置字段目录
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE        =
      I_STRUCTURE_NAME       = 'SPFLI' "结构名称"
      I_CLIENT_NEVER_DISPLAY = 'X'
*     I_BYPASSING_BUFFER     =
*     I_INTERNAL_TABNAME     =
    CHANGING
      CT_FIELDCAT            = GT_FIELDCAT. "ALV字段目录内表"
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV
*&---------------------------------------------------------------------*
*& 设置ALV数据
*&---------------------------------------------------------------------*
FORM FRM_SET_ALV .
* 设置容器
  CREATE OBJECT GR_DOCK_CONTAINER   "创建容器对象
  EXPORTING
    SIDE      = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_BOTTOM
    REPID     = SY-REPID
    DYNNR     = SY-DYNNR
    EXTENSION = 365.

  CREATE OBJECT GR_GRID             "创建ALV Grid实例对象
  EXPORTING
    I_PARENT = GR_DOCK_CONTAINER.

  CALL METHOD GR_GRID->SET_TABLE_FOR_FIRST_DISPLAY     "展示数据"
  EXPORTING
    I_SAVE          = 'A'
    I_DEFAULT       = 'X'
*     I_STRUCTURE_NAME = 'SPFLI'
    IS_LAYOUT       = GS_LAYOUT
  CHANGING
    IT_OUTTAB       = GT_DATA[]
    IT_FIELDCATALOG = GT_FIELDCAT.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_1001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_1001 OUTPUT.
  SET PF-STATUS 'STANDARD'.
* SET TITLEBAR 'xxx'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_1001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_1001 INPUT.
  CASE OK_CODE.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
    WHEN 'BACK' OR 'CANCEL'.
      LEAVE PROGRAM.
    WHEN 'EXECU'.
      PERFORM FRM_GET_DATA.
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.