技术开发 频道

集成IBM Lotus Domino和SAP

雇员自助服务应用程序

我们来看一看与 SAP 的交互,这是上面提到的例子中的一部分。我们将介绍一个雇员自助服务(Employee Self Service,ESS)应用程序,本地或远程的 Domino 用户可以通过它使用 Domino 应用程序更新个人地址信息。这些信息没有保存在 Lotus Domino 中,而是保存在 SAP 中。我们的目标是:

  • 不需要对整个 Domino 用户社区进行 SAP 培训,因为不需要直接访问 SAP。
  • Domino 社区不需要 SAP 用户许可证,因为不必登录到 SAP。
  • 减少总部的人员,因为这些请求不再需要呼叫总部中的呼叫中心。

 

现在我们来建立这个应用程序。假设您属于 Domino 一方,第一步就是告诉 SAP 人员,您需要知道从哪里寻找数据以及如何使用满足需要的不同 RFC 或 BAPI。期望自己知道这些答案或者自己来配置是不现实的。Domino 一方和 SAP 一方共同协作才是惟一的解决之道。通过与 SAP 人员的交谈,您了解到:

  • 读取表 PA0006 以获得设置信息,以便能够获取当前的地址数据和更新地址数据。
  • 如果需要更新地址信息,首先必须调用 BAPI_EMPLOYEET_ENQUEUE 锁定该雇员的 HR 记录。
  • 更新雇员的地址信息必须调用 BAPI_ADDRESSEMP_CHANGE。
  • 然后必须调用 BAPI_EMPLOYEET_DEQUEUE 解除该雇员 HR 记录的锁定。

 

第 1 步是一个 LEI 步骤。使用专门的 RFC_READ_TABLE(SAP 中很常用的一种 RFC)可以读取 SAP 中的表。通常 RFC_READ_TABLE 返回一个表,包含所有希望提取的列(作为字符串给出)。如何解析这些列和将其转换成原来的数据类型是您的工作。幸运的是,SAP 连接程序可以替您完成。

首先要定义到 SAP 的连接,以便能够使用 RFC_READ_TABLE。


图 2. 连接到 SAP
 

上图中可以看到访问 SAP 需要的所有连接信息和要访问的 RFC 名称,即 RFC_READ_TABLE。这里 PA0006 已经连接到了 RFC_READ_TABLE 的后端。这样将使 SAP 连接程序以表 PA0006 的格式提供数据,而不是 RFC_READ_TABLE 自己提交通常使用的表 DATA。

然后定义到 Notes 数据库的连接,它将作为 Notes 用户社区的前端,如图 3 所示。


图 3. 连接到 Notes
 

该例中只需要包含 Domino 服务器名和数据库文件名。在 Data Creation 选项卡中可以找到支持的快速应用程序开发(RAD)选项。


图 4. Data Creation 选项卡
 

Create Database 选项告诉 LEI 如果数据库不存在则创建它。这个数据库并不完善(除非定义了使用的模板),但是可以作为 LEI 的基础完成以后的设计工作和保存数据。

接下来需要一个 LEI 活动。为了使这个例子尽量简单,我们使用 Direct Transfer 活动。在实际的解决方案中,可能需要选择 Replication 活动,因为它非常适合保证随着时间的变化应用程序仍然能够得到 SAP 的支持。


图 5. Direct Transfer Activity
 

该活动以 SAP 作为源,Lotus Notes 作为目标。您将从 SAP 表 PA0006 读取数据然后写入 Domino 数据库的 Employee 表单。第一次运行的时候,Domino 数据库还不存在,这意味着必须告诉活动 Domino 表单的名称是什么。还需要自己填写 Target Field 的值,因为这些还不存在。可以选择自动字段映射,创建与 SAP 提供的名称相同的字段名,也可以手工输入字段名。

Select Statement 字段采用专门的格式,只能用于 SAP Connector。完整的“语法”细节请参阅 SAP Connector 文档。这里为 RFC_READ_TABLE 定义了一个输入表。格式包括表名、行号,最后是要为哪些字段提供输入值。该例中输入表 FIELDS 就是要写入的目标。从第 1 行开始,向字段 FIELDNAME 写入一个值。必须告诉 RFC_READ_TABLE 要从表 PA0006 中的哪一个字段读数据,可以通过填写输入表 FIELDS 来完成。

在 Target Data Options 中选择 Create Target Metadata。该例中,如果 Empolyee 表单还不存在,LEI 将为您创建。虽然表单不是很完善,但是能够正确定义活动中映射的字段。这比 LEI RAD 更先进。

理解从 SAP 中读取的数据很有用。地址部分非常明显。需要解释的是后三个字段。BEGDA 是 Begin Date(开始日期),即成为合法地址的日期。ENDDA 代表 End Date(终止日期),即该地址无效或者即将无效的日期。如果地址是有效的,在这里多数时候 SAP 保存的值都是 12/31/9999。 SUBTY 代表 Subtype(子类型),是一个代码,说明这是什么类型的地址,因为 SAP 可能保存给定雇员的多个当前地址。用户并不了解代码的含义,因此可以在 Domino 表单中增加一个小小的计算字段,将 SAP 代码转化成便于阅读的文本。

现在可以再进一步,让 LEI 运行该活动。这个例子稍微改进了 Domino 表单。这个活动创建的示例 Notes 文档类似于图 6。


图 6. 示例 Notes 文档
 

Field Address Type 实际上是根据 SUBTY 的值计算得到的,SUBTY 是隐含子段,计算公式如下:

@If(SUBTY="1";"Permanent Residence";"Temporary Residence")

现在 SAP 数据已经保存到 Lotus Domino 中了。目标是让用户修改这些数据,然后将修改发送到 SAP。为了保持简单,假设 Domino 数据库中已经建立了一种安全机制,每个雇员只能编辑自己的地址数据。

处理更新最简单的一种办法是设置一个字段,如果用户通过表单编辑了文档,就让该字段出现在给定的 Notes 文档中。比方说,在 Empolyee 表单中添加字段 HASBEENCHANGED 并赋予默认值 1。 一旦用户编辑了他们的地址文档,该字段就出现。然后,当把数据发送给 SAP 时,仅仅搜索字段 HASBEENCHANGED 的值为 1 的那些文档。

前面提到,如果要修改雇员的地址数据,首先必须锁定该雇员的记录,修改数据然后再解除锁定。为此,需要在同一个连接上调用三次 RFC。目前来说,这意味着需要一个脚本。下面的脚本没有考虑到可能出现的错误,仅仅满足了基本的要求。可以在 附属文件 中看到完整的脚本。

可以按照不同方式调度该代理的运行。因为需要每 60 分钟运行一次,在一个小时的第 20 分钟运行,所以使用 LEI Scripted Activity 来调度。这样做将消除 Domino 代理管理器的“先进先出”队列行为方式。

我们承认这种办法比较麻烦,因为每次修改地址都需要在一个连接上调用三次 BAPI,所以需要编写脚本。简单的办法是要求 SAP 人员创建一个包装器 BAPI 调用需要的三个 BAPI。包装器需要一个接口能够让您发送调用这三个 BAPI 需要的所有信息。

最终的解决方案应该是具有与 BAPI_ADDRESSEMP_CHANGE 完全相同的接口的包装器。它如何工作呢?首先它将调用 BAPI_EMPLOYEET_ENQUEUE。要得到这个 BAPI 需要的 VALIDITYBEGIN 日期,使用今天的日期就可以了。SAP 知道今天的日期,因此不需要传递。然后,包装器调用 BAPI_ADDRESSEMP_CHANGE,最后再调用 BAPI_EMPLOYEET_DEQUEUE。

不妨将包装器命名为 wrapper Z_BAPI_ADDRESSEMP_CHANGE。使用这个包装器 BAPI,首先要重用已有的 Notes 连接文档。但是这个新的 BAPI 需要一个新的 SAP 连接文档,如图 7 所示。


图 7. 新 BAPI 的 SAP 连接文档
 

现在,只需要一个使用该连接的新 LEI Direct Transfer Activity 了。


图 8. 使用 BAPI 连接的 Direct Transfer Activity
使用 BAPI 连接的 Direct Transfer Activity

可以看到,这里从 Notes 中读取所有字段 HASBEENCHANGED="1" 的 Empolyee 表单,然后将这些文档中的字段发送到 Z_BAPI_ADDRESSEMP_CHANGE。

为了检验操作是否成功,可以使用 Direct Transfer 活动的输出参数特性。


图 9. Target Data 选项
Target Data 选项

选中选项“Target Metadata is Stored Procedure”和“Accept Output Parameters into Source”。如果有错误,该例的脚本版本中使用的字段 ERRORTEXT 包含直接来自 SAP 的文本消息。

相应地,需要从源文档中删除字段 HASBEENCHANGED。最好的办法是使用脚本,脚本作为该活动的 Dependent Activity 来运行。这意味着完成该活动后将启动您的清除脚本。脚本也可以向雇员发送状态邮件表明操作是否成功,如果失败还要发送 ERRORTEXT 消息。

结束语

本文中建立了一个应用程序,从 SAP 读取数据并放到 Domino 数据库中。然后可以在各处使用或者复制该数据库。Notes 用户可以使用 Lotus Notes 和 Domino 在本地修改他们的地址。不需要进行 SAP 培训,甚至不需要到 SAP 的网络连接,不需要 SAP 帐户,也不需要安装额外的工作站软件。所做的修改复制回 LEI 监控的 Domino 服务器,LEI 活动将修改发送到 SAP。最后由清理脚本向雇员发送状态信息。

我们希望您能够有所了解,Lotus Domino 和 SAP 是一对很好的组合,可以为您节约一些时间和金钱。很多 IBM 和 SAP 客户,不论规模大小,都已经从这些产品中获益,解决方案涉及到 SAP 提供的每个模块。

再说一句,我们建议访问 developerWorks: Lotus 企业集成论坛,这里有很多 LEI 用户社区遇到的问题和解答,是一个很好的信息资源。

0
相关文章