OO ALV简单报表之DOCKING容器实现

OO ALV报表实现 后面再说其他的 由简入繁助于理解
下面介绍一下OO ALV的灵魂

两个类(SE24查看):
CL_GUI_ALV_GRID
CL_GUI_DOCKING_CONTAINER

介绍实现步骤:
1、创建程序(都会)
2、创建屏幕(OOALV与FUNCTION ALV的区别,屏幕自己创建,所以扩展性好)
在这里插入图片描述
创建GUI状态
在这里插入图片描述

3、撸代码
代码如下:


TABLES: SFLIGHT.

"输出结构
TYPES: BEGIN OF TY_OUTPUT.
    INCLUDE STRUCTURE SFLIGHT.
TYPES: ZBOX       TYPE C,
       SEATSOCC_O TYPE SFLIGHT-SEATSOCC. "经济舱剩余座位
TYPES: END OF TY_OUTPUT.

DATA: GT_OUTPUT TYPE TABLE OF TY_OUTPUT. "输出内表
DATA: GS_OUTPUT TYPE TY_OUTPUT. "输出工作区

DATA: GS_LAYOUT TYPE LVC_S_LAYO. "布局
DATA: GT_FIELDCAT TYPE LVC_T_FCAT. "字段属性内表
DATA: GS_FIELDCAT TYPE LVC_S_FCAT. "
DATA: GV_COL TYPE I.

DATA: OK_CODE TYPE SY-UCOMM. "用户功能码接收
DATA: SAVE_OK TYPE SY-UCOMM. "用户功能码接收

"声明灵魂
DATA: GS_ALV TYPE REF TO CL_GUI_ALV_GRID. "屏幕alv对象
*DATA: GS_CON TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA: GS_DOCK TYPE REF TO CL_GUI_DOCKING_CONTAINER. "屏幕容器对象

"选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK BLK1 WITH FRAME.
SELECT-OPTIONS: S_CARRID FOR SFLIGHT-CARRID.
SELECTION-SCREEN END OF BLOCK BLK1 .

START-OF-SELECTION.
  "取数
  PERFORM FRM_SELECT_DATA.

END-OF-SELECTION.
  "调用100屏幕输出
  CALL SCREEN 0100.


*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
  SET PF-STATUS 'ZSTATUS_0100'.
  SET TITLEBAR 'ZTITLE_0100'.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.

  CASE SAVE_OK.
    WHEN 'ZBACK' .
      LEAVE TO SCREEN 0. "返回上一个屏幕

    WHEN 'ZCANCEL'.
      LEAVE TO SCREEN 0.

    WHEN 'EXIT'.
      LEAVE PROGRAM. "返回程序
    WHEN OTHERS.
  ENDCASE.

ENDMODULE.

*&---------------------------------------------------------------------*
*& Module INIT_ALV OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE INIT_ALV OUTPUT.
  IF GS_ALV IS INITIAL.
    PERFORM FRM_SET_GRID.
    PERFORM FRM_SET_LAYOUT.
    PERFORM FRM_SET_FIELDCAT.

    PERFORM FRM_DISPLAY_ALV.
  ELSE.
    PERFORM FRM_REFRESH_ALV.
  ENDIF.


ENDMODULE.
*&---------------------------------------------------------------------*
*& Form FRM_SELECT_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SELECT_DATA .

  SELECT *
    FROM SFLIGHT
    INTO CORRESPONDING FIELDS OF TABLE GT_OUTPUT
    WHERE CARRID IN S_CARRID.

  "数据处理
  LOOP AT GT_OUTPUT INTO GS_OUTPUT.
    GS_OUTPUT-SEATSOCC_O = GS_OUTPUT-SEATSMAX - GS_OUTPUT-SEATSOCC.
    MODIFY GT_OUTPUT FROM GS_OUTPUT.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_GRID .

  "实例化屏幕容器
  CREATE OBJECT GS_DOCK
    EXPORTING
*     PARENT                      =
      REPID                       = SY-REPID                                                            "当前程序
      DYNNR                       = '0100'                                                               "屏幕编号
      SIDE                        = CL_GUI_DOCKING_CONTAINER=>DOCK_AT_LEFT   "容器吸附左侧
      EXTENSION                   = 1300                                                              "ALV的宽度
*     STYLE                       =
*     LIFETIME                    = lifetime_default
*     CAPTION                     =
      METRIC                      = 0
*     RATIO                       = 100                                                                    "ALV的比率,优先级高于上面的EXTENSION
*     NO_AUTODEF_PROGID_DYNNR     =
*     NAME                        =
    EXCEPTIONS
      CNTL_ERROR                  = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      LIFETIME_ERROR              = 4
      LIFETIME_DYNPRO_DYNPRO_LINK = 5
      OTHERS                      = 6.
  IF SY-SUBRC <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


*
*  CREATE OBJECT GS_CON
*    EXPORTING
**     PARENT                      =
*      CONTAINER_NAME              = 'GC_CON'
**     STYLE                       =
**     LIFETIME                    = lifetime_default
**      REPID                       = SY-REPID
**      DYNNR                       = '0100'
**     NO_AUTODEF_PROGID_DYNNR     =
*    EXCEPTIONS
*      CNTL_ERROR                  = 1
*      CNTL_SYSTEM_ERROR           = 2
*      CREATE_ERROR                = 3
*      LIFETIME_ERROR              = 4
*      LIFETIME_DYNPRO_DYNPRO_LINK = 5
*      OTHERS                      = 6.
*  IF SY-SUBRC <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.


  "实例化alv展示对象
  CREATE OBJECT GS_ALV
    EXPORTING
*     I_SHELLSTYLE      = 0
*     I_LIFETIME        =
      I_PARENT          = GS_DOCK
*     I_APPL_EVENTS     = space
*     I_PARENTDBG       =
*     I_APPLOGPARENT    =
*     I_GRAPHICSPARENT  =
*     I_NAME            =
*     I_FCAT_COMPLETE   = SPACE
    EXCEPTIONS
      ERROR_CNTL_CREATE = 1
      ERROR_CNTL_INIT   = 2
      ERROR_CNTL_LINK   = 3
      ERROR_DP_CREATE   = 4
      OTHERS            = 5.
  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-CWIDTH_OPT = 'X'.
  GS_LAYOUT-ZEBRA = 'X'.
  GS_LAYOUT-BOX_FNAME = 'ZBOX'. "左侧选择块
  GS_LAYOUT-SEL_MODE = 'A'. "A 左端有选择块 SPACE 空白
*  GS_LAYOUT-EDIT = 'X'.
  GS_LAYOUT-DETAILINIT = 'X'.
  GS_LAYOUT-DETAILTITL = '详细信息'.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_SET_FIELDCAT .
  DEFINE M_FIELDCAT.
    CLEAR GS_FIELDCAT.
    GS_FIELDCAT-FIELDNAME = &1.
    GS_FIELDCAT-REF_TABLE = &2.
    GS_FIELDCAT-REF_FIELD = &3.
    GS_FIELDCAT-SCRTEXT_L = &4.
    GV_COL = GV_COL + 1.
    GS_FIELDCAT-COL_POS = GV_COL.

    APPEND GS_FIELDCAT TO GT_FIELDCAT.
  END-OF-DEFINITION.

  REFRESH GT_FIELDCAT.
  CLEAR GV_COL.

  M_FIELDCAT 'CARRID' 'SFLIGHT' 'CARRID' '航线'.
  M_FIELDCAT 'CONNID' 'SFLIGHT' 'CONNID' '航班'.
  M_FIELDCAT 'FLDATE' 'SFLIGHT' 'FLDATE' '航班日期'.
  M_FIELDCAT 'PRICE' 'SFLIGHT' 'PRICE' '航空运费'.
  M_FIELDCAT 'CURRENCY' 'SFLIGHT' 'CURRENCY' '价格'.
  M_FIELDCAT 'PLANETYPE' 'SFLIGHT' 'PLANETYPE' '飞机类型'.
  M_FIELDCAT 'SEATSMAX' 'SFLIGHT' 'SEATSMAX' '经济舱位'.
  M_FIELDCAT 'SEATSOCC' 'SFLIGHT' 'SEATSOCC' '经济舱占据位'.
  M_FIELDCAT 'SEATSOCC_O' 'SFLIGHT' 'SEATSOCC' '经济舱剩余位'.
  M_FIELDCAT 'PAYMENTSUM' 'SFLIGHT' 'PAYMENTSUM' '当前预定总数'.
  M_FIELDCAT 'SEATSMAX_B' 'SFLIGHT' 'SEATSMAX_B' '商务舱位'.
  M_FIELDCAT 'SEATSOCC_B' 'SFLIGHT' 'SEATSOCC_B' '商务舱占据位'.
  M_FIELDCAT 'SEATSMAX_F' 'SFLIGHT' 'SEATSMAX_F' '头等舱位'.
  M_FIELDCAT 'SEATSOCC_F' 'SFLIGHT' 'SEATSOCC_F' '头等舱占据位'.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
  DATA: LS_VARIANT TYPE DISVARIANT.
  LS_VARIANT-REPORT = 'H001'.
  "调用方法生成alv
  CALL METHOD GS_ALV->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
*     I_BUFFER_ACTIVE               =
*     I_BYPASSING_BUFFER            =
*     I_CONSISTENCY_CHECK           =
*     I_STRUCTURE_NAME              =
      IS_VARIANT                    = LS_VARIANT
      I_SAVE                        = 'A'
      I_DEFAULT                     = 'X'
      IS_LAYOUT                     = GS_LAYOUT
*     IS_PRINT                      =
*     IT_SPECIAL_GROUPS             =
*     IT_TOOLBAR_EXCLUDING          = GT_UI_FUNC
*     IT_HYPERLINK                  =
*     IT_ALV_GRAPHICS               =
*     IT_EXCEPT_QINFO               =
*     IR_SALV_ADAPTER               =
    CHANGING
      IT_OUTTAB                     = GT_OUTPUT
      IT_FIELDCATALOG               = GT_FIELDCAT
*     IT_SORT                       =
*     IT_FILTER                     =
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION = 1
      PROGRAM_ERROR                 = 2
      TOO_MANY_LINES                = 3
      OTHERS                        = 4.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_REFRESH_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_REFRESH_ALV .
  DATA: LS_STABLE TYPE LVC_S_STBL.

  LS_STABLE-COL = 'X'.
  LS_STABLE-ROW = 'X'.

  CALL METHOD GS_ALV->REFRESH_TABLE_DISPLAY
    EXPORTING
      IS_STABLE = LS_STABLE
*     I_SOFT_REFRESH =
    EXCEPTIONS
      FINISHED  = 1
      OTHERS    = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.

代码中有一块代码需要解释一下
在这里插入图片描述
为什么要将OK_CODE复制一份然后清空呢
这里引用一下大佬博文中的说明:

在程序中你应该使用OK_CODE来代替SY-UCOMM,这有两种原因:第一,ABAP程序可以完全控制在它里面定义的变量,第二,你不应该修改ABAP系统变量的值。然而,你必须在ABAP程序中清空OK_CODE,因为以下几个原因:如果一个屏幕中的某个按钮未设置Function Code时也是可以触发PAI事件时,并且由于其Function Code此时为空而不会去设置OK_CODE(但此时SYST- UCOMM 或 SY-UCOMM会被重新设置为空),这样的话OK_CODE中的值还为上一次触发PAI时所设置的Function Code。所以一般情况下在使用OK_CODE之前,先将OK_CODE拷贝到SAVE_OK变量中,并随后将OK_CODE清空,以便为下一次PAI事件所使用做准备(比如下一屏幕直接在屏幕上按回车时,Function Code为空,因为在回车时命令框里没有输入任何命令,则此时OK_CODE字段不会被设置,所以还回沿用上次所设置的OK_CODE,所以就会出现问题)
地址:博文地址

运行效果:
在这里插入图片描述
在这里插入图片描述
附:还有另外一种方法,用CL_GUI_CUSTOM_CONTAINER容器实现,这里就不做介绍了,想了解的同学可以自行百度或谷歌。

OVER。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值