学习构建从 SAP 读取数据放入 Domino 数据库的应用程序,以及如何使用 Lotus Enterprise Integrator、Domino Enterprise Connection Services 和 Lotus Connectors LotusScript Extension 这些强大的工具。
Lotus Domino 和 SAP Enterprise 连接在一起协同工作很有必要,这两个强大的系统一旦联系起来,可以:
- 减少需要的 SAP 用户许可证。
- 提高用户社区中能够访问 SAP 服务的比率。
- 减少数据错误(从而提高用户满意度)。
- 提供更好的处理状态信息,也可以提高用户的满意度。
- 减少(如果不是完全消除)用户系统上应用程序的定制需要。所有用户都可以使用这些信息,而不仅仅局限于那些能够从网络上访问 SAP 的用户。
- 减少维护内部过程需要的人员。
- 降低与 SAP 培训有关的费用,因为直接与 SAP 打交道的人少了。
本文描述了来自 IBM Software Group 的 Lotus Enterprise Integrator (LEI) 团队的强大工具,可以帮助您实现这个很有价值的目标。然后我们使用这些工具建立一个雇员自助服务(Employee Self Service)示例解决方案。我们介绍的工具包括 Lotus Enterprise Integrator (LEI)、Domino Enterprise Connection Services、Lotus Connectors LotusScript Extension 和 Lotus Connector for SAP R/3 with MTA and Workflow。如果熟悉 Lotus Notes/Domino、LEI 和 SAP,有助于理解本文讨论的某些特性和概念。
Lotus Enterprise Integrator (LEI)
Lotus Enterprise Integrator (LEI) 的主要功能就是把数据从 A 点移到 B 点(有时候还要返回去)。它建立在 Lotus Connectors 的基础上,后者提供了不同企业系统的访问。目前提供的连接程序有 DB2、File、Lotus Notes、Oracle、ODBC、OLEDB、Sybase 和 Text。这些连接程序都是标准 LEI 产品的一部分。此外,还可以单独订购 SAP 连接程序。
LEI 同时提供了 Data Management 活动和 Advanced Realtime 活动。Data Management 活动控制在给定的时间点给定的连接程序做什么,包括:
- Archive,从连接程序 A 读取数据,写入连接程序 B,然后从连接程序 A 上删除。
- Command,执行操作系统、数据库或 SQL 命令。
- Direct Transfer,从连接程序 A 读取数据并写入连接程序 B。这是 LEI 中最常用的活动,可用于数据迁移、定期下载、定期上传或者其他各种用途。
- Java,执行 Java 应用程序。
- Polling,监视特定的条件是否成立,如果成立则触发其他活动。
- Replication,有两种情况:让连接程序 B 的数据和连接程序 A 的类似,或者使 A 和 B 的数据相同。
- Scripted,代理在 Domino 代理管理器不 干预的情况下下执行。脚本拥有自己的运行过程,执行速度快,按照自己而非代理管理器的调度执行。
每种活动都具有不同的调度能力、专门的活动选项,也能够启动相关的活动。每个连接程序都可以与其他连接程序交换数据。但最好的地方是,使用 LEI 活动可以在 LEI 管理数据库中填写表单(不需要编写脚本)。这些表单是标准的 Domino 表单。表单中可以选择从哪里读取数据,写到哪里,将一个连接元数据中的字段映射到另一个连接元数据中的字段。
元数据包括:
- 关系数据库管理系统(DBMS)中的表或视图。表必须存在于 DBMS 本身之中,或者由存储过程动态创建和返回。
- Lotus Domino 中的 Domino 表单。
- SAP 中的表,即 Remote Function Call(远程函数调用,RFC)、Business Object Application Programmer's Interface(业务对象应用程序编程接口,BAPI)或者 Transactions(成批输入模式)使用的表。
LEI 6 及更高版本支持的 Advanced Realtime 活动包括:
- Virtual Fields (虚拟字段,原来在 LEI 3.x 中称为 Realtime)。 通过该活动可以将 Domino 应用程序作为企业数据的前端,而不需要复制数据。数据的检索和修改是实时进行的。只有企业数据的键值保存到 Notes 文档中。最棒的一点是,用户(无论人还是机器)都毫不知情。一旦打开 Notes 文档,所有字段(不仅仅是键)都自动填充完成。这一切都是实时完成的!
- Virtual Documents(虚拟文档)。这是下一层次的虚拟字段。不再有 Notes 文档保存键值,所有内容都是虚拟的。视图被填充,文档按照期望在视图中工作,但实际上里面什么也没有。通过向 RDBMS 表中增加控制字段保存 Domino 专用的注解字段,除了给定视图上显示的汇总信息之外,不需要在 Domino Notes 中保存任何信息。
- Virtual Attachments(虚拟附件)。被虚拟字段或虚拟文档“查看”的保存在文档中的附件现在可以保存到 RDBMS 系统而非 Domino 数据库中了。这样,其他 RDBMS 应用程序也可使用这些信息(只读模式),而且避免了 NSF 文件的膨胀。
- Virtual Agents(虚拟代理)。RDBMS 存储过程现在可以从任何地方访问,只要前面有一个代理。它们可以操作单个文档或者一组文档。虚拟代理将文档中的字段传递给存储过程的输入参数,使存储过程能够完成任何需要的操作。
因此,无论需要 Data Management 还是 Advanced Realtime 活动,Lotus Enterprise Integrator 都可以为您完成其中的很多任务。图 1 显示了 LEI Administration 数据库,其中定义了连接和活动,活动的执行是受控的。
|
Domino Enterprise Connection Services (DECS)
Virtual Fields 活动(原来称为 Realtime)取得了非凡的成功,以至于从 LEI 分离出去形成单独的工具,称为 Domino Enterprise Connection Services (DECS)。DECS 是 Domino Enterprise Server 的标准组件。Lotus Domino 6 或更高版本中的 DECS 与 LEI 中的 Virtual Fields 活动相比功能不那么全,但仍然能够满足很多的客户需要。它不支持 Virtual Attachments 和 Integrated Credentials。
|
Lotus Connectors LotusScript Extension (LCLSX)
理想情况下,使用 LEI 表单的功能就能百分之百满足您的集成需求,但情况并非总是如此。很多时候需要一定的业务逻辑,从一个地方读取数据、到达另一个地方之前解释或修改数据。或者需要按照某种顺序执行一些 SAP BAPI 来完成一项任务。比方说,从 SAP 上修改给定雇员的 HR Master Data 之前必须锁定该雇员,然后修改,完成后再解除锁定。必须在一个 SAP 连接中执行这三个动作。对灵活性的要求高于 LEI 活动。在 LEI 活动中,每次只能使用一个 BAPI。 一种办法(非常好的办法)是让 SAP ABAP 人员创建包装器 BAPI,一步完成需要的三个动作,但是如果做不到,可以编写 LotusScript 来满足要求。
我们后面将举一个这样的例子。首先用 LotusScript 来实现,然后假设 ABAP 人员编写了漂亮的包装器能够一次完成三个步骤,从而说明使用 LEI 来完成这样的任务是多么简单。不过,我们首先要介绍 LCLSX 的强大功能。LCLSX 是一种传统的 LotusScript 扩展,专门为企业系统设计的。目标设计非常适合用于 RDBMS 连接程序。也可使用 SAP Connector,但有时候 RDBMS 模型更彻底,后面我们将会看到。
LCLSX 有两种强大的功能是其他 LSX 没有的:
- 连接池。可以缓冲和重用非常耗时的连接,从而提高性能,减少新建连接时要执行的活动(如安全登录到企业系统)。这些连接不局限于 LotusScript 的作用域,实际上在进程级别上维护。只要 Domino 服务器进程或者 Notes 客户机进程在运行,连接池就存在。
- 数组读/数组写。LotusScript 是一种解释语言,就是说运行起来要比编译程序慢。假设要读取包含 100,000 个记录的 DB2 表,并把每个记录中的数据写入一个新的 Notes 文档。在 LCLSX 之前,需要在 LotusScript 中使用执行 100,000 次的循环来完成。LCLSX 从 DB2 表中读入第 1 到第 1000 个记录(单个 LotusScript 步骤),并同时将这些记录插入 Domino 数据库。我们读取一个记录数组,然后写入该数组。LotusScript 循环执行 100 次而不是 100,000 次。在底层使用编译程序执行这类重复性的工作可以极大地改善性能。
|
Lotus Connector for SAP with MTA and Workflow
Lotus Connector for SAP with MTA and Workflow 是捆绑到一起的三种不同产品。最主要的组件是 Lotus Connector for SAP。当与 LEI、DECS、 LCLSX 一起使用时,这个连接程序允许访问 SAP 应用程序服务器上的 RFC、BAPI 和 Transaction。而且不限于单个模块,因为 SAP 提供了连接接口。这是一种通用的方法,如果愿意,可以连接到所有模块。这些 RFC 和 BAPI 可以从 SAP 读写。事务写入 SAP,但是可以返回状态或者简单的信息。SAP 提供了数千种 RFC,事务甚至更多。从我们的角度(即远程访问编程接口的角度)来看,RFC 与 BAPI 之间没有区别。所有的 BAPI 都是 RFC。
下一个组件是 Domino MTA for R/3,提供了 Lotus Domino 与 SAP 之间的邮件连接。它提供了标准的邮件需求,如传送确认、收到答复和其他功能。很多客户已经使用该产品多年了。
最后一个组件是 Domino Access to SAP Business Workflow。这是一个用 SAP Connector 建立的 LCLSX 应用程序。它可以让您在 Notes Inbox 中看到 SAP 工作项。在这里,从 SAPGUI 的对话框实例通过单击可以处理给定的工作项。登录并打开工作项 Inbox 和执行工作项都可以通过单击完成。处理完工作项之后,就返回到 Notes 客户机。这个产品很简单,但是如果与 Domino MTA for R/3 or SMTP with SAP 4.7 Enterprise 结合起来,就提供了统一的 Inbox。在这里可以查找 Notes 邮件、Domino 工作流、SAP 邮件和 SAP 工作流。
更多信息,包括演示程序、客户评价和白皮书,请访问 Lotus Enterprise Integration 主页。
|
我们来看一看与 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。
上图中可以看到访问 SAP 需要的所有连接信息和要访问的 RFC 名称,即 RFC_READ_TABLE。这里 PA0006 已经连接到了 RFC_READ_TABLE 的后端。这样将使 SAP 连接程序以表 PA0006 的格式提供数据,而不是 RFC_READ_TABLE 自己提交通常使用的表 DATA。
然后定义到 Notes 数据库的连接,它将作为 Notes 用户社区的前端,如图 3 所示。
该例中只需要包含 Domino 服务器名和数据库文件名。在 Data Creation 选项卡中可以找到支持的快速应用程序开发(RAD)选项。
Create Database 选项告诉 LEI 如果数据库不存在则创建它。这个数据库并不完善(除非定义了使用的模板),但是可以作为 LEI 的基础完成以后的设计工作和保存数据。
接下来需要一个 LEI 活动。为了使这个例子尽量简单,我们使用 Direct Transfer 活动。在实际的解决方案中,可能需要选择 Replication 活动,因为它非常适合保证随着时间的变化应用程序仍然能够得到 SAP 的支持。
该活动以 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。
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 所示。
现在,只需要一个使用该连接的新 LEI Direct Transfer Activity 了。
图 8. 使用 BAPI 连接的 Direct Transfer Activity
可以看到,这里从 Notes 中读取所有字段 HASBEENCHANGED="1" 的 Empolyee 表单,然后将这些文档中的字段发送到 Z_BAPI_ADDRESSEMP_CHANGE。
为了检验操作是否成功,可以使用 Direct Transfer 活动的输出参数特性。
选中选项“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 提供的每个模块。