ABAP 处理程序的功能是将业务对象数据输入 SAP 应用程序数据库或从 SAP 应用程序数据库中输出。当处理业务对象数据时,ABAP 处理程序执行以下操作:
每个 ABAP 处理程序接收相同格式(平面结构)的业务对象数据。但是,每个 ABAP 处理程序都对业务对象具有特定要求,这些要求由 WebSphere 业务对象定义的复杂性、SAP 提供的本机 API 和 ABAP 处理程序提供的功能级别确定。由于这些原因,ABAP 处理程序可以通过对业务对象数据进行语法分析 来将该数据解释为特定于业务对象的结构。这使 ABAP 处理程序能够更容易地处理数据。
适配器提供了几个 ABAP 处理程序,如 IDoc 处理程序。IDoc 处理程序通过提供 ABAP 处理程序来利用 SAP 的 IDoc 技术,即,将业务对象数据重新格式化为基于 IDoc 的结构来解释业务对象数据,以便 ABAP 处理程序使用。
一旦 ABAP 处理程序解释了业务对象数据,ABAP 处理程序就必须将该数据与 SAP 应用程序数据库结合在一起。它必须处理业务对象数据以使用 SAP 本机 API(例如,“调用事务”或 ABAP SQL)来将数据输入应用程序数据库或从应用程序数据库中输出。
创建、更新或删除操作的目的是要修改 SAP 应用程序数据库。虽然给定业务对象的 SAP 应用程序数据库模式定义数据的结构,但由 SAP 提供的修改该数据的事务具有更广的影响范围。因此,直接修改 SAP 应用程序的应用程序数据库表可能会对应用程序的数据完整性造成灾难性的后果。
SAP 不会直接修改数据库表,而是为创建、更新和删除操作提供一个灵活的 ABAP API(调用事务)。“调用事务”是 SAP 提供的用于将数据输入 SAP 应用程序的功能。它通过使用联机用户将在事务中使用的相同屏幕来保证数据遵循 SAP 的数据模型。此过程通常称为屏幕搜集。
如果查询描述是“检索”,则连接器使用 ABAP SQL 语句来从 SAP 应用程序数据库检索数据。当获取数据时,业务对象数据为 where 子句提供键。此检索数据的方法的困难在于必须以表示业务对象结构的格式表示检索的数据。将在 ABAP 处理程序 ABAP 代码中执行此操作。
连接器只支持对指定的主键执行“检索”处理。
ABAP 扩展模块使用三个不同的返回码来处理业务对象数据;返回码 0、21 和任何非零代码(除了 21 以外)。在功能模块界面中设置返回码。有关功能模块接口的更多信息,请参阅IBM WebSphere 功能模块接口。
返回码 0 指示成功处理了业务对象并将 VALCHANGE 返回给连接器基础结构。如果 ABAP 处理程序处理成功,则连接器期望反映所执行操作的新业务对象数据。例如,在成功创建之后,返回的业务对象是最初发送进来的业务对象的精确副本,只是更新了键。同样,成功的检索将产生业务对象的结构完整实例。但是,创建、更新和删除操作对返回的业务对象具有与检索操作不同的需求。
当 IBM WebSphere InterChange Server 是集成代理程序时,需求的差别来自 WebSphere Business Integration 系统如何处理业务对象,尤其是如何处理映射期间对对象标识的动态交叉引用。当连接器在执行创建或更新操作之后将业务对象返回至 IBM WebSphere InterChange Server 时,映射基础结构尝试用新获得的对象标识来更新交叉引用表。将通过查找在将业务对象最初发送至连接器时设置的业务对象的 ObjectEventId 属性值来完成更新。
因为 ABAP 处理程序负责将对象标识与返回至连接器的业务对象“绑定”在一起,所以这对于 ABAP 处理程序很重要。通常,因为不存在相应的动态交叉引用,所以这对于检索操作不是问题。检索操作生成返回至连接器的全新业务对象。此业务对象与最初发送业务对象的结构没有任何直接关系。
ABAP 处理程序返回的业务对象数据必须处于与最初将该数据传递至功能模块 /CWLD/RFC_DO_VERB_NEXTGEN 时相同的平面结构格式。ABAP 处理程序只需要发送出简单类型属性以及每个属性的以下信息:
因为连接器仅使用特定于应用程序的信息来根据此数据创建业务对象,所以此时不需要属性名。将不使用也不应添加用于开始和结束业务对象或对象类型属性的标识。例如,从 ABAP 处理程序返回的业务对象中将不使用 BoName 和 BoVerb 行。最初将它们传递至 ABAP 处理程序只是为了便于处理。
当 ABAP 处理程序用表示 WebSphere 业务对象的业务对象响应数据来填充平面结构时,它必须遵守下面的一组规则:
图 73 举例说明了平面业务对象(无对象类型属性)。
表 45 表示平面业务对象 SAP_Material 的结构,该对象的键值为
ItemID。注意,字段 ATTR_NAME 不是必需的,APPTEXT
对于每个属性是唯一的。并且,由于此业务对象是平面的,所以 PEERS
字段可以保留为空白。
ATTR_NAME | ATTR_VALUE | ISKEY | ISNEW | PEERS | OBJ_ NUMBER | APPTEXT |
---|---|---|---|---|---|---|
(空白) | 000000000000001179 | (空白) | (空白) | (空白) | (空白) | ItemId |
(空白) | Toaster 6000 | (空白) | (空白) | (空白) | (空白) | ShortDesc |
(空白) | SAP_124 | (空白) | (空白) | (空白) | (空白) | ObjectEventId |
图 74 举例说明了分层业务对象(包含对象类型)。
表 46 显示基于 IDoc
销售订单的分层业务对象的平面结构表示。注意,字段 ATTR_NAME
不是必需的,APPTEXT
对于每个属性是唯一的。并且,由于此业务对象是分层的,所以 PEERS
字段列示适当的关系。
ATTR_NAME | ATTR_VALUE | ISKEY | ISNEW | PEERS | OBJ_ NUMBER | APPTEXT |
---|---|---|---|---|---|---|
(空白) | USD | 0 | 0 | 1 | (空白) | E1EDK01:CURCY |
(空白) | 0000000101 | 0 | 0 | 1 | (空白) | E1EDK01:BELNR |
(空白) | SAP_124 | 0 | 0 | 1 | (空白) | E1EDK01:ObjectEventId |
(空白) | User1 | 0 | 0 | 2 | (空白) | Z1XRV40:ERNAM |
(空白) | SAP_125 | 0 | 0 | 2 | (空白) | Z1XRV40: ObjectEventId |
(空白) | 001 | 0 | 0 | 1 | (空白) | Z1XRV40:QUALF |
(空白) | 1000 | 0 | 0 | 1 | (空白) | E1EDK14:ORGID |
(空白) | SAP_126 | 0 | 0 | 1 | (空白) | E1EDK14: ObjectEventId |
(空白) | User1 | 0 | 0 | 2 | (空白) | Z1XRV40:ERNAM |
(空白) | SAP_127 | 0 | 0 | 2 | (空白) | Z1XRV40: ObjectEventId |
返回码 21 指示成功处理了业务对象并将 SUCCESS 返回给连接器基础结构。此代码将只返回 SUCCESS,而不会将任何业务对象数据返回给连接器。当业务对象数据成功地输入 SAP 应用程序时,用于处理业务对象数据的特定于对象的 IDoc 处理程序将返回的返回码为 21。该返回码将被传递回 /CWLD/RFC_DO_VERB_NEXTGEN 功能模块,该功能模块又会将 SUCCESS 返回给连接器。连接器从不会接收到业务对象数据。
这在传递大对象(例如,具有多行项的 IDoc)时很有用,并且您需要知道的就是成功地将业务对象数据传递给 SAP 应用程序。因为您只需返回代码而不返回业务对象,所以性能得到了极大提高。
当 WebSphere InterChange Server 是集成代理程序时,仅当业务对象不需要交叉引用并且只是将数据传递到 SAP 应用程序中时才应该使用返回码 21。不要对检索操作使用返回码 21。SUCCESS 返回码的行为意味着没有业务对象返回给 WebSphere InterChange Server 以进行交叉引用或进一步处理。
非零返回码(除了 21 之外)指示未成功处理对象,并且会将 FAIL 返回给连接器。如果 ABAP 处理程序返回非零代码(除了 21 以外),则不会将任何业务对象返回至连接器。