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

第 128 页 / 共 377 页

RFC 既是一种接口对象,也是一种特殊的函数模块,可以用 RFC 去调用 SAP 系统里面

的ABAP Function和外部系统的服务程序。但要实现这种功能必须要有一个RFC Destination。

SAP系统RFC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客

户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或

打印。外部RFC调用的模型如图3-12所示。

图3-12

1.RFC的特点

■ RFC是基于CPI-C的一种SAP接口协议,它大大简化了系统之间的程序交换过程。

■ RFC能自动进行数据传输,当在本地系统相互调用时,则RFC相当于一般的函数模型。

■ 可以自动登录到与 SAP 相关联的系统,通过设置 RFCDES 先链接外部系统,这时用

户名和密码被保存在RFCDES表中(事务代码为SM59)。

■ 能管理数据的交换过程,参数传输和错误处理。

■ 可以进行远程调试。

■ 有RFC生成器(RFC Generator)。

■ RFC函数必须为Remote-Enabled Module,同时Change Parameter不可用。

■ SAP公司提供RFC library(RFC-SDK)为目前所有的外部平台,当外部平台安装完成

后,RFC客户或RFC服务器程序就可以通过这个RFC函数调用外部程序了。

优点:SAP的RFC调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,

特别适合用于外部报表开发。

缺点:但对于大数据量的查询效率相对较低,一般大数据量开发大多使用 IDoc 和 BAPI

接口开发技术。

2.RFC技术应用

如上所说RFC(Remote Function Call)远程函数调用,是SAP系统之间以及SAP与外部

系统之间通信的基本接口技术,其过程就是系统调用当前系统外的程序模块,从而实现某个

功能,而且调用系统和被调用系统中至少有一个必须是SAP系统。

12 0

第 129 页 / 共 377 页

(1)SAP 外部接口

● 程序通信接口

● 文件I/O接口

● 数据接口

程序通信接口和文件 I/O 接口是与其他系统进行数据交换的通路,数据接口用来实现

BDC和SAP SQL。

(2)RFC的调用过程

■ 在系统间通信过程中,需要区分发送系统和接受系统。

■ RFC 调用请求从发送系统中传至接收系统,发送请求的系统在通信过程中称为 RFC

客户端,通信另一方则称为RFC服务器。

■ RFC客户端发起远程函数调用以执行RFC服务器提供的功能。

■ 调用系统和被调用系统均可以是SAP系统或非SAP系统。

(3)RFC通信方式(如图3-13所示)

图3-13

■ 两个独立的SAP系统之间通信。

■ SAP系统作为调用系统,与外部远程系统(非SAP ABAP系统)通信。

■ 外部系统作为调用系统,与SAP系统通信。在SAP系统之间,两个ABAP程序通过

RFC接口进行通信。

■ 系统A调用SAP系统B中的功能模块。

■ B 系统中被调用的 SAP 功能模块必须支持远程调用,该 SAP 功能模块称为远程函数

模块。

在与其他语言的程序进行通信时,SAP 将为各种语言及相关的操作系统提供 RFC 库及

SAP连接器,以实现RFC接口,如:

121

第 130 页 / 共 377 页

■ 为C和C++提供的RFC SDK。

■ 为Java 提供的Java连接器 JCo。

■ 为.NET提供的.NET连接器 NCo。

SAP调用远程功能的能力是通过RFC接口系统(RFC Interface System)实现的。

(4)RFC接口提供以下两种服务

■ ABAP程序的调用接口。

CALL FUNCTION . . . DESTINATION,若远程功能来自SAP ABAP系统,则函数必须是

实际的函数模块,并支持RFC远程调用。

■ 非SAP ABAP 程序的调用接口。

SAP系统为外部程序提供RFC支持接口和GUI支持接口,这样在非SAP系统中,外部

程序就能调用并执行SAP 远程函数模块,反之亦然。

RFC调用时,RFC接口具体功能包括:

■ 登录并退出远程系统,并进行权限检查。

■ 调用并管理远程系统会话所需的通信进程。

■ 自动将实参转换成远程系统所需的格式,RFC接口支持所有ABAP数据类型。

■ 处理通信过程中的错误。

■ 负责远程调试的实现。

(5)RFC通信模式

■ 同步通信,双方时钟允许误差较小,一次性功能调用。

■ 异步通信,双方时钟允许存在一定误差。

■ 差异在于调用系统是否需要立即接收返回结果。

SAP系统中的RFC过程扩展有以下几种不同模式:

■ 同步RFC。

■ 异步RFC。

■ 事务性RFC,广义上也属于异步通信模式。

■ 队列RFC,对事务性RFC功能的进一步扩展。

■ 并行RFC,实际上是异步RFC。

(6)支持远程调用的函数模块

■ 在创建远程函数模块时,需要在指定属性中的 Processing Type 选项设定为 Remote-

Enabled Module。

■ 声明参数时,不能在运行时确定参数类型,必须在参数定义时参照数据字典类型进行

声明。

■ 必须指定为值传(Pass Value),对于表类型参数,系统也隐式进行值传递。

■ 格式转换,若传入参数的长度较短,RFC将在后面补充空格。这意味着对于字符类型

数据,长度可以不必完全一致,但是调用方实参不应大于被调用方形参定义的长度。

■ 异常处理,可在远程函数中进行异常的抛出,在程序中的异常出现之处通过raise语句

实现,但是基于ABAP类的异常不能从远程函数调用过程中抛回给调用系统,因此需

要避免使用。

■ RFC接口预设的系统异常类型:

12 2

第 131 页 / 共 377 页

● SYSTEM_FAILURE,报告远程系统中的所有失败和系统问题。

● COMMUNICATION_FAILURE,若不能建立或通信中连接中断,抛出异常。

● 系统将自动抛出以上 2 种异常,不必在程序代码中进行显示处理,调用 RFC 功能

时必须接收,否则出现异常时可能引起系统运行时SHORT DUMP中断,所有其他

不可知类型的异常指定为OTHERS类型。

调用SAP标准远程功能:

■ 函数模块的调用通过Call Function语句实现,远程函数调用,可通过在Call Function

语句中添加Destination子句完成。

■ Destination后面接的是远程目标名称,该目标在SM59中设定。

■ 可以在远程调用时直接指定当前系统的应用服务器作为 RFC 目标,格式为

<hostname>_<sysid>_<sysnr>。其中<hostname>为主机名,<sysid>为 SAP 系统名,

<sysnr>为系统编号。

■ 通过SM51查看当前SAP系统中活动的应用服务器。例如,调用SAP 标准远程函数

模块:SXPG_COMMAND_EXECUTE,通过RFC调用时可以运行本地或其他SAP系

统中的外部命令。

3.RFC的类型

按照RFC的调用方式来分,有下面五种类别:

(1)sRFC:同步的RFC(synchronous RFC)

sRFC 是 RFC 的第一个版本,它要求连接的双方是同步的工作方式,即都是在可用状态

才能够实现成功调用。

(2)aRFC:异步的RFC(Asynchronous RFC)

aRFC 这种 RFC 可以实现异步的 RFC 调用方式,它可以进行多个并发调用,并且不

要求被调用系统为可用状态。发出调用系统会一直尝试直到获得被调用系统的应答。它通

常用于需要提高系统并行调用多个 RFC 的效率时,相对于强制等待程序的结果,它的效

率更高。

(3)tRFC:事务RFC(transaction RFC)

tRFC是对aRFC进行相关技术改进后的一个RFC版本,它与aRFC的相同点是实现异步

调用,其优点是可以将多个调用进行LUW分组处理,并只执行一次运行。现在aRFC基本上

已经停用。

(4)qRFC:队列RFC(quene RFC)

qRFC是tRFC的一个增强版本,它保证了所传输数据的处理次序。

(5)pRFC:队列RFC(parallel RFC)

pRFC 是一种特殊的 RFC,它是 aRFC 的一种扩展类型。因为它改善了系统在执行大量

aRFC 时的性能。SAP 使用它在 MRP 里提高速度,但是它只能执行在同一个系统或同一个

Client里。

举两个实际的例子:

例子1,总公司A和分公司C、D、E,某分公司找到新的客户或者客户信息更改时,分

公司在本公司系统进行操作,操作完毕后数据通过RFC接口更新到总公司系统内,实现信息

共享和同步。

123

第 132 页 / 共 377 页

例子 2,同样是前面的公司结构,总公司 A 需要对某供应商进行锁定停用或者删除,在

A公司系统进行操作,操作完成后触发某个远程函数模块(Remote Function Module)将操作

同样应用到分公司的系统里,这样总公司锁了的供应商,分公司不能再向它下单了。

4.RFC的原理

(1)同步RFC

若使用sRFC,程序就会被同步执行,即主程序会一直等到被sRFC调用的程序执行完毕并

返回后,才继续往下执行。这样对不同系统之间的数据共享有比较高的安全性,但在程序执行

的效率比较低。若 sRFC 是发生在两个不同的R/3 系统之间,那么可以在主程序那里调试正在

运行的远程的被调用程序。还有,在R/3系统间的RFC里,所有的会话(Dialogs)都会被显示

在原调用程序里,如图3-14所示。

图3-14

(2)异步RFC

若使用aRFC,可以并行执行程序,程序的执行效率比较高,但是数据共享的安全性比较

低。因为使用 aRFC 时,被调用的函数可以随时返回数据到原调用程序中,所以原调用程序

必须要保持在“Active”状态,直到被调用函数返回为止。并且,当使用aRFC时,系统需要

保证足够的资源为其他进程服务,如图3-15所示。

图3-15

注:同步和异步的区别

12 4

第 133 页 / 共 377 页

■ 同步:提交请求→等待服务器处理→处理完毕返回。这个期间客户端浏览器不能做任

何事,如普通B/S模式。

■ 异步:请求通过事件触发→服务器处理(这时浏览器仍然可以做其他事情)→处理完

毕,如AJAX技术。

(3)事务RFC

tRFC是sRFC和aRFC的优点和缺点的折中。tRFC可以把在同一个Destination里的几个

函数模块结合在一个单一的逻辑事物单元(Logic Unite of Work)里,然后用事务代码SM58

去管理tRFC-LUWs。

在tRFC中,利用自动回滚机制,远程地去处理在同一个LUW里的几个函数模块。而且,

tRFC能够保证被调用的函数模块被执行,即使在该函数模块所在的系统不能被得到的时候。

实现事务 RFC 必须在 DESTINATION 'NAME'这个语句之前加入 IN BACKGROUND

TASK,而且最后COMMIT WORK 绑定成一个LUW发送,如图3-16所示。

图3-16

tRFC与sRFC和aRFC的不同之处在于远程函数不会返回数据给程序,但可以用事务代

码SM58去显示或处理(Delect and Execute)有错误或不能被执行的tRFC-LUWs。

(4)队列RFC

实际上,qRFC是把tRFC-LUWs连续成一个队列,并能够保证tRFC-LUWs按照它们生

成时的队列顺序被进行处理。这个队列的属性和 tRFC 输入的数据被保存到队列表

TRFCCOUT和tRFC tables ARFCSSTATE/ARFCSDATA里。可以用事务代码SMQ1去显示和

维护这些信息。在Call Function 'NAME' 后加上 Exporting Qname = ' NAME '实现队列RFC,

如图3-17、3-18所示。

5.RFC的维护

为了远程调用函数模块,必须要一个进入表RFCDES的入口。因为RFC远程目的地的信

息是在表FRCDES里进行维护的,如图3-19所示。

125

第 134 页 / 共 377 页

图3-17

图3-18

其事务代码是SM59,如图3-20所示。

(1)RFC Destination主要包括:

■ 类型2:R/2连接。

■ 类型3:ABAP连接或R/3连接,指定主机名和通信服务。

■ 类型I:内部连接,与当前系统连接到同一ABAP系统中,预定义无法修改,与SM51

中所显示的应用服务器名相同。

■ 类型L:逻辑目标,通常工作流系统指定过程中配置的RFC目标即为该类型的逻辑

目标。

■ 类型X:指定安装了特殊ABAP设备驱动程序的系统,必须制定ABAP设备驱动程

序名。

■ 类型S:通过SNA或APPC启动的外部程序连接。

■ 类型M:通过CMC到ABAP系统的异步RFC连接。

12 6

第 135 页 / 共 377 页

图3-19

图3-20

■ 类型T:通过TCP/IP并使用RFC库或SAP连接器的外部程序连接;分为启动(指定

主机名、程序路径名)和注册(RFC服务器程序)两种连接模式。

■ 类型G:定义外部系统到本地HTTP连接。

■ 类型H:定义ABAP系统到本地的HTTP连接。

(2)三种通用的有特殊意义的Destination:

■ Destination 'BACK':是在两个不同的R/3系统之间使用RFC,如果在被调用的系统的

程序里使用了“Destination 'BACK'”的话,那么程序执行到这里就会返回到原调用的

系统程序中去。

■ Destination 'SPACE':是本地调用。

■ Destination 'NONE':是表示调用通过Gateway翻译后,又回到了本地,如图3-21所

示。(旧的RFC使用SAP CPI-C协议,必须通过SAP Gateway进行翻译,新的Fast RFC

则不需要使用CPI-C协议。)

(3)SAP ABAP 系统间的RFC实现(通过Remote Function Module实现)

■ 远程调用函数

远程目标可以是文字或变量,其值为与SAP系统中一致的远程目标系统。若远程系统是

当前系统中的SAP应用服务器,也可以直接指定应用服务器名称,如SM59中的I类型目标。

127

第 136 页 / 共 377 页

图3-21

SM59 定义的 RFC 目标是区分大小写的。Destination 附加项中目标变量的值必须与其完

全一致。

■ 通过CALL FUNCTION语句进行远程功能调用时,可形成不同的调用模式:

● CALL FUNCTION DESTINATION 以同步RFC方式实现远程函数调用,若后面无

其他附加项,则形成同步远程函数调用,调用程序等待远程调用结果以继续执行。

● CALL FUNCTION STARTING NEW TASK 以异步RFC方式实现远程函数调用,调

用程序不等待远程调用结果继续执行,结果将在回调子程序(CallBack SubRoutine)

中接收。

● CALL FUNCTION IN BACKROUND TASK 以事务性RFC方式实现远程函数模块

调用,远程功能暂不开始执行,等待COMMIT WORK 语句出现时,一次性执行一

个或多个远程功能。

■ 远程函数参数处理

远程功能调用时,仅允许通过值传递参数,不能进行引用传递,因为在RFC过程中,可

以传递参数,并返回结果,但不能改变调用程序的上下文。

对表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,

但RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之

间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表。

RFC 使用 delta 管理机制最小化参数和结果传递构成中的网络负载,delta 的意思就是只

传递已经变化的数据。

■ RFC上下文

SAP 程序本地正常情况调用功能模块是将在调用程序的工作过程内部运行(Work

Process),但是系统调用远程函数模块时,系统将在独立的工作进程中运行该模块。通过RFC

接口进行的所有远程功能调用都在目标系统中存在一个独立的 RFC 上下文,即该 RFC 内存

滚动区(Roll Area)。

执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序

12 8

第 137 页 / 共 377 页

上下文的会话,即功能模块的主程序(或非ABAP的RFC服务器程序)。

一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调

用程序结束。

目标为非SAP系统时,该功能通过RFC库中的API实现(RFCAbort或RFCClose),或

通过功能模块RFC_CONNECTION_CLOSE显示关闭RFC连接。

■ 远程函数调用中的LUM和隐式数据库提交

SAP存在特定的数据库提交和回滚机制,该机制就是通过LUM(逻辑工作单元)实现的。

通常情况下的功能模块和主程序位于相同的LUM中,因此不会触发数据库提交或回滚的过程

(该过程通常通过COMMIT/ROLLBACK语句显示触发)。但同步RFC和异步RFC调用中的

每一个功能模块都拥有自己的LUM,即在每次远程调用时,当前程序都将进行内存区的释放,

因此将触发隐式的数据库提交,之前的所有数据库更新将不能回滚,对于事务性 RFC,则有

关机制将多个远程调用操作绑定至同一个LUM,整体提交或回滚。

■ 远程函数调用中的对话处理

对于同步RFC和异步RFC调用,可以存在对话dialog过程,例如call screen / call transaction

或列表处理等情况,RFC可以进行后台处理,但如果在后台中心处理RFC中的对话,则将导

致程序中断,从而触发系统异常SYSTEM_FAILURE。

在进行ABAP-ABAP同步RFC和异步RFC调用时,可以进行调试以监控远程系统中RFC

功能执行的情况,可以设置静态断点、单步执行、观察变量等功能,对于同步 RFC,系统在

当前会话中进入远程调式界面,对于异步RFC,系统将打开新会话进行远程调试。

■ RFC与Unicode

Unicode 是一种编码体系,建立在 Unicode 编码体系上的系统称为 Unicode 系统,在

Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换

相关的问题。

■ 同步RFC方式的远程函数调用

同步RFC要求远程系统在调用时可用,调用程序的处理暂停,并等待远程函数调用的返

回结果再继续。

对于表类型参数,只有扁平结构内表可以被传输,其他类型参数可以用于传输纵深类型

以及 STRING 类型的数据,将内表通过 tables 参数进行传输将获取较快的传输速度,因为系

统内部通过的二进制格式而不是XML格式进行传输。

(4)外部程序调用RFC

■ RFC-SDK(Software Development Kit)必须要安装在外部平台上。

■ 可以用一个外部的RFC客户端程序去调用R/3系统里的函数模块。

■ 可以从ABAP程序里调用C程序(这个程序里带有一个已经被声明为远程的RFC服

务程序)。

■ 在SAP系统里,RFC生成器可以生成一个虚拟的Function Module的C程序文件集合。

这些文件被外部的RFC客户端和服务器端使用,如图3-22所示。

(5)RFC的安全性问题

■ 用 RFC 去开始一个 Function Module,那么在目的系统里面,RFC 登录用户要为

Objects_RFC认证提供一个相应的认证信息。

129

第 138 页 / 共 377 页

图3-22

■ 在两个SAP系统之间,因为存在一种可信关系,在资源系统里特殊的用户可以使用用

户释放功能,而不用password就能登录到目标系统的RFC里,如图3-23所示。

图3-23

■ 在目标系统里释放一个用户,你需要给认证对象S_RFCACL一个认证。

3.2.3 BAPI接口

BAPI是Business Application Programming Interface的缩写,是SAP为3.0版本以上提供

的基于企业目标(Business Object)技术的接口应用界面。

BAPI 是一个标准化的开放接口。它是 SAP 提供给用户的一些标准函数,比如创建销售

订单的函数,只要给定相应的参数,就可以实现特定的功能。它也克服了很多BDC存在的固

有缺陷。

SAP创建了业务框架,让SAP组件之间以及SAP和非SAP组件之间能够实现技术集成

和交换业务数据。业务框架的一个主要组件就是业务应用程序接口(BAPI),它能够表示出

组件边界的可视化接口,而属性则把组件集成在一起。

这种集成可以包含本地网络内的组件或者通过互联网相互连接的组件。BAPI允许在业务

13 0

第 139 页 / 共 377 页

层的集成,而不是技术层。这为连接提供了非常好的可伸缩性和对于未知通信技术的独立性。

SAP R/3业务框架提供了一个基于R/3中功能性应用组件(业务组件)和对象模型的结构。

业务框架允许客户和合作伙伴把组件连接到 R/3 系统。面向对象技术和对象模型的使用降低

了整个系统的复杂性。

业务框架架构提供了开发 SAP 业务组件的基础,集成和通信架构可以表示如图 3-24

所示。

图3-24

■ 业务组件

SAP 业务组件提供了自主的业务功能和一致的业务对象。例如,业务对象 Employee 和

Applicant被分配给业务组件Human Resource。业务处理或者在业务组件内部实现,或者跨多

个组件实现(分布式业务处理)。

■ 业务对象

R/3系统面向对象的结构基于业务对象。它们封装了业务数据和功能,并且定义了业务组

件的功能范围和边界。

■ 业务应用开发接口(BAPI)

BAPI 是业务对象的接口,BAPI 跟业务对象一起从业务层定义和说明了接口标准。

■ 集成服务(Application Link Enable)

ALE 集成服务允许业务处理在不同 R/3 系统或非 R/3 系统上执行的集成。这个使用了

ALE分布式模型的服务基于业务对象在系统范围上的分布。

■ 通信服务

通讯技术,如分布式组件对象模型(DCOM)和远程函数调用(RFC),它们使用业务框

架来访问 BAPI。

1.SAP业务对象

业务对象技术和业务对象编程都基于业务对象的概念。例如,真实世界的对象,一个员

工或者一份销售订单,在业务应用系统(如 R/3 系统)中都被模型化为业务对象。建模过程

从定义业务对象类型开始。

业务对象类型在SAP R/3系统中表示一个业务实体,包含了这个实体的功能(以方法的

形式出现)和数据(以属性的形式出现)。业务对象类型的实现细节则对用户隐藏了,业务对

象类型通过已经定义好的功能(方法)来访问,这就被称为封装。

业务对象类型用来把SAP R/3系统拆分成小的特定单元。由于降低了复杂性,系统的结

构也因而改善了。

业务对象类型构成了SAP R/3系统的数据和功能的入口。在业务对象类型层,非SAP系

131

第 140 页 / 共 377 页

统和各种SAP业务组件都可以互相通讯。

一个业务对象类型应该可以理解为一个业务概念和它在SAP R/3系统中的实现概念。业

务对象类型这个术语对应面向对象编程语言中的术语——类。

业务对象类型的某个特定发生的事件,例如实际存储在系统中的一个销售订单,必须要

跟业务对象类型本身区分开。这个特定发生的事件被称作一个实例(面向对象编程语言中的

常规术语)或者一个业务对象。

2.业务对象类型的结构

图3-25描绘了业务对象类型的概念。

图3-25

业务对象类型的核心描述了内部对象结构,换句话说就是它的数据和这些数据的结构。约

束是确保一个对象一致性的规则(例如,对于不同的最低销售数量可以分配不同的价格条件)。

业务规则要求一个对象必须遵守基本规则,确保对象在它的环境中保持内在的一致性(例

如,一个销售组织只能销售给存在业务关系信息的客户)。接口提供了访问业务对象类型的预

定义方法,它们可以是公共属性、方法/BAPIA或事件。

对象可以通过 COM/DCOM 或者 CORBA(通用对象请求代理架构)来访问。在 ABAP

应用中,业务对象可以被远程函数调用(RFC)访问。

3.定义和实现一个对象类型

业务对象类型在业务对象知识库(BOR)中描述,其特性如图3-26所示。

■ 基本数据

包含有助于记忆的对象名字,对象类型的技术名称、名称(有意义的说明)、短描述、发

布状态、默认方法、默认属性,以及它的实现的程序名。

■ 接口

提供了一个对象预定义的接口(属性、方法、事件),接口类型通常不包含实现。

■ 键字段

只标识唯一一个对象。

■ 属性

表现对象的性质和特征。

■ 方法

13 2

第 141 页 / 共 377 页

封装了R/3的功能,可以是同步或异步方法。

图3-26

■ 事件

预示业务对象状态改变的事件。

■ 业务对象键字段

每个业务对象类型都有一个或多个键字段。每个实例有一个唯一的键字段的值组合,由

键字段中的特定值来标识。这种唯一的值组合机制就能让通过键字段中的值访问一个特定的

业务对象类型的实例成为可能。键字段在业务对象设计时是需要重点考虑的。

大多数情况下,对象类型的键字段也是包含了业务对象类型的表头数据表的键字段。因

为BOR运行时对象是客户端相关的,所以客户端可以不作为一个键字段。

4.业务应用程序接口

业务应用编程接口(BAPI)允许通过形式化、稳定并且无须交互的接口来访问SAP的函

数。这些接口可以被由客户和其他软件合作伙伴开发的外部应用所使用,也可以被其他 SAP

应用使用。

BAPI是为业务应用系统精确定义的处理和数据的接口,它作为业务对象知识库(BOR)

中的对象的接口来实现。

BAPI定义成SAP 业务对象类型的API方法。这些对象类型在业务框架中使用,允许组

件之间基于对象通信。业务对象和它们的 BAPI 让面向对象可以在公司的中心信息处理中被

使用,例如,现存的函数和数据都能被重用,可以达到无障碍的技术协同工作能力,并且可

以实现非SAP组件。

(1)基本特征

由于 BAPI 作为 R/3 系统的标准接口,它们需要特定的标准、认同和可依赖的特征。在

任何开发BAPI的时候都必须考虑如下特征:

■ 面向对象:BAPI作为在业务对象知识库中定义的业务对象的对象方法来实现。

■ 稳定的接口:BAPI的接口是固定的。

■ 内部和外部使用:BAPI既可以从R/3内部使用,也可以从外部系统调用。

■ 无表示层:BAPI 不提供用户接口功能,显示请求的结果是调用者的职责。

■ 为消息使用参数:成功和错误消息在RETURN参数中处理。这可以是个结构或是表,

133

第 142 页 / 共 377 页

由BAPI来决定。

(2)集成

BAPI可以用于下列集成类型:

■ 使用SAP业务连接器或者互联网应用组件(IAC)把R/3连接到互联网上。

■ BAPI还允许创建真实组件软件,只要它们允许SAP组件间的标准通信。最终目标是

把SAP系统的功能封装到通过通用接口(BAPI)集成的独立业务组件中。

■ 新的SAP组件、非SAP软件和遗留系统的集成。

■ 实现使用应用连接使能(ALE)异步连接的分布式 R/3 场景。

■ 使用 PC 程序做为 R/3 系统的前台,这可以用 Visual Baisc(Microsoft)或者 Visual

Age for Java(IBM)来开发。

■ 扩展超越系统边界的工作流应用。

■ 客户和合作伙伴的自主开发。

(3)集成和可用性目标

当实现 BAPI 时,应该尽量避免以往接口的明信片效应的缺点,即不区分内容和传输。

在明信片中,文本写在卡片上,而卡片还充当了信息媒介。如果信息媒介改变了,接收者就

会以不同的方式读到文本。这样的结果是,对接口的更改会影响对类型的访问。

在 BAPI 里,清晰地把业务内容与潜在的通信技术区分开来。这个过程可以跟一封在信

封中的信来比较:把一封信放到一个新信封里非常容易,同样的,使用一个新的或不同的通

信技术,如 COM/DCOM、CORBA 标准或新的互联网标准时也同样容易。信封本身与理解

新的内容并不相关。在这个例子中,BAPI 相当于信,也就是说它们与程序语言和通信机制

都完全无关。

(4)通信

■ 为了保证它们在任何情形下都能使用,BAPI 必须支持所有通信形式并能被所有类型

的参与者使用。

■ 支持同步和异步通信。

● BAPI 可以对 SAP 组件进行同步或异步调用。如果调用是同步的,BAPI 就被作

为远程函数调用(RFC)。当 BAPI 在发送者系统被调用,就生成一个 IDoc 并分

配给接收者系统。当 IDoc 到达接收者,相应 BAPI 的参数就会用 IDoc 数据自

动填充,BAPI 再同步调用。

■ 支持机器到机器和人到机器的通信。

■ BAPI 可以用在应用系统集成和连接到各种前端上。

● 应用系统的集成可以称为机器到机器的通信,它在交换大量数据和需要很高系统性

能时使用。这种情况下的 BAPI 应用将提供很少的细节信息。

● 各种前端的集成是人到机器的通信。这时的 BAPI 使用有很多的细节,它们必须

设计为允许更灵活的通信以减少错误。

■ 对组件的通信支持被精确连接并通过互联网连接。

● 除了在 CORBA 和 COM/DCOM 这样的通信技术下使用 BAPI 外,它还可以通

过 SAP 业务连接器在互联网上被访问。业务连接器从 BAPI 调用生成 XML,或

者传递一个内含的 XML 文档到 BAPI 调用中。这可以把 BAPI 调用分配成为

13 4

第 143 页 / 共 377 页

XML 文档,允许通过互联网连接的组件之间的通信。

(5)优点

使用BAPI 具有如下优点:

■ BAPI 表现为良好定义、内部一致的单元,总是表示业务事实,并且隐藏的数据库状

态一致。

■ 业务内容可以被标准化,因为 BAPI 不仅在技术层面上允许 SAP 系统和其他软件的

集成,也在业务层面实现了集成。

■ BAPI 已经成为业务系统间的通信标准,通过面向对象接口技术(例如 COM/DCOM)

的访问已经成为可能。SAP对象遵守 OAG(Object Application Group)的方针,并且

适合于 OMG(Object Management Group)的 CORBA 标准。

■ 当 SAP 发布 BAPI 时能够保证其稳定性和兼容性。它的接口定义和参数将长期保持

不变,这意味着应用程序即使在 SAP 软件或数据发生更改时也不受影响。如果给

BAPI 添加了向上兼容的增强,现存应用的稳定性也不受影响。

■ BAPI 可以支持开放系统,能被任何的开发平台访问。BAPI 是外部系统对 SAP 标准

业务进行调用的一种方式,当外部系统有对SAP标准业务关联较紧密的功能性开发调

用时较适合。

总之、BAPI 是访问 R/3 中业务对象与业务过程的标准编程接口,在 BAPI 定义了 BOR

中业务对象的方法,通过RFC-Enable的函数模块实现,用户可以自行开发新的BAPI以满足

业务需求。BAPI 是 SAP 提供的基于业务对象的函数,它处理的对象是 R/3 的业务相关

Business Object,比如单据类销售订单、组织、公司等,它们是一系列实体。RFC则是一种系

统间通信的方式(Remote Function Call),但当外部系统与SAP系统间有大数据量的交付,并

且分布广、网络状况较差的情况下不适合。

3.3 ALE/IDoc应用

IDoc是信息系统之间(通常是ERP)进行事务性或数据交换使用的标准数据格式,其中

比较公认的是符合EDI标准的IDoc,个别系统可以用EDI子系统转换为EDI标准来使用。IDoc

应用一般是面向消息的,含有事务性数据、主数据和控制数据处理。

常见的应用如SAP系统之间通过IDoc共享各系统间的主数据,从外部系统接收IDoc更

新事务数据等(一般要求SAP系统间配置信息一致),ALE配置用事务代码:SALE,如图 3-27

所示。

3.3.1 SAP系统间数据传输配置

本例中实现物料数据共享,由一方系统创建物料,通过IDoc发送与接收操作,在另一方

系统中实现共享。

1.定义系统间连接

(1)在接收方系统定义

步骤一:定义发送方与接受方逻辑系统。

按照路径“IDoc接口/启用应用程序链接(ALE)→基本设置→逻辑系统→定义逻辑系

135

第 144 页 / 共 377 页

统”或运行事务代码BD54,添加逻辑系统如图3-28所示。

图3-27

图3-28

如上图所示,逻辑系统ECCCLNT811为接收方用,PRODUCTION为发送方用。

步骤二:定义客户端与逻辑系统之间的对应关系。

运行事务代码SCC4,设定客户端信息如图3-29所示。

图3-29

13 6

第 145 页 / 共 377 页

步骤三:定义RFC调用目标系统,建立连接。

运行事务代码SM59,设定RFC连接信息如图3-30所示。

图3-30

定义接受方RFC连接:填入接收方目标系统名称、IP地址和实例编号。

输入语言、客户端号、用户名和密码,如图3-31所示。

图3-31

137

第 146 页 / 共 377 页

选择“MDMP & Unicode”选项,如图3-32所示。

图3-32

测试连接和权限测试,单击应用工具栏中的 按钮,如图3-33所示。

图3-33

注:此处测试连接时一般要单击 按钮,查看是否能远程登录到对方系统,如

图 3-34所示。

定义发送方RFC连接:填入发送方目标系统名称、IP地址和实例编号,如图3-35所示。

13 8

第 147 页 / 共 377 页

图3-34

图3-35

输入语言、客户端号、用户名和密码,如图3-36所示。

图3-36

139

第 148 页 / 共 377 页

选择Unicode选项,如图3-37所示。

图3-37

注:当对方系统为Unicode系统时,该选项要被选中。

测试连接和权限测试,单击应用工具栏中的 按钮,如图3-38所示。

图3-38

(2)在发送方系统定义

按照以上步骤,在发送方定义相同的逻辑系统和对应的RFC连接。

2.定义系统间IDoc连接

(1)在接收方系统定义

步骤一:创建并分配添加消息类型。

14 0

第 149 页 / 共 377 页

运行事务代码BD64,创建模型视图,如图3-39所示。

图3-39

单击 按钮并改为修改模式,单击 按钮创建模型视图,输入描述与IDoc名

称,如图3-40所示。

图3-40

单击上图中的 按钮,效果如图3-41所示。

图3-41

141

第 150 页 / 共 377 页

选中模型视图,单击 按钮添加消息模型,输入模型名称、发送方逻辑名、

接受方逻辑名和消息类型如图3-42所示。

单击上图中的 按钮,并单击标准工具栏上的保存按钮 保存设定信息。

步骤二:生成伙伴参数文件。

按照以下路径生成伙伴参数文件,如图3-43所示。

图3-42 图3-43

输入合作伙伴系统(发送方逻辑系统名称),如图3-44所示,单击运行按钮 。

图3-44

执行结果如图3-45所示。

图3-45

14 2

第 151 页 / 共 377 页

步骤三:分配观察模型。

单击标准工具栏上的返回按钮 ,按照以下路径将模型分配给逻辑系统,如图3-46所示。

图3-46

选择发送方逻辑名称,如图3-47所示。

图3-47

单击上图中的 按钮,分配结果如图3-48所示。

图3-48

143

第 152 页 / 共 377 页

接收方配置结果如图3-49所示。

图3-49

发送方生成结果如图3-50所示。

图3-50

14 4

第 153 页 / 共 377 页

(2)在发送方系统定义

步骤一:生成伙伴参数文件。

运行事务代码 BD64,选中已生成的模型,按照以下路径生成伙

伴参数文件,如图3-51所示。

输入合作伙伴系统(接收方逻辑系统名称)如图3-52所示,单击 图3-51

运行按钮 。

图3-52

显示成功信息如图3-53所示。

图3-53

145

第 154 页 / 共 377 页

3.测试系统间IDoc连接

(1)在发送端发送

步骤一:创建物料。

运行事务代码MM01,创建物料如图3-54所示。

图3-54

步骤二:发送物料。

运行事务代码 BD10,填写发送的物料号和接收方服务器逻辑地址,单击运行按钮 ,

如图3-55所示。

图3-55

运行结果如图3-56所示。

14 6

第 155 页 / 共 377 页

图3-56

单击上图中的 按钮,如图3-57所示。

图3-57

单击上图中的 按钮。

步骤二:查看发送物料结果。

发送完成后,运行事务WE02查看发送消息,如图3-58所示。

图3-58

单击运行按钮 ,如图3-59所示。

(2)在接收端接收

步骤一:查看接受消息。

在接受方服务器运行事务WE02,查看接受消息,如图3-60所示。

步骤二:查看接受物料。

在接受方服务器运行事务MM03,查看接受物料,如图3-61所示。

147

第 156 页 / 共 377 页

图3-59

图3-60

图3-61

14 8

第 157 页 / 共 377 页

3.3.2 SAP系统间数据扩张传输

本例中实现传送自定义表中的数据共享,一方系统表中的数据,通过IDoc发送与接收操

作,在另一方系统中实现共享。

1.确认系统数据状况

发送端系统逻辑系统名称为NSPCLNT000(客户端为000),接收端系统逻辑系统名称为

PRODUCTION(客户端为811)。

传送的表结构如图3-62所示,此表在NSPCLNT000和PRODUCTION中均存在。

图3-62

发送端系统数据如图3-63所示。

图3-63

149

第 158 页 / 共 377 页

接收端系统数据如图3-64所示。

图3-64

2.定义系统间连接

(1)在接收方系统定义

步骤一:定义发送方与接受方逻辑系统。

按照路径“IDoc接口 / 启用应用程序链接(ALE)→基本设置→逻辑系统→定义逻辑系

统”或运行事务代码BD54,添加逻辑系统如图3-65所示。

图3-65

如上图所示,逻辑系统NSPCLNT000为接收方用,PRODUCTION为发送方用。

步骤二:定义客户端与逻辑系统之间的对应关系。

运行事务代码SCC4,设定客户端信息如图3-66所示。

图3-66

15 0

第 159 页 / 共 377 页

步骤三:定义RFC调用目标系统,建立连接。

运行事务代码SM59,设定RFC连接信息如图3-67所示。

定义接受方RFC连接:填入接收方目标系统名称、IP地址和实例编号。

图3-67

输入语言、客户端号、用户名和密码,如图3-68所示。

图3-68

151

第 160 页 / 共 377 页

选择“MDMP& Unicode”选项,图3-69所示。

图3-69

测试连接和权限测试,单击应用工具栏中的 按钮,如图3-70所示。

图3-70

定义发送方RFC连接:填入发送方目标系统名称、IP地址和实例编号,如图3-71所示。

15 2

第 161 页 / 共 377 页

图3-71

输入语言、客户端号、用户名和密码,如图3-72所示。

图3-72

153

第 162 页 / 共 377 页

选择“MDMP& Unicode”选项(该系统为Non-Unicode系统),如图3-73所示。

图3-73

测试连接和权限测试,单击应用工具栏中的 按钮,如图3-74所示。

图3-74

(2)在发送方系统定义

按照以上步骤,在发送发定义相同的逻辑系统和对应的RFC连接。

3.定义系统间IDoc信息

(1)在接收方系统定义

步骤一:在发送系统中定义数据段。

运行事务代码WE31,设定数据段信息如图3-75所示。

15 4

第 163 页 / 共 377 页

图3-75

单击新建按钮 ,填写段中数据项如图3-76所示。

图3-76

单击标准工具栏中的保存按钮 ,如图3-77所示。

图3-77

单击上图中的 按钮,如图3-78所示。

155

第 164 页 / 共 377 页

图3-78

单击上图中的 按钮,如图3-79所示,其效果如图3-80所示。

图3-79

图3-80

单击标准工具栏上的返回按钮 ,在段编辑初始画面中按照以下路径发布该段,如图3-81

所示。

图3-81

15 6

第 165 页 / 共 377 页

结果如图3-82所示。

图3-82

步骤二:在发送系统中定义基本IDoc类型。

运行事务代码WE30,设定基本IDoc类型如图3-83所示。

图3-83

单击新建按钮 ,填写类型描述如图3-84所示。

图3-84

单击上图中的 按钮,如图3-85所示。

157

第 166 页 / 共 377 页

图3-85

选中信息类型,单击新建段按钮 ,填写段及数量编号信息,如图3-86所示。

图3-86

单击上图中的 按钮,如图3-87所示。

图3-87

单击标准工具栏中的保存按钮 ,如图3-88所示。

图3-88

单击上图中的 按钮,如图3-89所示。

图3-89

15 8

第 167 页 / 共 377 页

单击标准工具栏中的返回按钮 ,在段编辑初始画面中按照以下路径发布该类型,如

图3-90所示。

图3-90

单击图3-91中的 按钮。

图3-91

(2)在发送方系统定义

按照以上步骤,在发送方定义相同的段和信息类型。

4.定义系统间IDoc关联

(1)在发送方系统定义

步骤一:创建一个逻辑消息类型。

运行事务代码WE81,设定数据段信息如图3-92所示。

图3-92

步骤二:指定逻辑消息类型和IDoc基本类型的对应关系。

运行事务代码WE82,设定对应关系如图3-93所示。

图3-93

(2)在接收方系统定义

按照以上步骤,在接收方定义相同的逻辑消息类型和分配。

159

第 168 页 / 共 377 页

5.定义系统间IDoc连接

(1)在发送方系统定义

步骤一:创建并分配添加消息类型。

运行事务代码BD64,创建模型视图,如图3-94所示。

图3-94

单击按钮 并改为修改模式,单击 按钮创建模型视图,输入描述与IDoc名

称,如图3-95所示。

图3-95

单击上图中的 按钮,如图3-96所示。

图3-96

16 0

第 169 页 / 共 377 页

选中模型视图,单击 按钮添加消息模型,输入模型名称、发送方逻辑名、

接受方逻辑名和消息类型,如图3-97所示。

图3-97

单击上图中的 按钮,并单击标准工具栏中的保存按钮 保存设定信息。

步骤二:生成伙伴参数文件。

按照以下路径生成伙伴参数文件,如图3-98所示。

图3-98

输入合作伙伴系统(发送方逻辑系统名称)如图3-99所示,单击运行 按钮。

图3-99

执行结果如图3-100所示。

161

第 170 页 / 共 377 页

图3-100

步骤三:分配观察模型。

单击标准工具栏中的返回按钮 ,按照以下路径将模型分配给逻辑系统,如图 3-101

所示。

图3-101

选择发送方逻辑名称,如图3-102所示。

图3-102

16 2

第 171 页 / 共 377 页

单击上图中的 按钮,分配结果如图3-103所示。

图3-103

接收方生成结果如图3-104所示。

图3-104

运行事务代码WE21,确认生成IDoc端口,如图3-105所示。

图3-105

163

第 172 页 / 共 377 页

运行事务代码WE20,确认对应合作伙伴参数如图3-106所示。

图3-106

双击消息类型ZLTYPTEST,确认出站配置,如图3-107所示。

图3-107

步骤四:编辑IDoc发布程序。

运行事务SE38,编写该IDoc的出站处理程序,如图3-108所示。

16 4

第 173 页 / 共 377 页

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

*

* Program ID :ZIDOC_SEND

* Program Description :学生成绩发送

* Create User :BCUSER

* Create Date :2011/02/20

*

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

* Function Overview

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

* 并将查询结果以IDoc形式发送

*

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

* Change List :

* change NO. Change Date Change User Change Detail

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

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

REPORT ZIDOC_SEND

NO STANDARD PAGE HEADING

LINE-SIZE 120

LINE-COUNT 90(3)

MESSAGE-ID ZTESTMSG.

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

* INCLUDE

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

INCLUDE: ZTEST0N, "常量定义

ZTEST0F. "Form定义

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

* TYPES

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

* 成绩表信息

TYPES: BEGIN OF TYP_TEST.

INCLUDE STRUCTURE ZTTEST_T.

TYPES: END OF TYP_TEST.

* 成绩表

TYPES: BEGIN OF TYP_TESTLIST,

ZZCLASS LIKE ZTTEST_T-ZZCLASS, "班级

ZZYEAR LIKE ZTTEST_T-ZZYEAR, "学年

ZZSTDNO LIKE ZTTEST_T-ZZSTDNO, "学号

ZZTENKOK LIKE ZTTEST_T-ZZTENKOK, "语文

ZZTENSAN LIKE ZTTEST_T-ZZTENSAN, "数学

ZZTENRIK LIKE ZTTEST_T-ZZTENRIK, "自然

ZZTENSHA LIKE ZTTEST_T-ZZTENSHA, "思想品德

165

ZTEST0N
ZTEST0F
ZZCLASS
ZZYEAR
ZZSTDNO
ZZTENKOK
ZZTENSAN
ZZTENRIK
ZZTENSHA
ZTTEST_T- ZZCLASS
ZTTEST_T- ZZYEAR
ZTTEST_T- ZZSTDNO
ZTTEST_T- ZZTENKOK
ZTTEST_T -ZZTENSAN
ZTTEST_T -ZZTENRIK,
ZTTEST_T -ZZTENSHA

第 174 页 / 共 377 页

ZZNAME LIKE ZMNUMBER_T-ZZNAME, "姓名

END OF TYP_TESTLIST.

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

* TABLES:

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

TABLES: ZTTEST_T. "考试成绩表

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

* CONSTANTS

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

CONSTANTS: LINE88 TYPE I VALUE 88.

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

* DATA

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

* 报表处理用变量

DATA: BEGIN OF TNAME,

NAME1 LIKE ZMTNUMBER_T-ZTNAME, "班主任

NAME2 LIKE ZMTNUMBER_T-ZTNAME, "副班主任

END OF TNAME.

DATA: BEGIN OF FLG,

CLS_FRST TYPE C VALUE CNS-OFF, "班级起始

END OF FLG.

* 考试成绩表

DATA: TBL_TEST TYPE STANDARD TABLE OF TYP_TESTLIST WITH HEADER LINE.

DATA: ITEM_LINE LIKE LINE OF TBL_TEST.

DATA: IDOC_TEST TYPE STANDARD TABLE OF TYP_TEST WITH HEADER LINE.

* IDoc应用

DATA: IDOC_CTL LIKE EDIDC,

SGTEST LIKE ZSGTEST.

DATA: TBL_RET_CTL LIKE EDIDC OCCURS 0 WITH HEADER LINE,

TBL_IDOC_DATA LIKE EDIDD OCCURS 0 WITH HEADER LINE.

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

* PARAMETERS

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

PARAMETERS: P_CLASS TYPE ZTTEST_T-ZZCLASS "班级

OBLIGATORY . "必须

PARAMETERS P_YEAR TYPE ZTTEST_T-ZZYEAR OBLIGATORY. "学年

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

* INITIALIZATION

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

16 6

ZZNAME
TNAME
NAME1 ZMTNUMBER_T -ZTNAME
NAME2 ZMTNUMBER_T -ZTNAME
FLG
CLS_FRST
ITEM_LINE
IDOC_TEST
EDIDC
ZSGTEST

第 175 页 / 共 377 页

INITIALIZATION.

* 数据初始化

PERFORM DATA_INIT

USING

P_CLASS "班级

P_YEAR. "学年

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

* AT SELECTION SCREEN

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

AT SELECTION-SCREEN.

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

PERFORM CLASS_INPUT_CHECK USING P_CLASS TEXT-001 CHANGING TNAME.

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

PERFORM YEAR_INPUT_CHECK USING P_YEAR TEXT-002.

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

*START-OF-SELECTION

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

START-OF-SELECTION.

* 报表数据初始化

PERFORM REPORT_DATA_INIT.

* 报表数据编辑

PERFORM REPORT_DATA_EDIT.

* 报表数据发送

PERFORM REPORT_DATA_SEND.

* 报表数据打印

PERFORM REPORT_DATA_EXE.

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

* END-OF-SELECTION

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

END-OF-SELECTION.

* 报表程序终了处理

PERFORM REPORT_EDIT_END.

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

* TOP-OF-PAGE

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

TOP-OF-PAGE.

* 报表页眉编辑

PERFORM REPORT_HEADER_EDIT.

167

P_CLASS
P_YEAR

第 176 页 / 共 377 页

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

* END-OF-PAGE

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

END-OF-PAGE.

* 报表页脚编辑

PERFORM REPORT_FOOTER_EDIT.

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

*& Form REPORT_DATA_INIT

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

* 报表数据初始化

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

FORM REPORT_DATA_INIT.

* 内部表初始化

CLEAR: TBL_TEST. "成绩表头

REFRESH: TBL_TEST. "成绩表

CLEAR: IDOC_TEST. "成绩表头

REFRESH: IDOC_TEST. "成绩表

ENDFORM. " REPORT_DATA_INIT

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

*& Form REPORT_DATA_EDIT

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

* 报表数据编辑

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

FORM REPORT_DATA_EDIT .

* 成绩表数据抽取

SELECT ZZCLASS "班级

ZZYEAR "学年

ZZSTDNO "学号

ZZTENKOK "语文

ZZTENSAN "数学

ZZTENRIK "自然

ZZTENSHA "思品

ZZNAME "姓名

FROM ZZTEST_V "成绩表

INTO TABLE TBL_TEST "成绩内部表

WHERE ZZCLASS = P_CLASS "班级

AND ZZYEAR = P_YEAR . "学年

* 无数据情况

IF SY-SUBRC <> 0.

MESSAGE S002.

16 8

TBL_TEST
TBL_TEST
IDOC_TEST
IDOC_TEST
ZZCLASS
ZZYEAR
ZZSTDNO
ZZTENKOK
ZZTENSAN
ZZTENRIK
ZZTENSHA
ZZNAME
ZZTEST_V
TBL_TEST
I SY- SUBRC <>
S002

第 177 页 / 共 377 页

STOP.

ELSE.

* 成绩表数据抽取

SELECT *

FROM ZTTEST_T "成绩表

INTO TABLE IDOC_TEST "成绩内部表

WHERE ZZCLASS = P_CLASS "班级

AND ZZYEAR = P_YEAR . "学年

ENDIF.

* 排序

SORT TBL_TEST BY ZZCLASS ASCENDING "班级

ZZYEAR ASCENDING "学年

ZZSTDNO ASCENDING. "学号

ENDFORM. " REPORT_DATA_EDIT

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

*& Form REPORT_DATA_SEND

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

* 报表数据发送

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

FORM REPORT_DATA_SEND .

* 编辑IDoc控制字段

PERFORM BUILD_IDOC_CONTROL.

* 编辑IDoc段内容

LOOP AT IDOC_TEST.

PERFORM BUILD_IDOC_SEGMENT.

ENDLOOP.

* 创建IDoc并发送

PERFORM CREATE_IDOC_SEND.

ENDFORM. " REPORT_DATA_SEND

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

*& Form REPORT_DATA_EXE

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

* 报表数据打印

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

FORM REPORT_DATA_EXE .

CHECK TBL_TEST[] IS NOT INITIAL.

LOOP AT TBL_TEST. "成绩内部表

CLEAR FLG-CLS_FRST. "班级表示清空

AT NEW ZZCLASS. "新班级

MOVE CNS-ON TO FLG-CLS_FRST. "班级标示设ON

ENDAT .

169

= P_CLASS
_YEAR
ZZYEAR
ZZSTDNO
TBL_TEST.
LG -CLS_FRST

第 178 页 / 共 377 页

RESERVE 3 LINES.

* 报表明细编辑

PERFORM EDIT_REPORT_DTL.

AT END OF ZZCLASS . "班级最后

* 报表挂线

PERFORM EDIT_REPORT_CLS.

ENDAT.

AT END OF ZZYEAR.

NEW-PAGE.

ENDAT.

ENDLOOP.

LOOP AT TBL_RET_CTL.

WRITE:/ 'IDoc Generated - ', TBL_RET_CTL-DOCNUM.

ENDLOOP.

ENDFORM. " REPORT_DATA_EXE

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

*& Form REPORT_EDIT_END

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

* 报表程序终了处理

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

FORM REPORT_EDIT_END .

CHECK TBL_TEST[] IS NOT INITIAL.

* 当前行号小于88时

IF SY-LINNO < LINE88 .

SKIP TO LINE LINE88 .

PERFORM REPORT_FOOTER_EDIT.

ENDIF.

ENDFORM. " REPORT_EDIT_END

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

*& Form REPORT_HEADER_EDIT

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

* 报表页眉编辑

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

FORM REPORT_HEADER_EDIT .

SKIP 1 .

WRITE:/030 TEXT-003. "成绩表

WRITE:/016 TEXT-002 , "学年

020 CNS-COLON,

022 TBL_TEST-ZZYEAR.

17 0

TBL_RET_CTL
:/
SY- LINNO < LINE88
LINE88
030
016
CNS- COLON
TBL_TEST -ZZYEAR

第 179 页 / 共 377 页

WRITE: 030 TEXT-004, "班主任

036 CNS-COLON,

038 TNAME-NAME1(6),

045 TNAME-NAME2(6).

WRITE:/015 SY-ULINE(052) .

WRITE:/015 SY-VLINE,

017 TEXT-001, "班级

021 SY-VLINE,

025 TEXT-005, "学生

038 SY-VLINE,

040 TEXT-006, "语文

045 SY-VLINE,

047 TEXT-007, "数学

052 SY-VLINE,

054 TEXT-008, "自然

059 SY-VLINE,

061 TEXT-009, "思品

066 SY-VLINE.

WRITE:/015 SY-VLINE,

021 SY-VLINE,

038 SY-VLINE,

045 SY-VLINE,

052 SY-VLINE,

059 SY-VLINE,

066 SY-VLINE,

015 SY-ULINE(052).

ENDFORM. " REPORT_HEADER_EDIT

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

*& Form EDIT_REPORT_DTL

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

* 报表明细编辑

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

FORM EDIT_REPORT_DTL .

WRITE:/015 SY-VLINE,

021 SY-VLINE,

023 TBL_TEST-ZZNAME(14), "学生

038 SY-VLINE,

041(4) TBL_TEST-ZZTENKOK, "语文

045 SY-VLINE,

048(4) TBL_TEST-ZZTENSAN, "数学

052 SY-VLINE,

055(4) TBL_TEST-ZZTENRIK, "自然

059 SY-VLINE,

062(4) TBL_TEST-ZZTENSHA, "思品

171

NS -COLO
NAME -NAME1
NAME -NAME2
/015 SY
/015 SY -VLINE
SY -VLINE
/015 SY -VLINE
SY -VLINE
SY -VLINE
SY -VLINE
SY -VLINE
SY -VLINE
SY -VLINE
SY
SY- VLINE,
TBL_TEST- ZZNAME
SY- VLINE,
TBL_TEST -ZZTENKOK
SY- VLINE,
TBL_TEST -ZZTENSAN
SY- VLINE,
TBL_TEST -ZZTENRIK,
SY- VLINE,
TBL_TEST -ZZTENSHA

第 180 页 / 共 377 页

066 SY-VLINE.

IF FLG-CLS_FRST = CNS-ON. "班级开始

WRITE: 017 TBL_TEST-ZZCLASS+0(1), "

018 CNS-PLUS ,

019 TBL_TEST-ZZCLASS+1(1).

ENDIF.

ENDFORM. " EDIT_REPORT_DTL

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

*& Form EDIT_REPORT_CLS

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

* 报表挂线

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

FORM EDIT_REPORT_CLS .

* 成绩表挂线

WRITE:/015 SY-VLINE,

021 SY-VLINE,

038 SY-VLINE,

045 SY-VLINE,

052 SY-VLINE,

059 SY-VLINE,

066 SY-VLINE,

015 SY-ULINE(052).

ENDFORM. " EDIT_REPORT_CLS

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

*& Form REPORT_FOOTER_EDIT

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

* 报表页脚编辑

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

FORM REPORT_FOOTER_EDIT .

WRITE 030 SY-PAGNO. "页数

ENDFORM. " REPORT_FOOTER_EDIT

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

*& Form BUILD_IDOC_CONTROL

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

* 编辑IDoc控制字段

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

FORM BUILD_IDOC_CONTROL .

* 类型

IDOC_CTL-IDOCTP = 'ZTYPTEST'. "IDoc 类型

IDOC_CTL-MESTYP = 'ZLTYPTEST'. "信息类型

17 2

SY- VLINE
FLG- CLS_FRST = CN
BL_TEST- ZZCLASS+0
CNS- PLUS
TBL_TEST- ZZCLASS+1
/015 S Y-VLINE
SY- VLINE
SY- VLINE
SY- VLINE
SY- VLINE
SY- VLINE
SY- VLINE
SY-
IDOC_CTL -IDOCTP
IDOC_CTL -MESTYP

第 181 页 / 共 377 页

* 接收端

IDOC_CTL-RCVPRT = 'LS'. "伙伴类型

IDOC_CTL-RCVPRN = 'PRODUCTION'. "合作伙伴编号

IDOC_CTL-RCVPOR = 'A000000036'. "端口

* 发送端

IDOC_CTL-SNDPRT = 'LS'. "伙伴类型

IDOC_CTL-SNDPRN = 'NSPCLNT000'. "合作伙伴编号

ENDFORM. " BUILD_IDOC_CONTROL

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

*& Form BUILD_IDOC_SEGMENT

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

* 编辑IDoc段内容

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

FORM BUILD_IDOC_SEGMENT .

* 表头信息

TBL_IDOC_DATA-SEGNAM = 'ZSGTEST'. "段名

TBL_IDOC_DATA-SEGNUM = SY-TABIX. "段No

MOVE-CORRESPONDING IDOC_TEST TO SGTEST.

MOVE SGTEST TO TBL_IDOC_DATA-SDATA.

APPEND TBL_IDOC_DATA.

ENDFORM. " BUILD_IDOC_SEGMENT

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

*& Form CREATE_IDOC_SEND

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

* 创建IDoc并发送

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

FORM CREATE_IDOC_SEND .

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'

EXPORTING

MASTER_IDOC_CONTROL = IDOC_CTL

TABLES

COMMUNICATION_IDOC_CONTROL = TBL_RET_CTL

MASTER_IDOC_DATA = TBL_IDOC_DATA

EXCEPTIONS

ERROR_IN_IDOC_CONTROL = 1

ERROR_WRITING_IDOC_STATUS = 2

ERROR_IN_IDOC_DATA = 3

SENDING_LOGICAL_SYSTEM_UNKNOWN = 4

OTHERS = 5.

IF SY-SUBRC <> 0.

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

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

173

IDOC_CTL -RCVPRT
IDOC_CTL -RCVPRN
IDOC_CTL -RCVPOR
IDOC_CTL -SNDPRT
IDOC_CTL -SNDPRN
TBL_IDOC_DATA- SEGNAM
TBL_IDOC_DATA- SEGNUM
MASTER_IDOC_CONTROL
COMMUNICATION_IDOC_CONTROL
MASTER_IDOC_DATA
ERROR_IN_IDOC_CONTROL
ERROR_WRITING_IDOC_STATUS
ERROR_IN_IDOC_DATA
SENDING_LOGICAL_SYSTEM_UNKNOWN
TBL_RET_CTL
TBL_IDOC_DATA
SY -SUBRC <>
SY -MSGID SY- MSGTY
SY -MSGV1 SY- MSGV2 SY -MSGV3 SY -MSGV4

第 182 页 / 共 377 页

ELSE.

COMMIT WORK.

ENDIF.

ENDFORM. " CREATE_IDOC_SEND

文本元素编辑如图3-108所示。

图3-108

选择文本元素编辑如图3-109所示。

图3-109

(2)在接收方系统定义

步骤一:生成伙伴参数文件。

运行事务代码BD64,选中已生成的模型,按照以下路径生成伙伴参数文件,如图3-110

所示。

图3-110

17 4

第 183 页 / 共 377 页

输入合作伙伴系统(接收方逻辑系统名称),如图3-111所示,单击运行按钮 。

图3-111

显示成功信息如图3-112所示。

图3-112

运行事务WE21确认端口信息,如图3-113所示。

图3-113

175

第 184 页 / 共 377 页

步骤二:创建入站处理函数。

运行事务代码SE37,单击拷贝按钮 ,如图3-114所示。

图3-114

注:一般由已存在的入站函数拷贝得来,可以提高效率。

单击上图中的 按钮,效果如图3-115所示。

图3-115

编辑函数ZIDOC_INPUT_TEST_CREATE如下:

编辑属性标签页,如图3-116所示。

图3-116

编辑输入标签页,如图3-117所示。

图3-117

17 6

第 185 页 / 共 377 页

编辑“Export”标签页,如图3-118所示。

图3-118

编辑“Changing”标签页,如图3-119所示。

图3-119

编辑“Tables”标签页,如图3-120所示。

图3-120

编辑“Exceptions”标签页,如图3-121所示。

图3-121

源码如下:

FUNCTION ZIDOC_INPUT_TEST_CREATE.

177

返回ABAP参考资料列表