第 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