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

第 92 页 / 共 377 页

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 TYP_ITAB_TEST, "成绩表

STR_TEST TYPE TYP_TEST. "表头

* ALV信息定义

DATA: BEGIN OF AW,

FIELDCAT TYPE SLIS_T_FIELDCAT_ALV , "字段属性

FLDCAT_R TYPE SLIS_FIELDCAT_ALV, "字段的内容

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, "表格设定

TITLE TYPE LVC_TITLE, "成绩表标题

GRID_TITLE TYPE LVC_TITLE, "成绩表行标题

EXIT(1) TYPE C,

END OF AW.

DATA: W_DOC TYPE REF TO CL_DD_DOCUMENT,

W_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,

W_HEAD TYPE REF TO CL_GUI_CONTAINER,

W_BODY TYPE REF TO CL_GUI_CONTAINER,

W_VIEWER TYPE REF TO CL_GUI_HTML_VIEWER.

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

CLASS: CLS_EVENT_RECEIVER DEFINITION DEFERRED.

DATA: WO_EVENT_RECEIVER TYPE REF TO CLS_EVENT_RECEIVER.

CLASS: CLS_ALV_OPERATION DEFINITION DEFERRED.

DATA: WO_ALV_OPERATION TYPE REF TO CLS_ALV_OPERATION.

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

* CLASS CLS_EVENT_RECEIVER DEFINITION

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

* 事件处理定义

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

84

第 93 页 / 共 377 页

CLASS CLS_EVENT_RECEIVER DEFINITION.

PUBLIC SECTION.

* 事件方法定义

CLASS-METHODS:

ON_USER_COMMAND FOR EVENT "用户事件

ADDED_FUNCTION OF CL_SALV_EVENTS_TABLE

IMPORTING E_SALV_FUNCTION,

ON_DOUBLE_CLICK FOR EVENT "双击事件

DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE

IMPORTING ROW COLUMN ,

ON_LINK_CLICK FOR EVENT "热点单击事件

LINK_CLICK OF CL_SALV_EVENTS_TABLE

IMPORTING ROW COLUMN,

ON_BEFORE_SALV_FUNCTION FOR EVENT

BEFORE_SALV_FUNCTION OF CL_SALV_EVENTS_TABLE "响应之前事件

IMPORTING E_SALV_FUNCTION,

ON_AFTER_SALV_FUNCTION FOR EVENT

AFTER_SALV_FUNCTION OF CL_SALV_EVENTS_TABLE "响应之后事件

IMPORTING E_SALV_FUNCTION.

......

PROTECTED SECTION .

* 定义属性

CLASS-DATA: W_MSG_STRING TYPE STRING. "信息

DATA: CLASS TYPE ZTTEST_T-ZZCLASS , "班级

YEAR TYPE ZTTEST_T-ZZYEAR , "学年

STDNO_H TYPE ZTTEST_T-ZZSTDNO. "学号

ENDCLASS. "CLS_EVENT_RECEIVER DEFINITION

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

* CLASS CLS_EVENT_RECEIVER IMPLEMENTATION

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

* 事件处理实现

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

CLASS CLS_EVENT_RECEIVER IMPLEMENTATION.

*

* 单击功能按钮事件处理方法

METHOD ON_USER_COMMAND.

CONCATENATE '按钮事件功能代码为 '

E_SALV_FUNCTION

INTO W_MSG_STRING SEPARATED BY SPACE.

MESSAGE I000(0K) WITH W_MSG_STRING.

85

第 94 页 / 共 377 页

ENDMETHOD. "on_user_command

*

* 双击事件处理方法

METHOD ON_DOUBLE_CLICK.

W_MSG_STRING = ROW.

CONCATENATE '双击事件在'

'行'

W_MSG_STRING

'列'

COLUMN

'上'

INTO W_MSG_STRING SEPARATED BY SPACE.

MESSAGE I000(0K)WITH W_MSG_STRING.

ENDMETHOD. "on_double_click

*

* 单击事件处理方法

METHOD ON_LINK_CLICK.

DATA: LV_ZZFNAME TYPE ZMNUMBER_T-ZZFNAME ,

LV_ZZMNAME TYPE ZMNUMBER_T-ZZMNAME .

* 取得当前信息

READ TABLE TBL_TEST INTO STR_TEST INDEX ROW.

SELECT SINGLE ZZFNAME ZZMNAME "父母

INTO(LV_ZZFNAME,LV_ZZMNAME)

FROM ZMNUMBER_T "学生信息表

WHERE ZZNUMBER = STR_TEST-ZZSTDNO . "学号

* 成功的场合

IF SY-SUBRC = 0.

CONCATENATE STR_TEST-ZZNAME

'家庭信息是'

'父亲:' LV_ZZFNAME

'母亲:' LV_ZZMNAME

INTO W_MSG_STRING .

MESSAGE I000(0K)WITH W_MSG_STRING.

ENDIF.

ENDMETHOD. "on_link_click

*

* 触发事件之前

METHOD ON_BEFORE_SALV_FUNCTION.

CONCATENATE '事件 '

E_SALV_FUNCTION '触发之前.'

86

第 95 页 / 共 377 页

MESSAGE I000(0K)WITH W_MSG_STRING.

ENDMETHOD. "on_before_salv_function

*

* 触发事件之后

METHOD ON_AFTER_SALV_FUNCTION.

CONCATENATE '事件 '

E_SALV_FUNCTION '触发之后.'

INTO W_MSG_STRING SEPARATED BY SPACE.

MESSAGE I000(0K)WITH W_MSG_STRING.

ENDMETHOD. "on_after_salv_function

ENDCLASS. "cls_event_receiver IMPLEMENTATION

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

* CLASS CLS_ALV_OPERATIO DEFINITION

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

* ALV操作类(定义)

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

CLASS CLS_ALV_OPERATION DEFINITION.

PUBLIC SECTION.

* 定义属性

DATA: CLASS TYPE ZTTEST_T-ZZCLASS , "班级

YEAR TYPE ZTTEST_T-ZZYEAR, "学年

STDNO_L TYPE ZTTEST_T-ZZSTDNO, "学号

STDNO_H TYPE ZTTEST_T-ZZSTDNO. "学号

* 取得显示的成绩数据

METHODS: GET_TEST_DATA

RETURNING VALUE(LT_TEST)TYPE TYP_ITAB_TEST,

* 全屏Grid列表处理方法

SET_ALV_FULL

IMPORTING VALUE(LT_TEST)TYPE TYP_ITAB_TEST.

PRIVATE SECTION.

* 定义私有属性

DATA: WO_TABLE TYPE REF TO CL_SALV_TABLE.

ENDCLASS. "CLS_ALV_OPERATIO DEFINITION

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

* CLASS CLS_ALV_OPERATION IMPLEMENTATION

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

* ALV操作类(实现)

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

CLASS CLS_ALV_OPERATION IMPLEMENTATION.

*

87

第 96 页 / 共 377 页

* 取得要显示的数据

METHOD GET_TEST_DATA.

*

* 成绩表数据抽取

SELECT ZZCLASS "班级

ZZYEAR "学年

ZZSTDNO "学号

ZZNAME "姓名

ZZTENKOK "语文

ZZTENSAN "数学

ZZTENRIK "自然

ZZTENSHA "思品

FROM ZZTEST_V "成绩表

INTO TABLE LT_TEST "成绩内部表

WHERE ZZCLASS = CLASS "班级

AND ZZSTDNO BETWEEN STDNO_L AND STDNO_H. "学号

* 无数据情况

IF SY-SUBRC <> 0.

MESSAGE S002.

ENDIF.

* 排序

SORT TBL_TEST BY ZZCLASS ASCENDING "班级

ZZYEAR ASCENDING "学年

ZZSTDNO ASCENDING. "学号

ENDMETHOD. "GET_TEST_DATA

*

* 输出全屏网格列表的方法

METHOD SET_ALV_FULL.

DATA: LR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST,

LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE,

LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE,

LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE,

LR_SORTS TYPE REF TO CL_SALV_SORTS,

LR_CONTENT TYPE REF TO CL_SALV_FORM_ELEMENT.

* 创建实例

TRY.

CL_SALV_TABLE=>FACTORY(

IMPORTING

R_SALV_TABLE = WO_TABLE

CHANGING

88

第 97 页 / 共 377 页

T_TABLE = LT_TEST

).

CATCH CX_SALV_MSG.

ENDTRY.

* 显示ALV标准功能

LR_FUNCTIONS = WO_TABLE->GET_FUNCTIONS( ).

LR_FUNCTIONS->SET_ALL('X').

* 列值自动设置

LR_COLUMNS = WO_TABLE->GET_COLUMNS( ).

LR_COLUMNS->SET_OPTIMIZE( 'X' ).

* 排序

LR_SORTS = WO_TABLE->GET_SORTS( ).

* 创建排序

TRY .

LR_SORTS->ADD_SORT(

COLUMNNAME = 'ZZCLASS' "班级

SEQUENCE = IF_SALV_C_SORT=>SORT_UP "升序

).

LR_SORTS->ADD_SORT(

COLUMNNAME = 'ZZYEAR' "学年

SEQUENCE = IF_SALV_C_SORT=>SORT_UP "升序

).

CATCH CX_SALV_DATA_ERROR.

CATCH CX_SALV_EXISTING.

CATCH CX_SALV_NOT_FOUND.

ENDTRY.

* 设置GUI Status

WO_TABLE->SET_SCREEN_STATUS(

SET_FUNCTIONS = WO_TABLE->C_FUNCTIONS_ALL

).

* 设置热点

LR_COLUMNS = WO_TABLE->GET_COLUMNS( ).

TRY.

LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'ZZSTDNO' ).

LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).

LR_COLUMN->SET_LONG_TEXT( '学号' ).

LR_COLUMN ?= LR_COLUMNS->GET_COLUMN( 'ZZNAME' ).

LR_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).

LR_COLUMN->SET_LONG_TEXT( '学年' ).

CATCH CX_SALV_NOT_FOUND.

89

第 98 页 / 共 377 页

ENDTRY.

* 注册事件

LR_EVENTS = WO_TABLE->GET_EVENT( ).

IF WO_EVENT_RECEIVER IS INITIAL.

CREATE OBJECT WO_EVENT_RECEIVER.

ENDIF.

IF W_DOC IS INITIAL.

CREATE OBJECT W_DOC.

ENDIF.

SET HANDLER CLS_EVENT_RECEIVER=>ON_USER_COMMAND FOR LR_EVENTS.

SET HANDLER CLS_EVENT_RECEIVER=>ON_DOUBLE_CLICK FOR LR_EVENTS.

SET HANDLER CLS_EVENT_RECEIVER=>ON_LINK_CLICK FOR LR_EVENTS.

SET HANDLER CLS_EVENT_RECEIVER=>ON_BEFORE_SALV_FUNCTION FOR LR_

EVENTS.

SET HANDLER CLS_EVENT_RECEIVER=>ON_AFTER_SALV_FUNCTION FOR LR_

EVENTS.

* 编辑表头

DATA: LO_HEADER TYPE REF TO CL_SALV_FORM_LAYOUT_GRID,

LO_H_LABEL TYPE REF TO CL_SALV_FORM_LABEL,

LO_H_FLOW TYPE REF TO CL_SALV_FORM_LAYOUT_FLOW.

DATA: LISTHEADER TYPE SLIS_T_LISTHEADER,

WA_LISTHEADER TYPE SLIS_LISTHEADER,

H_DATUM(10), H_UZEIT(10),

EMPTY(10) TYPE C VALUE ' '.

* 创建表头对象

CREATE OBJECT LO_HEADER.

* 标题

LO_H_LABEL = LO_HEADER->CREATE_LABEL( ROW = 1 COLUMN = 1 ).

WA_LISTHEADER-INFO = AW-TITLE.

IF ( NOT AW-VARIANT-TEXT IS INITIAL ).

CONCATENATE AW-TITLE '(' AW-VARIANT-TEXT ')'

INTO WA_LISTHEADER-INFO.

ENDIF.

LO_H_LABEL->SET_TEXT( WA_LISTHEADER-INFO ).

* 中标题

LO_H_LABEL = LO_HEADER->CREATE_LABEL( ROW = 3 COLUMN = 1 ).

WRITE SY-DATUM TO H_DATUM DD/MM/YYYY.

WRITE SY-UZEIT TO H_UZEIT USING EDIT MASK '__:__:__'.

CLEAR WA_LISTHEADER.

WA_LISTHEADER-KEY = '作成日'.

90

第 99 页 / 共 377 页

LO_H_LABEL->SET_TEXT( WA_LISTHEADER-KEY ).

LO_H_FLOW = LO_HEADER->CREATE_FLOW( ROW = 3 COLUMN = 2 ).

CONCATENATE 'Today:' H_DATUM EMPTY

LO_H_LABEL = LO_HEADER->CREATE_LABEL( ROW = 4 COLUMN = 1 ).

WA_LISTHEADER-KEY = '选择基准'.

LO_H_LABEL->SET_TEXT( WA_LISTHEADER-KEY ).

LO_H_FLOW = LO_HEADER->CREATE_FLOW( ROW = 4 COLUMN = 2 ).

CONCATENATE '班级:' CLASS+0(1) CNS-PLUS CLASS+1(1) EMPTY EMPTY

'学年:' YEAR

INTO WA_LISTHEADER-INFO .

LO_H_FLOW->CREATE_TEXT( TEXT = WA_LISTHEADER-INFO ).

* 小标题

LO_H_FLOW = LO_HEADER->CREATE_FLOW( ROW = 5 COLUMN = 1 ).

CLEAR WA_LISTHEADER.

CONCATENATE '作成者:' SY-UNAME INTO WA_LISTHEADER-INFO .

LO_H_FLOW->CREATE_TEXT( TEXT = '作成者:' ).

LO_H_FLOW = LO_HEADER->CREATE_FLOW( ROW = 5 COLUMN = 2 ).

LO_H_FLOW->CREATE_TEXT( TEXT = SY-UNAME ).

* 设定表头

WO_TABLE->SET_TOP_OF_LIST( LO_HEADER ).

* 显示表头

WO_TABLE->SET_TOP_OF_LIST_PRINT( LO_HEADER ).

* 显示列表

WO_TABLE->DISPLAY( ).

ENDMETHOD. "SET_ALV_FULL

ENDCLASS. "CLS_ALV_OPERATION 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. "学年

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

* SELECT-OPTIONS

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

SELECT-OPTIONS S_STDNO FOR ZTTEST_T-ZZSTDNO

MATCHCODE OBJECT ZZMCSBID.

91

第 100 页 / 共 377 页

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

* 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_LIST.

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

* END-OF-SELECTION

92

第 101 页 / 共 377 页

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

*END-OF-SELECTION.

* 报表程序终了处理

* PERFORM REPORT_EDIT_END.

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

* TOP-OF-PAGE

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

*TOP-OF-PAGE.

* 报表页眉编辑

* PERFORM REPORT_HEADER_EDIT.

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

* END-OF-PAGE

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

*END-OF-PAGE.

* 报表页脚编辑

* PERFORM REPORT_FOOTER_EDIT.

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

* AT LINE-SELECTION

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

*AT LINE-SELECTION.

* 报表选择处理

* PERFORM REPORT_LIST_SELECT.

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

* AT USER-COMMAND

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

*AT USER-COMMAND.

* 用户交互处理

* PERFORM REPORT_USER_COMMAND.

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

* AT PFNN

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

* AT PFNN.

* 功能键响应处理

* PERFORM REPORT_PFNN_COMMAND.

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

93

第 102 页 / 共 377 页

*& 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. "成绩表

MOVE: TEXT-001 TO AW-TITLE , "标题

TEXT-002 TO AW-GRID_TITLE . "行标题

ENDFORM. " REPORT_DATA_INIT

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

*& Form REPORT_DATA_SELECT

94

第 103 页 / 共 377 页

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

* 报表数据选择

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

FORM REPORT_DATA_SELECT .

CREATE OBJECT WO_ALV_OPERATION.

* 设定选择条件

WO_ALV_OPERATION->CLASS = P_CLASS.

WO_ALV_OPERATION->YEAR = P_YEAR.

WO_ALV_OPERATION->STDNO_L = S_STDNO-LOW.

WO_ALV_OPERATION->STDNO_H = S_STDNO-HIGH.

* 报表数据选择

TBL_TEST = WO_ALV_OPERATION->GET_TEST_DATA( ).

ENDFORM. " REPORT_DATA_SELECT

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

*& Form REPORT_DATA_LIST

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

* 报表数据显示

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

FORM REPORT_DATA_LIST .

* 报表数据显示

WO_ALV_OPERATION->SET_ALV_FULL( TBL_TEST ).

ENDFORM. " REPORT_DATA_LIST

文本元素编辑如图2-21所示。

图2-21

选择文本元素编辑如图2-22所示。

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

2.3.2 程序测试

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

95

第 104 页 / 共 377 页

图2-22

图2-23

图2-24

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

图2-25

ALV功能点测试结果如表2-1所示。

96

第 105 页 / 共 377 页

表2-1

功 能 结 果

双击

热点

2.4 ALV树

2.4.1 程序设计

程序源码设计如下:

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

*

* Program ID :ZREPO03_ALV_SIMPLE_TREE

* Program Description :成绩查询ALV显示

* Create User :BCUSER

* Create Date :2011/02/20

97

第 106 页 / 共 377 页

*

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

* Function Overview

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

* 技术点:GUI ALV Tree形式显示,视图应用

*

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

* Change List :

* change NO. Change Date Change User Change Detail

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

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

REPORT ZREPO03_ALV_SIMPLE_TREE

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

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

* 成绩表

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.

98

第 107 页 / 共 377 页

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

* 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', "学号

ZZTENKOK TYPE DD03L-FIELDNAME VALUE 'ZZTENKOK', "语文

ZZTENSAN TYPE DD03L-FIELDNAME VALUE 'ZZTENSAN', "数学

ZZTENRIK TYPE DD03L-FIELDNAME VALUE 'ZZTENRIK', "自然

ZZTENSHA TYPE DD03L-FIELDNAME VALUE 'ZZTENSHA', "思品

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 TYP_ITAB_TEST, "成绩表

STR_TEST TYPE TYP_TEST. "表头

* ALV信息定义

99

第 108 页 / 共 377 页

DATA: BEGIN OF AW,

FIELDCAT TYPE LVC_T_FCAT, "字段属性

FLDCAT_R TYPE SLIS_T_FIELDCAT_ALV , "字段的内容

LAYOUT TYPE SLIS_LAYOUT_ALV, "布局

LISTHEADER TYPE SLIS_T_LISTHEADER,

SORT_REC TYPE LVC_S_SORT, "排序记录

SORTER TYPE LVC_T_SORT, "排序属性

VARIANT TYPE DISVARIANT, "变式

GRID_SET TYPE LVC_S_GLAY, "表格设定

TITLE TYPE LVC_TITLE, "成绩表标题

GRID_TITLE TYPE LVC_TITLE, "成绩表行标题

EXIT(1) TYPE C,

END OF AW.

* ALV TREE定义

DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'ALV_SIMPLE',

ALV_GRID TYPE REF TO CL_GUI_ALV_TREE_SIMPLE,

WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

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

* PARAMETERS

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

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

PARAMETERS P_CLASS TYPE ZTTEST_T-ZZCLASS "班级

OBLIGATORY . "必须

PARAMETERS P_YEAR TYPE ZTTEST_T-ZZYEAR OBLIGATORY. "学年

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

* 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

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

10 0

第 109 页 / 共 377 页

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_LIST.

* 调用画面

CALL SCREEN '9000'.

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

* END-OF-SELECTION

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

*END-OF-SELECTION.

* 报表程序终了处理

* PERFORM REPORT_EDIT_END.

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

* TOP-OF-PAGE

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

*TOP-OF-PAGE.

* 报表页眉编辑

* PERFORM REPORT_HEADER_EDIT.

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

* END-OF-PAGE

101

第 110 页 / 共 377 页

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

*END-OF-PAGE.

* 报表页脚编辑

* PERFORM REPORT_FOOTER_EDIT.

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

* AT LINE-SELECTION

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

*AT LINE-SELECTION.

* 报表选择处理

* PERFORM REPORT_LIST_SELECT.

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

* AT USER-COMMAND

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

*AT USER-COMMAND.

* 用户交互处理

* PERFORM REPORT_USER_COMMAND.

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

* AT PFNN

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

* AT PFNN.

* 功能键响应处理

* PERFORM REPORT_PFNN_COMMAND.

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

*& Module INIT_9000 OUTPUT

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

* 初期处理

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

MODULE INIT_9000 OUTPUT.

* 创建ALV TREE对象

IF WA_CUSTOM_CONTAINER IS INITIAL.

CREATE OBJECT WA_CUSTOM_CONTAINER

EXPORTING CONTAINER_NAME = WA_CONTAINER.

CREATE OBJECT ALV_GRID

EXPORTING I_PARENT = WA_CUSTOM_CONTAINER.

ENDIF.

* 显示ALV TREE对象

CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY

EXPORTING

IT_LIST_COMMENTARY = AW-LISTHEADER

I_STRUCTURE_NAME = AC-STRUCTURE_NAME "参照结构体「ZZTEST_S」

10 2

第 111 页 / 共 377 页

CHANGING

IT_SORT = AW-SORTER "初期排序设定

IT_FIELDCATALOG = AW-FIELDCAT "字段目录

IT_OUTTAB = TBL_TEST. "成绩内容

* 展开第一层

CALL METHOD ALV_GRID->EXPAND_TREE

EXPORTING

I_LEVEL = 1.

ENDMODULE. " INIT_9000 OUTPUT

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

*& Module EXIT_COMMAND_9000 INPUT

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

* 程序终了处理

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

MODULE EXIT_COMMAND_9000 INPUT.

LEAVE TO SCREEN 0.

ENDMODULE. " EXIT_COMMAND_9000 INPUT

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

*& 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

103

第 112 页 / 共 377 页

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

* 报表数据初始化

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

FORM REPORT_DATA_INIT .

* 内部表初始化

CLEAR: STR_TEST. "成绩表头

REFRESH: TBL_TEST. "成绩表

MOVE: TEXT-001 TO AW-TITLE , "标题

TEXT-002 TO AW-GRID_TITLE . "行标题

ENDFORM. " REPORT_DATA_INIT

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

*& Form REPORT_DATA_SELECT

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

* 报表数据选择

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

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.

* 排序

SORT TBL_TEST BY ZZCLASS ASCENDING "班级

ZZYEAR ASCENDING "学年

ZZSTDNO ASCENDING. "学号

ENDFORM. " REPORT_DATA_SELECT

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

10 4

第 113 页 / 共 377 页

*& Form REPORT_DATA_LIST

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

* 报表数据编辑

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

FORM REPORT_DATA_LIST .

* 页眉编辑

PERFORM TOP_OF_PAGE.

*字段清单、字段长度、汇总字段方法调用

* 生成Field Catalog,

DATA LS_FLDCAT_R LIKE LINE OF AW-FLDCAT_R.

DATA LS_FIELDCAT LIKE LINE OF AW-FIELDCAT.

* 声明回调事件结构体

* DATA LS_EVENT LIKE LINE OF AW-EVENT.

* 功能

* 用来获得程序中的内表 或者 DDIC表的Field Catalog

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'

EXPORTING

I_PROGRAM_NAME = SY-REPID "PGMID「ZREPO03」

I_INTERNAL_TABNAME = 'TBL_TEST' "设定内部表名

I_STRUCTURE_NAME = AC-STRUCTURE_NAME "参照结构体「ZZTEST_S」

* I_CLIENT_NEVER_DISPLAY = AC-X "Client隐藏

* I_INCLNAME = "内部表中定义的Include名

I_BYPASSING_BUFFER = AC-X "既存的缓存值无效

* I_BUFFER_ACTIVE = "激活缓存

CHANGING

CT_FIELDCAT = AW-FLDCAT_R "有文本字段的目录

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.

EXIT.

ELSE.

* 编辑Field Catalog

LOOP AT AW-FLDCAT_R INTO LS_FLDCAT_R.

MOVE-CORRESPONDING LS_FLDCAT_R TO LS_FIELDCAT.

* 设定显示、编辑和合计属性

IF LS_FIELDCAT-FIELDNAME = AC-ZZTENKOK OR "语文

LS_FIELDCAT-FIELDNAME = AC-ZZTENSAN OR "数学

LS_FIELDCAT-FIELDNAME = AC-ZZTENRIK OR "自然

105

第 114 页 / 共 377 页

LS_FIELDCAT-FIELDNAME = AC-ZZTENSHA . "思品.

LS_FIELDCAT-OUTPUTLEN = 12.

LS_FIELDCAT-EDIT = AC-X.

LS_FIELDCAT-DO_SUM = AC-X.

ELSE.

LS_FIELDCAT-NO_OUT = AC-X.

ENDIF.

APPEND LS_FIELDCAT TO AW-FIELDCAT .

ENDLOOP.

ENDIF.

* 创建TREE分类字段清单以及先后顺序

*-- 排序字段目录编辑集

* CLEAR FLDCAT_R. FLDCAT_R-KEY = ''.

* MODIFY FIELDCAT FROM FLDCAT_R TRANSPORTING KEY WHERE KEY = 'X'.

**--默认排序字段设定=> SORTER

*

CLEAR: AW-SORT_REC, AW-SORTER.

AW-SORT_REC-SPOS = '1'. "排序基准「第一」

AW-SORT_REC-FIELDNAME = AC-ZZCLASS. "参照字段名「ZZCLASS」

* AW-SORT_REC-TABNAME = AC-STRUCTURE_NAME."参照结构体「ZZTEST_S」

AW-SORT_REC-UP = AC-X . "升序

* AW-SORT_REC-DOWN = AC-X . "降序

AW-SORT_REC-SUBTOT = 'X'.

APPEND AW-SORT_REC TO AW-SORTER.

*

AW-SORT_REC-SPOS = '2'. "排序基准「第二」

AW-SORT_REC-FIELDNAME = AC-ZZYEAR. "参照字段名「ZZYEAR」

* AW-SORT_REC-TABNAME = AC-STRUCTURE_NAME. "参照结构体「ZZTEST_S」

AW-SORT_REC-UP = AC-X . "升序

AW-SORT_REC-SUBTOT = 'X'.

* AW-SORT_REC-DOWN = AC-X . "降序

APPEND AW-SORT_REC TO AW-SORTER.

*

AW-SORT_REC-SPOS = '3'. "排序基准「第三」

AW-SORT_REC-FIELDNAME = AC-ZZSTDNO. "参照字段名「ZZSTDNO」

* AW-SORT_REC-TABNAME = AC-STRUCTURE_NAME. "参照结构体「ZZTEST_S」

AW-SORT_REC-UP = AC-X . "升序

* AW-SORT_REC-DOWN = AC-X . "降序

APPEND AW-SORT_REC TO AW-SORTER.

ENDFORM. " REPORT_DATA_LIST

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

*& Form TOP_OF_PAGE

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

* 页眉编辑

10 6

第 115 页 / 共 377 页

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

FORM TOP_OF_PAGE.

DATA: WA_LISTHEADER TYPE SLIS_LISTHEADER,

H_DATUM(10),

H_UZEIT(10),

EMPTY(3) TYPE C VALUE ' '.

*

CLEAR WA_LISTHEADER.

* 标题

WA_LISTHEADER-TYP = AC-H."'H'.

WA_LISTHEADER-INFO = AW-TITLE.

IF ( NOT AW-VARIANT-TEXT IS INITIAL ).

CONCATENATE AW-TITLE '(' AW-VARIANT-TEXT ')'

INTO WA_LISTHEADER-INFO.

ENDIF.

APPEND WA_LISTHEADER TO AW-LISTHEADER.

*

CLEAR WA_LISTHEADER.

APPEND WA_LISTHEADER TO AW-LISTHEADER.

* 中标题

WRITE SY-DATUM TO H_DATUM DD/MM/YYYY.

WRITE SY-UZEIT TO H_UZEIT USING EDIT MASK '__:__:__'.

CLEAR WA_LISTHEADER.

WA_LISTHEADER-TYP = AC-S."'S'.

WA_LISTHEADER-KEY = '作成日'.

CONCATENATE 'Today:' H_DATUM EMPTY

'Time:' H_UZEIT

INTO WA_LISTHEADER-INFO .

APPEND WA_LISTHEADER TO AW-LISTHEADER.

CLEAR WA_LISTHEADER.

WA_LISTHEADER-TYP = AC-S."'S'.

WA_LISTHEADER-KEY = '选择基准'.

CONCATENATE '班级:' P_CLASS+0(1) CNS-PLUS P_CLASS+1(1) EMPTY

'学年:' P_YEAR

INTO WA_LISTHEADER-INFO .

APPEND WA_LISTHEADER TO AW-LISTHEADER.

* 小标题

CLEAR WA_LISTHEADER.

WA_LISTHEADER-TYP = AC-A.

CONCATENATE '作成者:' SY-UNAME INTO WA_LISTHEADER-INFO .

APPEND WA_LISTHEADER TO AW-LISTHEADER.

ENDFORM. "TOP_OF_PAGE

文本元素编辑如图2-26所示。

107

第 116 页 / 共 377 页

图2-26

选择文本元素编辑如图2-27所示。

图2-27

屏幕9000元素清单生成如图2-28所示。

图2-28

一般属性设定如图2-29所示。

控制逻辑编辑如下:

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

* PROCESS BEFORE OUTPUT

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

PROCESS BEFORE OUTPUT.

* 初期处理

MODULE INIT_9000.

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

* PROCESS AFTER INPUT

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

10 8

第 117 页 / 共 377 页

PROCESS AFTER INPUT.

* 程序终了处理

MODULE EXIT_COMMAND_9000 AT EXIT-COMMAND .

图2-29

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

图2-30

2.4.2 程序测试

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

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

109

第 118 页 / 共 377 页

图2-31

图2-32

11 0

第 119 页 / 共 377 页

第 3 章 接 口

随着SAP R/3成为国内越来越多大企业ERP应用的首选,很多企业都面临着同样一个问题,

即如何让新的 ERP 平台和一些老的或是新增加的子系统/子平台默契配合。在保证既有功能的

前提下,提高系统和系统间信息传递的效率,从而保证和提高企业的生产竞争力。在这样的背

景之下,ERP系统接口的应用、开发和规范,会起到积极的作用。SAP从诞生之日开始,就提

供了众多的API应用编程接口和接口工具,以方便SAP二次开发者和爱好者进行研究。RFC、

ALE IDocs是SAP公司早期为SAP R/3R4.6C版本所提供的接口机制,目前应用最为广泛。

3.1 SAP数据交换接口的类型

SAP数据交换接口的类型有三种:ALE、RFC和CPI-C。它们之间的关系如图3-1所示。

图3-1

CPI-C是数据交换的最基本接口,它使用起来比较复杂。

RFC架构在CPI-C接口之上,RFC的调用都将转换为CPI-C的调用完成。

ALE架构在RFC和IDOC技术上来完成数据通信交换。

3.1.1 CPI-C简介

CPI-C(Common Programming Interface - Communications)是SAP中专门用于程序对程

111

第 120 页 / 共 377 页

序的远程调用的协议,其实就是一个定义函数名、参数之类调用需要的信息的数据格式。

CPI-C 是一种同步对话通信模式,参加通信的一方发起一次对话,同时控制信息流动。

数据既可以由发送者传递到接收者,也可以反向流动。

参加通信的两个程序需要跟踪对话的状态,如果异常发生导致连接中断,则需要发送方

重建并恢复这次通话。通信双方既可以处于主从地位,也可以处于对等地位。也就是说,CPI-C

既支持客户端-服务器环境,也支持对等通信方式。

虽然 CPI-C 在一般情况下是一种同步通信类型,但是在一定环境中,可以通过“临时数

据队列”等实现一定程度的异步。TCP/IP和SNA都支持CPI-C。

由于需要应用程序参与错误的检测与恢复,CPI-C的编程接口相当复杂,一般情况不用,

它只有在以下几种特殊情况下才被采用:

■ 客户的系统平台不支持RFC。

■ 旧系统必须使用CPI-C作通信接口。

■ 系统需要复杂的通信协议。

3.1.2 RFC简介

RFC(Remote Function Call)是SAP系统和其他(SAP或非SAP)系统间的一个重要而

常用的双向接口技术,也被视为SAP与外部通信的基本协议。RFC是SAP基于国际标准CPI-C

之上修改开发的一种SAP专用通信协议,用于在不同系统间进行功能调用。简单地说,RFC

过程就是系统调用当前系统外的程序模块,从而实现某个功能的过程,且调用系统和被调用

系统中至少有一个必须是SAP系统。这种远程功能调用也可在同一系统内部进行(如本地SAP

系统内的远程调用);但通常情况下,调用程序和被调用程序处于不同系统。

在多系统、多Client、多公司的环境下,通常要使用RFC技术。RFC是实现接口的主要

方式之一,不但是一种函数,更是一种数据通信协议,类TCP/IP。

SAP 显然是吃定大集团的管理应用,在大集团通常分散了若干 SAP 应用,可通过 RFC

协议进行连接,主要应用在如下的几个方面:

■ MDM应用:总部MDM做整个集团的主数据编码规划,通过XI+RFC连接自动分发

到各分散服务器。

■ BI 应用:数据仓库系统通过 RFC 从分散的 R/3 应用服务器中抽取数据,做报表分析

和数据挖掘。

■ SLM(Solution Management)应用:SLM通过 RFC 连接各企业,在 SLM 统一登

录,R/3那边设置好RFC用户可自动登录,当然SLM还提供了完善的问题处理流

程跟踪。

3.1.3 ALE简介

ALE是Application Link and Enabling的缩写,是专门为SAP与SAP之间所设计的整合

中间件。IDocs是中介文本(Intermediate Document)的缩写,是SAP提供的系统整合专用的

数据/消息格式,可用于EDI、ALE或导入、导出(XML、ASCII)文件等。ALE从SAP 3.0

版本开始就作为SAP整个应用体系的一部分,为分布式数据交换提供了安全可靠的通信机制。

ALE的设计,原本作为两个SAP流程之间的一种消息传递服务(Messaging Service),使SAP

11 2

第 121 页 / 共 377 页

与SAP业务流程之间的企业数据能够有效的交换,为两个独立的SAP之间提供了系统的整合

服务。不过,随着应用的发展,ALE/IDocs接口机制也已然成为与其他非SAP系统的标准整

合方式。

ALE是工具、程序、数据定义的集合,是为多系统之间的功能实现及数据交互提供的一

种机制。

EDI(Electronic Document Interchange,电子数据交换)其实就是采用标准格式的电子数

据,用于在通信网络中与业务伙伴交换业务文档。EDI 可以理解为按相同的排列放置数据到

一个数据文档中,并按相同的排列解析此文档以得到所需的内容。

EDI 又被叫作无纸化交换,是商业伙伴之间数据交换的一种行业标准,如用户、供应商

等。EDI不同于ALE,ALE主要用于同一机构之间的数据交换,而EDI主要用于公司之间的

数据交换。

IDoc(Intermediate Document,中转文档)一般指具体的IDocs数据/消息格式的文本类型,

它通过ALE 方式来进行交换,而 IDoc提供了 EDI的支持,也可以把 IDoc认为是 EDI的一

个实现。

IDoc 在系统间利用消息(Message)传递,不涉及底层函数调用,IDoc 的处理方式是用

EDI来执行的。

1.数据/消息分配层,主要提供三个关键服务

■ 按数据分配模型决定数据接收者。

■ 消息的过滤和转换。

■ 数据/消息的压缩,以提高传递效率。

2.ALE应用

应用层直接与 SAP 系统接口,生成或从其他系统接收含有路由信息的消息文本IDocs,

包括消息接收者的姓名、要求发送的类型以及对消息进行处理的规则,如图3-2所示。

图3-2

许多大企业把整个SAP系统分布在多个实例(Instance)上,每个实例专注于特定的业务。

例如,工厂中的物料采购在一个本地的实例上进行处理(本地系统),向供应商付款和总账处

理在公司中心实例上处理(中央系统)。分布(Distribute)不是简单的数据分割,而是把数据

分布在多个地点,但同时又能保证数据在整体上的一致性和完整性。分布用到分割技术,但

是分布不是简单的分割。为了保证不同地点的数据的完整性和一致性,不同系统间利用 ALE

进行沟通。

113

第 122 页 / 共 377 页

3.2 SAP R/3 的接口方式

作为目前ERP市场上最为领先的应用系统之一,一直以来,SAP R/3在提供API应用编

程接口和接口工具方面也同样领先于其他 ERP 厂商。ALE/IDocs 是 SAP 公司为 SAP R/3

R4.6C版本所提供的接口机制,目前应用最为广泛。在 R4.0以后的版本中,又添加了技术上

先进的 BAPI。本书作为系列介绍之一,对 ALE/IDocs、RFC、BAPI 以及其他可用的整合方

式进行介绍。

3.2.1 IDOC接口

IDoc是SAP提供系统集成专用的数据/消息格式。它几乎可以传送任何SAP应用数据。

IDocs 以文本字符为基础,因而编制方便。IDoc 中的信息从记录类型上分为控制记录、数据

记录和状态记录。控制记录主要是文本信息,如IDoc类型、发送/接收方信息以及文本标识;

数据记录为管理和实际数据部分;状态记录用来追踪文本传递各点的状态,如状态码、系统

时间、错误标识等。

适用于中间文件的 IDoc 定义格式,是 SAP 企业系统软件的应用程序之间或 SAP 应用

程序与外部程序之间电子数据交换用的标准数据格式。IDoc是SAP的应用程序连接系统的

数据转换工具。IDoc用于数据异步处理:每个IDoc生成独立的文本文件,无须连接中央数

据库,就可以传送给要求数据的工作平台。SAP 的另一个系统业务应用程序接口则用于数

据同步处理。

一个大公司的网络操作环境很可能需要各地分公司的电脑都能与公司的主数据库连接,

这些电脑很可能是用不同的硬件或操作系统平台。因为IDoc对数据进行了压缩,所以它无须

变换格式就能在不同的操作系统上使用。IDoc类型指定不同种类的数据,比如购买订单或发

票,它们可能被划分为更细小的数据种类,即信息类型。更详细的分类意味着一个IDoc类型

只能储存某一特定交易所需的数据,这样既提高了工作效率又降低了资源损耗。在事务处理

过程中,IDoc随时会生成。例如,在运货交易过程中,可能会产生打印货运清单所需数据的

IDoc。客户在 SAP 系统执行完一项交易后,在数据传送过程中和经过 ALE 通信层时,一个

或多个 IDoc 会生成。通信层执行远程功能调用,使用由客户模式规定的端口定义和 RFC 界

面定义。IDoc的接收者可能为R/3、R/2或一些外部系统。

1.IDoc数据传输

ALE的设计结构可以分为三层,即应用层、数据/消息分配层和通信层。通信层是SAP

整合机制的基础,它利用远程函数调用RFC(Remote Function Call)调用SAP系统的函数

模块。

数据/消息分配层,主要提供三个关键服务:

■ 按数据分配模型决定数据接收者。

■ 消息的过滤和转换。

■ 数据/消息的压缩,以提高传递效率。

应用层直接与 SAP 系统接口,生成或从其他系统接收含有路由信息的消息文本IDocs,

包括消息接收者的姓名,要求发送的类型以及对消息进行处理的规则。

11 4

第 123 页 / 共 377 页

ALE的机制代替了原来的SAP所提供的批数据通信BDC(Batch Data Communication)

方式。顾名思义,BDC为系统之间提供了简单的数据批处理服务,还不能作为一种中间件技

术,它没有提供系统之间进行无缝整合所要求的纠错功能、系统管理和其他安全措施。总体

说来,应用SAP的ALE机制进行SAP与SAP或非SAP系统整合有以下几个好处:

1)ALE技术不受SAP版本升级的影响,它提供了版本向后兼容性。ALE定义于SAP应

用层,与SAP的逻辑层相对独立,整个ALE中间件独立于发送和接收系统。

2)ALE消息设计逻辑保证“一次且只有一次”的消息传递。ALE采用“存储-发送”技

术确保消息可以在系统发生故障或接收方没有准备接收的情况下也可以到达目的地。这样就

保证接收方不至于收到重复消息。

3)ALE也提供了IDocs管理功能,主要有文本缩减、文本版本控制以及文本数据过滤。

这三种控制机制使得SAP开发人员可以根据实际需要对IDocs文本在运行中进行动态处理。

4)ALE还提供了系统管理功能,允许对ALE系统进行启动、复位、恢复等系统操作,

为开发人员提供了进一步的管理控制。

IDocs几乎可以传带任何SAP应用的数据,是一种“外围”定义格式,与SAP的应用数

据定义不直接相关。IDocs 已经广泛应用于早期的 SAP-EDI 的数据交换,因而它的设计有点

类似于EDI的标准,即EDIFACT标准。

IDocs是以字符为基础的,因而是可读的。它有三种记录类型,即:

■ 控制纪录:含文本信息,如IDoc类型、发送/接收方信息以及文本标识。

■ 数据纪录:含管理和实际数据部分。

■ 状态纪录:用来追踪文本传递各点的状态,如状态码、系统时间、错误标识等。

2.ALE/IDocs的消息发送接收过程

EDI的交换有两个流程:

■ 外发(Outbound process 或简称 OP)。

■ 接收(Inbound process 或简称 IP)。

图3-3

115

第 124 页 / 共 377 页

SAP 也是完全遵循着 EDI 的这两个流程,并做了相应的实现。下面对 ALE/IDocs 在系

统整合过程中消息的实际传递进行介绍。

■ IDocs发送过程

一个发送过程由事件触发、文本生成、数据打包以及交由传输媒介传递这四个步骤组成,

具体如下:

● 应用层:生成应用数据,应用系统事件触发。

通过应用模块的消息控制间接传送到IDoc接口,系统目标(Objects)的状态变化、用户

自主活动或其他数据库特定变化等可以启动数据表的触发程序,从而进行数据传递的初始化

工作,如数据准备。

● ALE层:创建出站IDoc,生成主IDoc文本(Master)。

按标准格式生成主IDoc文件,包含所有可以传递的数据(不分接收者)。

● IDoc从SAP传送到操作系统。

按照准格式生成主IDoc文件被发送到操作系统层。

● 通信层:寻找伙伴和端口生成通信Idoc。

从主IDoc中生成只与特定接收者有关的文本,通信文本是主文本的子数据集(Subset)。

● IDoc 发送

利用异步通信方式将一定版本的IDoc传递到接收方。EDI 文件被传送到业务伙伴处(所

以业务伙伴可以没有SAP系统,因为EDI是个标准)。

直接从应用发送到 IDoc 接口,这些处理主要是通过以下函数控制 IDocs 接收过程,如

图 3-4所示:

● 标准IDoc:MASTER_IDOC_DISTRIBUTE/COMMUNICATION_IDOC_CREATE

● 自定义IDoc:L_IDOC_SEND/L_IDOC_SEGMENT_CREATE/L_IDOC_HEADER_CREATE

图3-4

接收过程始于SAP系统从外部收到IDoc文本。它的优点在于接收方既可以是SAP系统,

也可以是第三方系统,这也是SAP与第三方进行有效整合的基础。接收过程由以下四个步骤

组成:

● ALE层:创建入站IDoc并通过伙伴参数文件查找IDoc处理类型,存储Idoc。

将文本存储于数据库,并进行语法校验。

● ALE层:创建入站IDoc并通过伙伴参数文件查找IDoc处理类型。

一个专门设计的IDoc处理程序读取IDoc并产生SAP或其他系统所需的系统消息。多个

程序可以同时运行。

● IDoc传送到SAP层。

被处理后的IDoc被传送到SAP系统应用层。

11 6

第 125 页 / 共 377 页

● 应用层:写入文档,生成系统文本。

处理程序进一步生成系统文本供系统使用,并将结果信息存于IDoc的状态纪录中。

图3-5

3.IDoc的特性

每个 IDoc 都被分派了唯一的号码,用于跟踪及以后参考所用。IDoc 包含多个段

(Segment),而段内包含有多个字段。IDoc包含有三种类型的记录:一条控制记录,一条或多

条数据记录,一条或多条状态记录。

4.端口(Port)

端口用于外发流程,它判断EDI子系统程序名称、IDoc文件传送到操作系统的目录,

IDoc文件名和RFC目的地。RFC目的地用于定义远程系统通信连接的特性以及需要调用何

种功能。

5.Partner Profile

Partner Profile指定在外发过程中所用的各类组件(业务伙伴号、IDoc类型、信息类型、

端口、处理码等),通信方式(异步或同步)以及当出现错误时通知何人。

6.IDoc的结构

作为一种传输媒介,IDoc文件的结构包含特定的格式,如

图3-6所示。

IDoc结构包括一条控制记录、一条或多条数据记录以及一

条或多条状态记录。控制记录(Control Record)也叫IDoc头,

里面包括 IDoc 的发送者、接收者等信息。数据记录(Data

图3-6

Record)中包括具体的数据信息,比如一个订单的数据信息。

状态记录(Status Record)记录IDoc从应用到其送达方的当前状态信息,如“已创建”“准备

发送”等,是对IDoc进行控制的重要信息。

■ 控制记录(Control Record)

每个IDoc的Control Record可以认为是文件头,它包含发送及接收端、IDoc ID、发送日

期等信息,当IDoc被触发时,SAP会首先检查这些信息是否正确,如图3-7所示。

■ 数据记录(Data Record)

多个数据段(Segment)组成的一个层次结构,装载传输的数据,且每个数据段不能超过

1000个字符。当发送或接收这些IDoc时,数据将会被解析到这些特定层级关系的数据段中,

如图3-8所示。

■ 状态记录(Status Record)

用来记录 IDoc 从发送方到接收方的历史状态信息。通常,如果是自行开发的 IDoc,可

以在处理IDoc逻辑的函数中加入自己定义的状态,以此满足不同的需求,如图3-9所示。

注:状态信息由状态维护事务(WE47)维护。

117

第 126 页 / 共 377 页

图3-7

图3-8 图3-9

7.IDoc类型

IDoc 类型是 IDoc 文件的结构定义和说明。在 SAP 中,不同的业务对象有不同的 IDoc

类型,这些类型可以根据不同的传输格式或数据要求多个并存,如图3-10所示。

图3-10

11 8

第 127 页 / 共 377 页

注:IDoc类型由事务(WE30)维护。

图3-10中的示例是自定义委外加工BOM的IDoc类型定义:

E1STZUM:委外BOM的Header资料。

E1STPOM:委外BOM的Item资料。

E1CUKBM等:每个Item的装配组件资料。

8.消息类型(Message Type)

消息类型是指IDoc类型的视图,一个消息类型可以包含多个IDoc类型。

注:消息类型由事务(WE81和WE82)维护。

事务WE81用于定义消息类型。

事务WE82用于分配IDoc 类型给消息类型和不同IDoc版本(Release)。

9.数据段(Segment)

数据段是 IDoc 的结构组件,这些数据段包含特定的数据类型,每个字段可以参照 SAP

数据字典,也可以自定义字段,保存后系统自动创建版本号,如图3-11所示。

图3-11

维护数据段事务WE31。

注:IDoc是基于SAP中类似XML格式的文档进行数据交换的方式。RFC则用于在线的

方式调用,一般做同步的处理,IDoc基于文档,可以实现异步的处理。

IDoc可以理解为是SAP为了同外部系统或内部不同Client通信所采用的一种数据结构,

不同的 IDoc 类型定义了不同的格式,如关于物料主数据的IDoc,BOM、采购订单、销售订

单等相关的IDoc;ALE 主要用于内部数据交换,如不同Client;EDI用于同外部系统的交换

数据。它们的本质都是基于IDoc。

3.2.2 RFC接口

RFC(Romote Function Call:远程函数调用)是SAP系统和其他(SAP或非SAP)系统

间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议。简单地说,RFC

过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统

中至少有一个必须是SAP ABAP系统。这种远程函数调用也可在同一系统内部进行(如本地

SAP系统内的远程调用),但通常情况下,调用程序和被调用程序处于不同系统。

119

返回ABAP参考资料列表