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。