面向对象
面向对象编程(OOP)是一种计算机编程架构。
- 对象(Object)是一个现实实体的抽象。一个对象可被认为是一个把数据(属性)和程序(方法)封装在一起的实体,这个程序产生改对象的动作或对它接受到的外界信号的反应。这些对象操作有时称为方法。
- 类(Class)用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
OO-ALV
定义:使用了对象以后,ALV是通过ALV的一个实例(INSTANCE)来显示。
实现步骤:
-
创建屏幕
-
屏幕绘制容器(customer control)
-
定义变量
-
创建ALV对象
CREATE OBJECT:WCL_CONTAINER EXPORTING CONTAINER_NAME = 'WCL_CONTAINER'. CREATE OBJECT WCL_ALV EXPORTING I_PARENT = WCL_CONTAINER.
-
显示ALV
CALL METHOD WCL_ALV->SET_TABLE_FOR_FIRST_DISPLAY
OO-ALV的控制结构:
- 字段目录 [Field catalog]:参考字段 LVC_S_FCAT
- 布局控制 [layout]:参考结构[LVC_S_LAYO]
- 打印和排序,过滤控制:
- 打印的参数控制参考结构 [LVC_S_PRNT]
- 排序的参数控制参考结构 [LVC_S_SORT]
- 过滤的参数控制参考结构 [LVC_S_FILT]
开发基本流程:
第一步:创建SCREEN,在屏幕上创建一个定制控制
1000-1100是选择屏幕预留编号,大多使用8000-9000
Next Screen:点击返回将要跳转的屏幕(如果找不到屏幕,退出程序)
产生逻辑流:
- PROCESS BEFORE OUTPUT:展示屏幕显示的动作
- PROCESS AFTER INPUT:后期显示之后的交互
第二步:定义变量
DATA:
*ALV变量
wcl_container TYPE REF TO cl_gui_custom_container, "存放ALV的容器
wcl_alv TYPE REF TO cl_gui_alv_grid, "ALV的网络
gt_fieldcat TYPE lvc_t_fcat, "存放字段目录的内表
gs_layout TYPE lvc_s_layo. 布局结构
*---声明需要显示的内表(以SFLIGHT为例)
DATA BEGIN OF gt_list OCCURS 0.
INCLUDE STRUCTURE SFLIGHT.
DATA END OF gt_list.
首先写主程序:
查看类:SE24
REPORT ****
*------定义变量------*
DATA:
*ALV变量
wcl_container TYPE REF TO cl_gui_custom_container, "存放ALV的容器
wcl_alv TYPE REF TO cl_gui_alv_grid, "ALV的实例
gt_fieldcat TYPE lvc_t_fcat, "存放字段目录的内表
gs_layout TYPE lvc_s_layo. 布局结构
*---声明需要显示的内表(以SFLIGHT为例)
DATA BEGIN OF gt_list OCCURS 0.
INCLUDESTRUCTURE SFLIGHT.
DATA END OF gt_list.
*要显示的ALV的数据的变量
DATA:GT_LIST TYPE TABLE OF sflight WITH HEADER LINE.
第三步:创建ALV这个对象,他的父组件是那个容器
在PBO中写入如下代码:
PROCESS BEFORE OUTPUT.
MODULE display_alv.
创建display_alv的MODULE后,写入一下代码:
PERFORM display_alv.
在FORM display_alv中,判断ALV实例是否存在,如果不存在,则创建:
FORM display_alv.
IF wcl_alv IS INITIAL.
CREATE OBJECT:wcl_container
EXPORTING
container_name = 'CONTAINER'. "屏幕上定制控制的名称,要大写
IF wcl_container IS NOT INITIAL. "判断不为空的话创建
CREATE OBGECT wcl_alv
EXPORTING
I_PARENT = wcl_container.
ENDIF.
*获取字段目录
PERFORM PREPARE_FIELD_CATALOG CHANGING GT_FIELDCAT.
*获取样式
PERRORM PREPARE_LAYOUT CHANGING GS_LAYOUT.
*获取需要显示的数据
PERFORM GET_DATA TABLES GT_LIST.
*------显示ALV------
CALL METHOD wcl_alv->set_table_for_first_display
EXPORTING
* I_BUFFER_ACTIVE =
* I_CONSISTENCY_CHECK =
* I_STRUCTURE_NAME =
* IS_VARIANT =
* I_SAVE =
* I_DEFAULT = 'X'
IS_LAYOUT = GS_LAYOUT
* IS_PRINT =
* IT_SPECIAL_GTOUPS =
* IT_TOOLBAR_EXCLUDING =
* IT_HYPERLINK =
CHANGING
IT_OUTTAB = GT_LIST[]
IT_FIELDCATALOG = GT_FIELDCAT
* IT_SORT =
* IT_FILTER =
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
ELSE.
*ALV---------
CALL METHOD WCL_ALV->REFRESH_TABLE_DISPLAY "判断不为空,刷新
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
*异常处理------------
ENDIF.
ENDIF.
第四步:获取要显示数据的字段目录:有两种方式
1、手动创建
FORM prepare field catalog CHANGING p_gt_fieldcat.
DATA ls_fcat TYPE lvc_s_fcat.
ls_fcat-fieldname = 'CARRID'.
ls_fcat-inttype = 'C'.
ls_fcat-outputlen = '3'.
ls_fcat-coltext= 'Carrier ID'.
ls_fcat-seltext = 'Carrier ID'.
APPEND ls_fcat to pt_fieldcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'CONNID'.
ls_fcat-ref_table = 'SFLIGHT'.
ls_fcat-ref_table = 'CONNID'.
ls_fcat-outputlen = '3'.
ls_fcat-coltext= 'Connection ID'.
ls_fcat-seltext = 'Connection ID'.
APPEND ls_fcat to pt_fieldcat.
ENDFORM.
2、根据结构自动创建
FORM PREPARE_FIELD_CATALOG CHANGING p_gt_fieldcat.
DATA ls_facat TYPE lvc_s_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT' "根据哪一个结构生成:这里根据SFLIGHT结构
* I_CLIENT_NEVER_DISPLAY = 'X'
CHANGING
ct_fieldcat = p_gt_fieldcat "维护形参p_gt_fieldcat
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.
IF sy-subrc <> 0.
ENDIF.
第五步:设置布局
FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-zebra = 'X'.
ps_layout-grid_title = 'Flights'.
ps_layout-smalltitle = 'X'.
ENDFORM.
第六步:读取数据至内表
FORM GET_DATA TABLES rt_outtab LIKE GT_LIST[].
SELECT * FROM sflight INTO CORRESPONDING FIELDS
OF TABLE rt_outtab UP TO 30 ROWS.
ENDFORM.
第七部:定义GUI 状态栏
通过SE41复制标准GUI状态
调用状态栏双击击PBO下的status_8000.(里面自动生成的代码)
MODULE status_8000 OUTPUT.
SET PF-STATUS 'STANDARD'. "输入状态栏名称
ENDMODULE.
第八步:定义用户响应事件
*接收用户按钮
DATA:ok_code TYPE sy-ucomm, "ok_code在元素清单中定义,用于接收
save_ok TYPE sy-ucomm. "把获取到的ok_code传到save_ok
*注意:变量定义在子程序前
*在屏幕PAI事件定义MODULE
MODULE user_command_8000.
*定义MODULE
MODULE user_command_8000 INPUT.
* DATA:save_ok TYPE sy-ucomm. "前面已定义
save_ok = ok_code.
CLEAR ok_code.
CASE save_ok.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
第九步:在程序里调用屏幕
CALL SCREEN 8000.(放在第二步下,子程序的上面)