SAP ABAP开发详解与高端应用 (第3页)

第 70 页 / 共 377 页

*----------------------------------------------------------------------*

* CONSTANTS

*----------------------------------------------------------------------*

CONSTANTS :

BEGIN OF AC,

PROGRAM_NAME TYPE SY-REPID VALUE 'ZREPO03_ALVOO', "程序

* 控制

STRUCTURE_NAME TYPE DD02L-TABNAME VALUE 'ZZTEST_S', "结构体

ZZCLASS TYPE DD03L-FIELDNAME VALUE 'ZZCLASS', "班级

ZZYEAR TYPE DD03L-FIELDNAME VALUE 'ZZYEAR', "学年

ZZSTDNO TYPE DD03L-FIELDNAME VALUE 'ZZSTDNO', "学号

F2CODE(4) TYPE C VALUE 'POP', "F2(双击)

X(1) TYPE C VALUE 'X',

H(1) TYPE C VALUE 'H',

S(1) TYPE C VALUE 'S',

A(1) TYPE C VALUE 'A',

END OF AC.

*----------------------------------------------------------------------*

* DATA

*----------------------------------------------------------------------*

DATA:

BEGIN OF TNAME,

NAME1 LIKE ZMTNUMBER_T-ZTNAME, "班主任

NAME2 LIKE ZMTNUMBER_T-ZTNAME, "副班主任

END OF TNAME.

DATA: TBL_TEST TYPE TY_ITAB_TEST, "成绩表

STR_TEST TYPE WRK_TEST. "表头

DATA: BEGIN OF TBL_TEST1 OCCURS 0.

INCLUDE STRUCTURE STR_TEST.

DATA: LIGHT, "例外

LINECOLOR(4), "颜色

HL_FNAME TYPE I, "字段

CELLCOLOR TYPE LVC_T_SCOL, "Cell颜色

CELLEDIT TYPE LVC_T_STYL, "Cell编辑

HOTSPOT TYPE STRING. "连接

DATA: END OF TBL_TEST1.

* ALV数据

DATA :

BEGIN OF AW,

FIELDCAT TYPE SLIS_T_FIELDCAT_ALV , "字段属性

FLDCAT_R TYPE SLIS_FIELDCAT_ALV, "字段的内容

62

PROGRAM_NAME
STRUCTURE_NAME
ZZCLASS
ZZYEAR
ZZSTDNO
F2CODE
H
S
A
DD02L -TABNAME
DD03L -FIELDNAME
DD03L -FIELDNAME
DD03L -FIELDNAME
TNAME
NAME1 LIKE LIKE ZMTNUMBER_T- ZTNAME
NAME2 ZMTNUMBER_T- ZTNAME
TNAME
LINECOLOR
HL_FNAME
CELLCOLOR
CELLEDIT
FIELDCAT
FLDCAT_R
SLIS_T_FIELDCAT_ALV
SLIS_FIELDCAT_ALV

第 71 页 / 共 377 页

LAYOUT TYPE SLIS_LAYOUT_ALV, "布局

SORT_REC TYPE SLIS_SORTINFO_ALV, "排序记录

SORTER TYPE SLIS_T_SORTINFO_ALV, "排序属性

VARIANT TYPE DISVARIANT, "变式

GRID_SET TYPE LVC_S_GLAY, "表格设定

EXIT(1) TYPE C,

TITLE TYPE LVC_TITLE, "成绩表标题

GRID_TITLE TYPE LVC_TITLE, "成绩表行标题',

END OF AW.

* ALV编辑设定

DATA: STR_CELLCOLOR LIKE LINE OF TBL_TEST1-CELLCOLOR,

STR_CELLEDIT LIKE LINE OF TBL_TEST1-CELLEDIT.

DATA: "Tbl_FIELDCAT TYPE LVC_T_FCAT, "字段目录

TBL_HYPETAB TYPE LVC_T_HYPE. "超级链接

DATA: STR_HYPE TYPE LVC_S_HYPE. "超级链接

*DATA: LS_TOOLBAR TYPE STB_BUTTON.

DATA:WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,

WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .

* 存放字段目录的内表

DATA TBL_FIELDCAT TYPE LVC_T_FCAT .

DATA: STR_FIELDCAT LIKE LINE OF TBL_FIELDCAT.

* 布局结构

DATA: WK_LAYOUT TYPE LVC_S_LAYO .

* 预定义事件处理的一个局部类,参考变量声明定义。

CLASS CLS_EVENT_RECEIVER DEFINITION DEFERRED.

DATA: WO_EVENT_RECEIVER TYPE REF TO CLS_EVENT_RECEIVER.

* 表头信息TOP OF PAGE

DATA: W_DOC TYPE REF TO CL_DD_DOCUMENT,

W_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,

W_VIEWER TYPE REF TO CL_GUI_HTML_VIEWER.

*----------------------------------------------------------------------*

* CLASS CLS_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*

* 类CLS_EVENT_RECEIVER定义

*----------------------------------------------------------------------*

CLASS CLS_EVENT_RECEIVER DEFINITION.

PUBLIC SECTION.

* 事件方法定义

METHODS:

HANDLE_TOOLBAR "工具栏编辑方法

63

LAYOUT
SORT_REC
SORTER
VARIANT
GRID_SET
GRID_TITLE
SLIS_SORTINFO_AL
SLIS_T_SORTINFO_ALV
DISVARIANT
LVC_S_GLAY
LVC_TITLE
VC_TITLE,
W_SPLITTER
W_VIEWER
HANDLE_TOOLBAR

第 72 页 / 共 377 页

FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID

IMPORTING E_OBJECT E_INTERACTIVE,

HANDLE_USER_COMMAND "用户事件

FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID

IMPORTING E_UCOMM,

HANDLE_TOP_OF_PAGE "编辑页头

FOR EVENT TOP_OF_PAGE OF CL_GUI_ALV_GRID

IMPORTING E_DYNDOC_ID TABLE_INDEX,

HANDLE_DOUBLECLICK "双击事件

FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID

IMPORTING E_ROW E_COLUMN ES_ROW_NO.

......

DATA: CLASS TYPE ZTTEST_T-ZZCLASS.

PROTECTED SECTION .

ENDCLASS. "CLS_EVENT_RECEIVER DEFINITION

*----------------------------------------------------------------------*

* CLASS CLS_EVENT_RECEIVER IMPLEMENTATION

*----------------------------------------------------------------------*

* 类CLS_EVENT_RECEIVER实现

*----------------------------------------------------------------------*

CLASS CLS_EVENT_RECEIVER IMPLEMENTATION.

* 定义工具栏

METHOD HANDLE_TOOLBAR.

DATA: LS_TOOLBAR TYPE STB_BUTTON.

* 分隔符

CLEAR LS_TOOLBAR.

MOVE 3 TO LS_TOOLBAR-BUTN_TYPE.

APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

* 按钮

CLEAR LS_TOOLBAR.

MOVE 'DETAIL' TO LS_TOOLBAR-FUNCTION.

MOVE ICON_EMPLOYEE TO LS_TOOLBAR-ICON.

MOVE '个人信息资料' TO LS_TOOLBAR-QUICKINFO.

MOVE '个人信息' TO LS_TOOLBAR-TEXT.

MOVE ' ' TO LS_TOOLBAR-DISABLED.

APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.

ENDMETHOD. "handle_toolbar

*

* 定义用户相应

METHOD HANDLE_USER_COMMAND

64

HANDLE_USER_COMMAND
HANDLE_TOP_OF_PAGE
HANDLE_DOUBLECLICK
..
HANDLE_TOOLBAR
LS_TOOLBAR
LS_TOOLBAR -BUTN_TYPE
E_OBJECT MT_TOOLBAR
LS_TOOLBAR
LS_TOOLBAR
LS_TOOLBAR- QUICKINFO.
LS_TOOLBAR
LS_TOOLBAR -DISABLED
E_OBJECT

第 73 页 / 共 377 页

* 声明局部变量

DATA: LT_ROWS TYPE LVC_T_ROW.

DATA: LS_ROWS TYPE LVC_S_ROW.

DATA: LV_TXT1 TYPE STRING VALUE '父亲'.

DATA: LV_TXT2 TYPE STRING VALUE '母亲'.

DATA: LV_TXT3 TYPE STRING VALUE '电话'.

DATA: LV_TXT4 TYPE STRING VALUE '地址'.

* 判断操作

CASE E_UCOMM.

* 点击详细按钮

WHEN 'DETAIL'.

* 取得ALV选择行

CALL METHOD WCL_ALV->GET_SELECTED_ROWS

IMPORTING

ET_INDEX_ROWS = LT_ROWS[].

READ TABLE LT_ROWS INTO LS_ROWS INDEX 1.

* 取得成功

IF SY-SUBRC = 0.

* 取得对应内表的值

READ TABLE TBL_TEST INTO STR_TEST INDEX LS_ROWS-INDEX.

* 取得成功

IF SY-SUBRC = 0.

* 取得家庭信息

SELECT SINGLE ZZFNAME "父亲

ZZMNAME "母亲

ZZMOBILE "电话

ZZADDR "地址

INTO (ZMNUMBER_T-ZZFNAME,

ZMNUMBER_T-ZZMNAME,

ZMNUMBER_T-ZZMOBILE,

ZMNUMBER_T-ZZADDR )

FROM ZMNUMBER_T "学生信息表

WHERE ZZNUMBER = STR_TEST-ZZSTDNO ."学号

* 取得成功

IF SY-SUBRC EQ 0.

CONCATENATE LV_TXT1 ZMNUMBER_T-ZZFNAME INTO LV_TXT1

SEPARATED BY SPACE.

CONCATENATE LV_TXT2 ZMNUMBER_T-ZZMNAME INTO LV_TXT2

SEPARATED BY SPACE.

CONCATENATE LV_TXT3 ZMNUMBER_T-ZZMOBILE INTO LV_TXT3

SEPARATED BY SPACE.

CONCATENATE LV_TXT4 ZMNUMBER_T-ZZADDR INTO LV_TXT4

SEPARATED BY SPACE.

CALL METHOD CL_GUI_CFW=>FLUSH.

* 添加用户响应

65

T_ROWS
S_ROWS
V_TXT1
V_TXT2
V_TXT3
V_TXT4
LVC_T_ROW
LVC_S_ROW
TRING
TRING
TRING
TRING
ET_INDEX_ROW
LT_ROWS[]
LT_ROWS
ZZFNAME
ZZMNAME
ZZMOBILE
ZZADDR
INTO ( ZMNUMBER_T- ZZFNAME
ZMNUMBER_T -ZZMNAME
ZMNUMBER_T -ZZMOBILE
ZMNUMBER_T -ZZADDR

第 74 页 / 共 377 页

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = '学生家庭信息'

TXT1 = LV_TXT1

TXT2 = LV_TXT2

TXT3 = LV_TXT3

TXT4 = LV_TXT4.

ENDIF.

ENDIF.

ENDIF.

WHEN OTHERS.

ENDCASE.

ENDMETHOD. "handle_user_command

*

* 编辑表头信息

METHOD HANDLE_TOP_OF_PAGE.

DATA: LW_BACK TYPE SDYDO_KEY VALUE SPACE,

LW_TEXT TYPE SDYDO_TEXT_ELEMENT.

DATA:LV_ZZTEANOM TYPE ZCCLASS_T-ZZTEANOM, "班主任

LV_ZZTEANOS TYPE ZCCLASS_T-ZZTEANOS , "副班主任

LV_ZTNAMEP TYPE ZMTNUMBER_T-ZTNAME , "班主任名

LV_ZTNAMES TYPE ZMTNUMBER_T-ZTNAME , "副班主任名

LV_CLASS_TEXT TYPE STRING.

* 宏定义

DEFINE D_TOP_OF_PAGE.

* 设定间隔

IF &1 IS NOT INITIAL.

CALL METHOD E_DYNDOC_ID->ADD_GAP

EXPORTING

WIDTH = &1.

ENDIF.

* 新行

IF &2 IS NOT INITIAL.

CALL METHOD E_DYNDOC_ID->NEW_LINE.

ENDIF.

* 添加文本

IF &3 IS NOT INITIAL.

LW_TEXT = &3.

CALL METHOD E_DYNDOC_ID->ADD_TEXT

EXPORTING

TEXT = LW_TEXT

66

LV_TXT1
LV_TXT2
LV_TXT3
LV_TXT4
HANDLE_TOP_OF_PAGE
LW_BACK
SPACE
SDYDO_TEXT_ELEMENT
LV_ZZTEANOM
LV_ZZTEANOS
LV_ZTNAMEP
LV_ZTNAMES
LV_CLASS_TEX
ZCCLASS_T -ZZTEANOM
CCLASS_T- ZZTEANOS
ZMTNUMBER_T- ZTNAME
ZMTNUMBER_T- ZTNAME
&1
WIDTH
&2
LW_TEXT

第 75 页 / 共 377 页

SAP_STYLE = &4.

ENDIF.

END-OF-DEFINITION.

* 取得班级文本

SELECT SINGLE DD07T~DDTEXT "域固定值文本

INTO LV_CLASS_TEXT "域固定值文本

FROM DD07T INNER JOIN DD07L "内结合

ON DD07T~DOMNAME = DD07L~DOMNAME "结合条件

AND DD07T~VALPOS = DD07L~VALPOS

WHERE DD07L~DOMNAME = 'ZZCLASS_D' "域名相等

AND DD07L~DOMVALUE_L = CLASS. "域固定值相等

* 取得班主任信息

SELECT SINGLE ZCCLASS_T~ZZTEANOM "班主任

ZCCLASS_T~ZZTEANOS "副班主任

A~ZTNAME "班主任名

B~ZTNAME "副班主任名

FROM ZCCLASS_T "班主任表

INNER JOIN ZMTNUMBER_T AS A

ON ZCCLASS_T~ZZTEANOM = A~ZTNUMBER

INNER JOIN ZMTNUMBER_T AS B

ON ZCCLASS_T~ZZTEANOS = B~ZTNUMBER

INTO (LV_ZZTEANOM,LV_ZZTEANOS,LV_ZTNAMEP,LV_ZTNAMES)

WHERE ZZCLASS = CLASS . "班级

* 编辑班级信息

CONCATENATE TEXT-003 '(' LV_CLASS_TEXT ')' INTO LV_CLASS_TEXT .

* 编辑表头

D_TOP_OF_PAGE: '50' ' ' LV_CLASS_TEXT CL_DD_DOCUMENT=>HEADING,

' ' 'X' ' ' '',

' ' ' ' '班 主 任' CL_DD_DOCUMENT=>STRONG,

'10' ' ' LV_ZZTEANOM CL_DD_DOCUMENT=>KEY,

'10' '' LV_ZTNAMEP CL_DD_DOCUMENT=>LARGE,

' ' 'X' ' ' '',

' ' ' ' '副班主任' CL_DD_DOCUMENT=>STRONG,

'10' ' ' LV_ZZTEANOS CL_DD_DOCUMENT=>KEY,

'10' ' ' LV_ZTNAMES CL_DD_DOCUMENT=>LARGE,

' ' 'X' ' ' ''.

* " T-CODE: OAER/OAOR

* " CLASSNAME: PICTURES

* " CLASSTYPE: OT

* " OBJECT KEY BOY

* " CREATE: SCREEN

* 添加相片

CALL METHOD E_DYNDOC_ID->ADD_PICTURE

EXPORTING

PICTURE_ID = 'GRADUATION'

WIDTH = '100'.

67

DDTEXT
LV_CLASS_TEXT
DD07L
DOMNAME
DD07T ~ ~ DOMNAME
DD07T VALPOS =
ZCCLASS_T ZZTEANOM
ZCCLASS_T ~ ~ ~ ZZTEANOS
A ZTNAME
B ZTNAME
FROM ZCCLASS_T
INNER J OIN ZMTNUMBER_T
ON ZCCLASS_T ~
INNER J OIN ZMTNUMBER_T
ZCCLASS_T ~ ZZTEANOS
A A B ~
ZTNUMBER
D_TOP_OF_PAGE
'
'
'
LV_ZTNAMEP CL_DD_DOCUMENT
LV_ZZTEANOM CL_DD_DOCUMENT
LARGE
LV_ZZTEANOS CL_DD_DOCUMENT
LV_ZTNAMES CL_DD_DOCUMENT
PICTURE_ID
WIDTH

第 76 页 / 共 377 页

* 显示表头

W_DOC->HTML_CONTROL = W_VIEWER.

CALL METHOD W_DOC->DISPLAY_DOCUMENT

EXPORTING

REUSE_CONTROL = 'X'

PARENT = W_HEAD.

ENDMETHOD. "HANDLE_TOP_OF_PAGE

*

* 编辑双击事件

METHOD HANDLE_DOUBLECLICK.

DATA LV_SEL_COL TYPE I. "列

DATA: LV_SEL_ROW TYPE I, "行

LV_ROWID TYPE LVC_S_ROW. "行描述

DATA: LV_COL TYPE STRING,

LV_ROW TYPE STRING,

LV_MSG TYPE STRING.

* 取得当前行

CALL METHOD WCL_ALV->GET_CURRENT_CELL

IMPORTING

E_ROW = LV_SEL_ROW

E_COL = LV_SEL_COL

ES_ROW_ID = LV_ROWID.

* 非合计行时

IF LV_ROWID-ROWTYPE = SPACE.

LV_COL = LV_SEL_COL.

LV_ROW = LV_SEL_ROW.

CONCATENATE '您双击的是' LV_ROW '行' LV_COL '列,非合计行。' INTO LV_MSG .

MESSAGE LV_MSG TYPE 'I'.

ENDIF.

ENDMETHOD. "catch_doubleclick

ENDCLASS. "lcl_event_receiver IMPLEMENTATION

*----------------------------------------------------------------------*

* PARAMETERS

*----------------------------------------------------------------------*

PARAMETERS: P_VARI TYPE DISVARIANT-VARIANT. "表示布局(ALV用)

PARAMETERS: P_CLASS TYPE ZTTEST_T-ZZCLASS "班级

OBLIGATORY . "必须

PARAMETERS: P_YEAR TYPE ZTTEST_T-ZZYEAR OBLIGATORY. "学年

68

W_DOC
REUSE_CONTROL
PARENT
LV_ROWID
LV_ROW
LV_MSG
E_ROW
E_COL
ES_ROW_ID
LV_ROWID -ROWTYPE
LV_COL = L V_SEL_COL
LV_ROW
P_VARI
P_CLASS

第 77 页 / 共 377 页

*----------------------------------------------------------------------*

* SELECT-OPTIONS

*----------------------------------------------------------------------*

SELECT-OPTIONS S_STDNO FOR ZTTEST_T-ZZSTDNO "学号

MATCHCODE OBJECT ZZMCSBID.

*----------------------------------------------------------------------*

* INITIALIZATION

*----------------------------------------------------------------------*

INITIALIZATION.

* 数据初始化

PERFORM DATA_INIT

USING

P_CLASS "班级

P_YEAR. "学年

*----------------------------------------------------------------------*

* AT SELECTION SCREEN

*----------------------------------------------------------------------*

AT SELECTION-SCREEN.

* 选择画面项目检查-班级

PERFORM CLASS_INPUT_CHECK USING P_CLASS TEXT-003 CHANGING TNAME.

* 选择画面项目检查-学年

PERFORM YEAR_INPUT_CHECK USING P_YEAR TEXT-004.

*----------------------------------------------------------------------*

* AT SELECTION SCREEN ON VALUE-REQUEST

*----------------------------------------------------------------------*

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_VARI .

* 选择画面项目选择-布局

PERFORM VARIANT_INPUT_SELECT.

*----------------------------------------------------------------------*

*START-OF-SELECTION

*----------------------------------------------------------------------*

START-OF-SELECTION.

* 报表数据初始化

PERFORM REPORT_DATA_INIT.

* 报表数据选择

PERFORM REPORT_DATA_SELECT.

* 报表数据编辑

PERFORM REPORT_DATA_EDIT.

69

S_STDNO
ZTTEST_T -ZZSTDNO
OBJECT ZZMCSBID
P_CLASS
P_YEAR

第 78 页 / 共 377 页

* 报表数据显示

CALL SCREEN 9000.

*&---------------------------------------------------------------------*

*& Form VARIANT_INPUT_SELECT

*&---------------------------------------------------------------------*

* 选择画面项目选择

*----------------------------------------------------------------------*

FORM VARIANT_INPUT_SELECT .

AW-VARIANT-REPORT = SY-REPID. "程序名

CALL FUNCTION 'REUSE_ALV_VARIANT_F4'

EXPORTING

IS_VARIANT = AW-VARIANT

I_SAVE = AC-A

* it_default_fieldcat =

IMPORTING

E_EXIT = AW-EXIT

ES_VARIANT = AW-VARIANT

EXCEPTIONS

NOT_FOUND = 2.

IF ( SY-SUBRC = 2 ).

MESSAGE ID SY-MSGID TYPE CNS-MTY_S NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ELSE.

IF ( AW-EXIT = SPACE ).

P_VARI = AW-VARIANT-VARIANT.

ENDIF.

ENDIF.

ENDFORM. " VARIANT_INPUT_SELECT

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_INIT

*&---------------------------------------------------------------------*

* 报表数据初始化

*----------------------------------------------------------------------*

FORM REPORT_DATA_INIT .

* 内部表初始化

CLEAR: STR_TEST. "成绩表头

REFRESH: TBL_TEST. "成绩表

ENDFORM. " REPORT_DATA_INIT

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_SELECT

*&---------------------------------------------------------------------*

* 报表数据选择

*----------------------------------------------------------------------*

70

VARIANT_INPUT_SELECT
AW- VARIANT
IS_VARIANT
I_SAVE
AW -VARIANT
AC- A
E_EXIT
ES_VARIANT
NOT_FOUND
P_VARI
AW
AW -VARIANT
SY -MSGID CNS -MTY_S
SY -MSGV1 SY- MSGV2 SY -MSGV3 SY -MSGV4
PACE )
AW- VARIANT- VARIANT

第 79 页 / 共 377 页

FORM REPORT_DATA_SELECT .

* 成绩表数据抽取

SELECT ZZCLASS "班级

ZZYEAR "学年

ZZSTDNO "学号

ZZNAME "姓名

ZZTENKOK "语文

ZZTENSAN "数学

ZZTENRIK "自然

ZZTENSHA "思品

FROM ZZTEST_V "成绩表

INTO TABLE TBL_TEST "成绩内部表

WHERE ZZCLASS = P_CLASS "班级

AND ZZYEAR = P_YEAR "学年

AND ZZSTDNO IN S_STDNO . "学号

* 无数据情况

IF SY-SUBRC <> 0.

MESSAGE S002.

STOP.

ENDIF.

LOOP AT TBL_TEST INTO STR_TEST.

STR_TEST-ZZSUM = STR_TEST-ZZSUM +:

STR_TEST-ZZTENKOK,

STR_TEST-ZZTENSAN,

STR_TEST-ZZTENRIK,

STR_TEST-ZZTENSHA .

MODIFY TBL_TEST FROM STR_TEST.

ENDLOOP.

* 排序

SORT TBL_TEST BY ZZCLASS ASCENDING "班级

ZZYEAR ASCENDING "学年

ZZSTDNO ASCENDING. "学号

ENDFORM. " REPORT_DATA_SELECT

*&---------------------------------------------------------------------*

*& Form REPORT_DATA_EDIT

*&---------------------------------------------------------------------*

* 报表数据编辑

*----------------------------------------------------------------------*

FORM REPORT_DATA_EDIT .

* 准备获取字段目录

PERFORM PREPARE_FIELD_CATALOG .

71

ZZCLASS
ZZYEAR
ZZSTDNO
ZZNAME
ZZTENKOK
ZZTENSAN
ZZTENRIK
ZZTENSHA
ZZTEST_V
TBL_TEST
ZZCLASS = P_CLASS
ZZYEAR = P_YEAR
ZZSTDNO
SY -SUBRC <>
S002
BL_TEST
STR_TEST- ZZSUM STR_TEST -ZZSUM +
STR_TEST -ZZTENKOK
STR_TEST -ZZTENSAN
STR_TEST -ZZTENRIK,
STR_TEST -ZZTENSHA
ZZCLASS
ZZYEAR A
ZZSTDNO

第 80 页 / 共 377 页

* 设置布局

PERFORM PREPARE_ALV_LAYOUT .

ENDFORM. " REPORT_DATA_EDIT

*&---------------------------------------------------------------------*

*& Module INIT_9000 OUTPUT

*&---------------------------------------------------------------------*

* 初期处理

*----------------------------------------------------------------------*

MODULE INIT_9000 OUTPUT.

* 初始化

IF WCL_ALV IS INITIAL .

* 设置超级链接

CLEAR: STR_HYPE, TBL_HYPETAB.

STR_HYPE-HANDLE = '1'. STR_HYPE-HREF = 'http://www.51job.com'.

APPEND STR_HYPE TO TBL_HYPETAB.

STR_HYPE-HANDLE = '2'. STR_HYPE-HREF = 'http://www.sap.com'.

APPEND STR_HYPE TO TBL_HYPETAB.

* 编辑字段信息

REFRESH: TBL_TEST1.

LOOP AT TBL_TEST INTO STR_TEST.

MOVE-CORRESPONDING STR_TEST TO TBL_TEST1.

* 设定例外信息

CLEAR STR_CELLCOLOR.

CLEAR TBL_TEST1-LINECOLOR.

IF STR_TEST-ZZSUM < 280.

TBL_TEST1-LIGHT = 1.

TBL_TEST1-LINECOLOR = 'C611'.

ELSEIF STR_TEST-ZZSUM >= 280 AND STR_TEST-ZZSUM < 290 .

TBL_TEST1-LIGHT = 2.

TBL_TEST1-LINECOLOR = 'C311'.

ELSE.

TBL_TEST1-LIGHT = 3.

TBL_TEST1-LINECOLOR = 'C110'.

ENDIF.

* 选定第八行

IF SY-TABIX = 8.

* 所有字段设置为浅红

STR_CELLCOLOR-COLOR-COL = 6.

APPEND STR_CELLCOLOR TO TBL_TEST1-CELLCOLOR.

* 选定第九行

ELSEIF SY-TABIX = 9.

* 语文设置棕色

STR_CELLCOLOR-FNAME = 'ZZTENKOK'.

STR_CELLCOLOR-COLOR-COL = 3.

APPEND STR_CELLCOLOR TO TBL_TEST1-CELLCOLOR.

72

STR_HYPE
STR_HYP E-HANDLE
APPEND S TR_HYPE
STR_HYP E-HANDLE
TR_HYPE
BL_HYPETA
STR_HYPE -HREF
STR_TEST- ZZSUM <
TBL_TEST1 -LIGHT
TBL_TEST1 -LINECOLOR
ELSEIF STR_TEST- ZZSUM >=
TBL_TEST1 -LIGHT
TBL_TEST1 -LINECOLOR
TBL_TEST1 -LIGHT
TBL_TEST1 -LINECOLOR
STR_CELLCOLOR
TBL_TEST 1-L INECOLOR
COL
STR_CELLCOLOR BL_TEST1- CELLCOLOR
STR_CELLCOLOR- FNAME
STR_CELLCOLOR- COLOR- COL
STR_CELLCOLOR BL_TEST1- CELLCOLOR

第 81 页 / 共 377 页

* 数学设置绿色

STR_CELLCOLOR-FNAME = 'ZZTENSAN'.

STR_CELLCOLOR-COLOR-COL = 5.

APPEND STR_CELLCOLOR TO TBL_TEST1-CELLCOLOR.

ENDIF.

CLEAR STR_CELLEDIT.

* 选定第二行

IF sy-tabix = 2.

* 设定主页为可编辑

str_celledit-fieldname = 'HOTSPOT'.

str_celledit-style = cl_gui_alv_grid=>mc_style_enabled.

INSERT str_celledit INTO TABLE TBL_TEST1-celledit.

ENDIF.

* 设置主页内容

IF SY-TABIX = 1.

TBL_TEST1-HOTSPOT = 'http://www.51job.com'.

ELSE.

TBL_TEST1-HOTSPOT = 'http://www.sap.com'.

ENDIF.

READ TABLE TBL_HYPETAB INTO STR_HYPE WITH KEY HREF = TBL_TEST1-HOTSPOT.

IF SY-SUBRC = 0.

TBL_TEST1-HL_FNAME = STR_HYPE-HANDLE.

ENDIF.

APPEND TBL_TEST1.

REFRESH: TBL_TEST1-CELLCOLOR.

REFRESH: TBL_TEST1-CELLEDIT.

ENDLOOP.

* 创建控件容器

CREATE OBJECT: WCL_CONTAINER

EXPORTING

CONTAINER_NAME = 'ALV_CON'.

* 分割大小

CREATE OBJECT W_SPLITTER

EXPORTING

PARENT = WCL_CONTAINER

ROWS = 2

COLUMNS = 1.

* 将W_HEAD设定为第一行

CALL METHOD W_SPLITTER->GET_CONTAINER

EXPORTING

ROW = 1

73

STR_CELLCOLOR -FNAME
STR_CELLCOLOR -COLOR- COL
TR_CELLCOLOR TBL_TEST1- CELLCOLOR
str_celledit-f ieldname
str_celledit- style =
SY -TABIX
TBL_TEST
TBL_TEST
TBL_HYPETAB
SY -SUBRC
TBL_TEST 1-HL_FNAME
TBL_TEST1 -CELLCOLOR
TBL_TEST1 -CELLEDIT

第 82 页 / 共 377 页

COLUMN = 1

RECEIVING

CONTAINER = W_HEAD.

* 将W_BODY设定为第2行

EXPORTING

ROW = 2

COLUMN = 1

RECEIVING

CONTAINER = W_BODY.

* 设定行高

CALL METHOD W_SPLITTER->SET_ROW_HEIGHT

EXPORTING

ID = 1

HEIGHT = 30.

* 创建WCL_ALV指向W_BODY

CREATE OBJECT WCL_ALV EXPORTING I_PARENT = W_BODY.

ENDIF.

AW-VARIANT-REPORT = SY-REPID.

WK_LAYOUT-GRID_TITLE = TEXT-001.

* 允许多行选择

WK_LAYOUT-SEL_MODE = 'A'.

WK_LAYOUT-EXCP_FNAME = 'LIGHT'.

WK_LAYOUT-INFO_FNAME = 'LINECOLOR'.

WK_LAYOUT-CTAB_FNAME = 'CELLCOLOR'.

WK_LAYOUT-STYLEFNAME = 'CELLEDIT'.

* 初始化WCL_ALV

CALL METHOD WCL_ALV->REGISTER_EDIT_EVENT

EXPORTING

I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

CALL METHOD WCL_ALV->SET_READY_FOR_INPUT

EXPORTING

I_READY_FOR_INPUT = 1.

* 显示ALV

CALL METHOD WCL_ALV->SET_TABLE_FOR_FIRST_DISPLAY

EXPORTING

* I_BUFFER_ACTIVE = " 激活缓存

74

第 83 页 / 共 377 页

* I_CONSISTENCY_CHECK =

* I_STRUCTURE_NAME = " DDIC结构体

IS_VARIANT = AW-VARIANT " 变式

I_SAVE = 'A' " 变式保存制限

I_DEFAULT = 'X' " 变式初期设定

IS_LAYOUT = WK_LAYOUT " 布局样式

* IS_PRINT = " 印刷

* IT_SPECIAL_GROUPS = " 分组

* IT_TOOLBAR_EXCLUDING = " 隐藏功能菜单项

IT_HYPERLINK = TBL_HYPETAB " 设置超级链接

CHANGING

IT_OUTTAB = TBL_TEST1[]

IT_FIELDCATALOG = TBL_FIELDCAT

* IT_SORT = " 设置排序

* IT_FILTER = " 设置筛选

EXCEPTIONS

INVALID_PARAMETER_COMBINATION = 1

PROGRAM_ERROR = 2

TOO_MANY_LINES = 3

OTHERS = 4 .

* 创建ALV控件

IF WO_EVENT_RECEIVER IS INITIAL.

CREATE OBJECT WO_EVENT_RECEIVER.

ENDIF.

WO_EVENT_RECEIVER->CLASS = P_CLASS.

* 注册ALV各事件的处理程序

SET HANDLER WO_EVENT_RECEIVER->HANDLE_USER_COMMAND FOR WCL_ALV .

SET HANDLER WO_EVENT_RECEIVER->HANDLE_TOOLBAR FOR WCL_ALV .

SET HANDLER WO_EVENT_RECEIVER->HANDLE_TOP_OF_PAGE FOR WCL_ALV .

SET HANDLER WO_EVENT_RECEIVER->HANDLE_DOUBLECLICK FOR WCL_ALV .

* 触发TOP_OF_PAGE事件

IF W_DOC IS INITIAL.

CREATE OBJECT W_DOC.

ENDIF.

CALL METHOD WCL_ALV->LIST_PROCESSING_EVENTS

EXPORTING

I_EVENT_NAME = 'TOP_OF_PAGE'

I_DYNDOC_ID = W_DOC.

75

第 84 页 / 共 377 页

* 激活工具栏

CALL METHOD WCL_ALV->SET_TOOLBAR_INTERACTIVE.

* 设置光标在ALV上

CALL METHOD CL_GUI_CONTROL=>SET_FOCUS

EXPORTING

CONTROL = WCL_ALV.

* 刷新ALV

CALL METHOD WCL_ALV->REFRESH_TABLE_DISPLAY.

ENDMODULE. " INIT_9000 OUTPUT

*&---------------------------------------------------------------------*

*& Form PREPARE_FIELD_CATALOG

*&---------------------------------------------------------------------*

* 准备获取字段目录

*----------------------------------------------------------------------*

FORM PREPARE_FIELD_CATALOG .

DATA LS_FCAT TYPE LVC_S_FCAT .

* 通过DDIC结构体获取字段目录

CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'

EXPORTING

I_STRUCTURE_NAME = AC-STRUCTURE_NAME"DDIC结构体

CHANGING

CT_FIELDCAT = TBL_FIELDCAT[]

EXCEPTIONS

INCONSISTENT_INTERFACE = 1

PROGRAM_ERROR = 2

OTHERS = 3.

* 异常处理

IF SY-SUBRC <> 0.

MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

* 修改字段目录

LOOP AT TBL_FIELDCAT INTO LS_FCAT .

CASE LS_FCAT-FIELDNAME .

WHEN 'ZZNAME' .

LS_FCAT-OUTPUTLEN = '10' .

76

第 85 页 / 共 377 页

MODIFY TBL_FIELDCAT FROM LS_FCAT .

WHEN 'ZZCLASS' OR 'ZZYEAR' .

LS_FCAT-NO_OUT = 'X' .

MODIFY TBL_FIELDCAT FROM LS_FCAT .

ENDCASE .

ENDLOOP .

* 总成绩

LS_FCAT-FIELDNAME = 'ZZSUM'.

LS_FCAT-COLTEXT = '总成绩' .

APPEND LS_FCAT TO TBL_FIELDCAT .

CLEAR LS_FCAT.

* 超级链接

LS_FCAT-COL_POS = LINES( TBL_FIELDCAT ) + 1.

LS_FCAT-FIELDNAME = 'HOTSPOT'.

LS_FCAT-REPTEXT = '个人主页'.

LS_FCAT-OUTPUTLEN = '20'.

LS_FCAT-WEB_FIELD = 'HL_FNAME'.

APPEND LS_FCAT TO TBL_FIELDCAT.

ENDFORM. " PREPARE_FIELD_CATALOG

*&---------------------------------------------------------------------*

*& Form PREPARE_ALV_LAYOUT

*&---------------------------------------------------------------------*

* 设置布局

*----------------------------------------------------------------------*

FORM PREPARE_ALV_LAYOUT .

WK_LAYOUT-ZEBRA = 'X' . "可选行颜色 (带)

WK_LAYOUT-GRID_TITLE = TEXT-002 . "标题

WK_LAYOUT-SMALLTITLE = 'X' . "标题大小

ENDFORM. " PREPARE_ALV_LAYOUT

*&---------------------------------------------------------------------*

*& Module STATUS_9000 OUTPUT

*&---------------------------------------------------------------------*

* STATUS设定处理

*----------------------------------------------------------------------*

MODULE STATUS_9000 OUTPUT.

77

第 86 页 / 共 377 页

SET PF-STATUS 'ZTEST_ALVOO'.

SET TITLEBAR 'ALVOO'.

ENDMODULE. " STATUS_9000 OUTPUT

*&---------------------------------------------------------------------*

*& Module EXIT_COMMAND_9000 INPUT

*&---------------------------------------------------------------------*

* 程序终了处理

*----------------------------------------------------------------------*

MODULE EXIT_COMMAND_9000 INPUT.

LEAVE TO SCREEN 0.

ENDMODULE. " EXIT_COMMAND_9000 INPUT

GUI 状态栏编辑如图2-12所示(由标准程序SAPLKKBL中的STANDARD拷贝而成)。

图2-12

GUI标题编辑如图2-13所示。

图2-13

屏幕9000,一般属性设定如图2-14所示。

元素清单生成如图2-15所示。

控制逻辑编辑如下:

**********************************************************************

* PROCESS BEFORE OUTPUT

**********************************************************************

PROCESS BEFORE OUTPUT.

* STATUS设定处理

MODULE STATUS_9000.

78

第 87 页 / 共 377 页

图2-14

图2-15

* 初期处理

MODULE INIT_9000.

**********************************************************************

* PROCESS AFTER INPUT

**********************************************************************

PROCESS AFTER INPUT.

* 程序终了处理

MODULE EXIT_COMMAND_9000 AT EXIT-COMMAND .

79

第 88 页 / 共 377 页

* 机能处理

MODULE USER_COMMAND_9000.

画面格式编辑如图2-16所示。

图2-16

注:在生成CL_GUI_ALV_GRID实例时,构造器参数I_PARENT是必需的,但如果要对

ALV 的功能进行扩展,例如工具栏加入按钮,并在事件处理器中对 ALV 的单元表格的属性

如颜色、样式等进行更改,则必须对I_APPL_EVENTS赋值为X。

SET_TABLE_FOR_FIRST_DISPLAY 的一些参数:

隐藏不需要的功能:IT_TOOLBAR_EXCLUDING,相关的功能码是以 MC_FC 打头的

常量。

定义排序表:IT_SORT排序时会把相同的列值垂直合并,如果要对所有列取消合并可更

改布局中的 no_merging,更改单列的合并可更改对应字段目录的 no_merging,它主要是通过

一个类CL_SALV_TABLE来实现的。

字段目录(Field Catalog):字段目录可以手动生成,也可以调用函数 LVC_FIELDCAT-

ALOG_MERGE 先生成一个字段目录表,然后再按需求循环修改属性。I_STRUCTURE_

NAME和IT_FIELDCATALOG两个参数如果都传入的话,I_STRUCTURE_NAME有优先权。

2.程序测试

运行程序结果如图2-17所示。

填写相关参数,单击按钮 ,运行结果如图2-18所示。

双击事件测试结果如图2-19所示。

自定义功能测试如图2-20所示。

80

第 89 页 / 共 377 页

图2-17

图2-18

图2-19

图2-20

81

第 90 页 / 共 377 页

2.3 面向对象ALV

2.3.1 程序设计

程序源码编辑如下:

*----------------------------------------------------------------------*

*

* Program ID :ZREPO03_ALV

* Program Description :成绩查询ALV显示

* Create User :BCUSER

* Create Date :2011/02/20

*

*----------------------------------------------------------------------*

* Function Overview

* 程序实现以班级、年度、学生为参照进行查询

* 技术点:OO-ALV形式显示,试图应用

*

*----------------------------------------------------------------------*

* Change List :

* change NO. Change Date Change User Change Detail

* 0000001 2011/02/20 BCUSER 程序创建

*----------------------------------------------------------------------*

REPORT ZREPO03_ALV

NO STANDARD PAGE HEADING

LINE-SIZE 120

LINE-COUNT 90(3)

MESSAGE-ID ZTESTMSG.

*----------------------------------------------------------------------*

* INCLUDE

*----------------------------------------------------------------------*

INCLUDE: ZTEST0N, "常量定义

ZTEST0F. "Form定义

*----------------------------------------------------------------------*

* TYPE-POOLS

*----------------------------------------------------------------------*

TYPE-POOLS SLIS.

*----------------------------------------------------------------------*

* TYPES

82

第 91 页 / 共 377 页

*----------------------------------------------------------------------*

* 成绩表

TYPES: BEGIN OF TYP_TEST,

ZZCLASS LIKE ZTTEST_T-ZZCLASS, "班级

ZZYEAR LIKE ZTTEST_T-ZZYEAR, "学年

ZZSTDNO LIKE ZTTEST_T-ZZSTDNO, "学号

ZZNAME LIKE ZMNUMBER_T-ZZNAME, "姓名

ZZTENKOK LIKE ZTTEST_T-ZZTENKOK, "语文

ZZTENSAN LIKE ZTTEST_T-ZZTENSAN, "数学

ZZTENRIK LIKE ZTTEST_T-ZZTENRIK, "自然

ZZTENSHA LIKE ZTTEST_T-ZZTENSHA, "思想品德

END OF TYP_TEST.

"TYPES TYP_ITAB_TEST TYPE STANDARD TABLE OF TYP_TEST .

TYPES TYP_ITAB_TEST TYPE TYP_TEST OCCURS 0.

*----------------------------------------------------------------------*

* TABLES:

*----------------------------------------------------------------------*

TABLES: ZTTEST_T, "考试成绩表

ZMNUMBER_T. "学生信息表

*----------------------------------------------------------------------*

* STATICS

*----------------------------------------------------------------------*

*STATICS: XX TYPE X VALUE XX.

*----------------------------------------------------------------------*

* CONSTANTS

*----------------------------------------------------------------------*

CONSTANTS :

BEGIN OF AC,

PROGRAM_NAME TYPE SY-REPID VALUE 'ZREPO03_ALV', "程序

* 控制

STRUCTURE_NAME TYPE DD02L-TABNAME VALUE 'ZZTEST_S', "结构体

ZZCLASS TYPE DD03L-FIELDNAME VALUE 'ZZCLASS', "班级

ZZYEAR TYPE DD03L-FIELDNAME VALUE 'ZZYEAR', "学年

ZZSTDNO TYPE DD03L-FIELDNAME VALUE 'ZZSTDNO', "学号

F2CODE(4) TYPE C VALUE 'POP', "F2(双击)

X(1) TYPE C VALUE 'X',

H(1) TYPE C VALUE 'H',

S(1) TYPE C VALUE 'S',

A(1) TYPE C VALUE 'A',

83

返回ABAP参考资料列表