级别: 中级 Hardy Groeger, 经过认证的高级 IT 架构师, IBM Corporation
2009 年 9 月 10 日 通过使用 IBM® 和 SAP® 合作开发的 Alloy™ 1.0,企业用户可以在自己的 IBM Lotus Notes® 环境中轻松访问 SAP 软件和信息,在线和离线都一样方便。除了请假、差旅和报告管理之外,Alloy 还可以在用户的 Lotus Notes 收件箱中引入在 SAP 业务流程中定义的定制工作流决策步骤。本文通过一个简单的客户示例解释实现这种定制工作流决策的必要步骤。
尽管提到 SAP ERP 系统和 SAP Netweaver 内部的必要步骤,但本文主要讲解 Lotus Notes 内部的必要定制。
示例场景:简单的材料主数据创建审批
在这里我们不是实现一个复杂的业务工作流,而是关注关键步骤并选择一个简单的场景。我们假设客户需要在 SAP ERP 后端网络或服务器控制材料主数据(事务 MM01)的创建,因此需要创建一个业务工作流来根据每个材料主数据的创建触发决策步骤。决策步骤的惟一目的是批准或拒绝新的材料。除了材料业务对象的标准属性之外,还定义了其他一些属性(比如重量和重量单位),并将其传递给 Lotus Notes 的审批者,如图 1 所示。
图 1. Lotus Notes 收件箱中的定制材料审批决策
根据关于最新创建的材料的信息,审批者可以直接在 Lotus Notes 收件箱中做出决策,并且在 SAP 中执行相应的批准或拒绝。要实现这个场景,需要在 SAP ERP、Netweaver、Lotus Notes 和 IBM Lotus® Domino® 中执行几个步骤。
在 SAP 中设置审批工作流
因为要在新的材料中表示其他数据属性,所以首先要在 SAP ERP 中创建一个新的业务对象子类型,并创建其他属性。要确保在创建这个业务对象子类型的一个实例时触发定制审批工作流,您还需要创建相应的事件链接。
此外,您需要使用 SAP Workflow Builder 创建样例审批工作流。在 SAP Developer Network (SDN) 的 博客条目 上介绍了创建容器元素、属性、工作流定义和前面提到的步骤的详细说明。
为简单起见,这个示例不实现复杂的代理决策,即材料创建的发起者同时也是审批者。很明显,这种方法对产品审批工作流没有意义。
现在已经定义好所需的业务对象和工作流,那么需要确保将审批决策发送到 Alloy,然后再进入审批者的 Lotus Notes 收件箱。对于这个实践,也不需要实现任何复杂的场景,包括 SAP 端的代码编写和建模;您仅需使用 SAP Information Worker Implementation Guide 中的工作流模式定制提供的标准出站/入站处理。
工作流模式定制负责定义工作流应用程序、向 Alloy 公开的决策步骤和出站/入站处理的特定设置。从 Lotus Domino 的角度看,应用程序 ID 和群件绑定项类型是 SAP 端最重要的设置。应用程序 ID 用于在 Lotus Domino 上的 Alloy 中查找相应的应用程序配置,而群件绑定项类型的值用于将进入的消息映射到 Lotus Notes 中的一个特定表单,以呈现数据。在这个示例中,将应用程序 ID 指定为 ZMATCR,而群件绑定项类型指定为 MaterialMasterCreationWorkflow.ApproverTask。可以在 SDN 上的 博客条目 中找到 SAP 中的工作流模式定制的详细说明。
在 Lotus Notes 和 Lotus Domino 中配置和定制审批处理
现在已经在 SAP 端实现了材料创建工作流,那么将需要在 Lotus Domino 上配置 Alloy,以接收并适当处理进入的审批请求。Lotus Domino 上所有与 Alloy 相关的配置的中心组件就是 Alloy Lotus Domino 服务器上的 NDERP Web Service 应用程序。打开这个数据库并导航到 Applications,然后单击顶部的 New Application 按钮创建一个应用程序配置文档。在 NDERP Web Service 应用程序中,每个定制工作流决策必须由它自己的应用程序配置文档表示;图 2 给出了一个示例配置文档。
在 Application Properties 字段中,从应用程序的下拉列表指定 Customized Decisions。在 Application key 字段中,输入您刚才在 ERP 后端网络的工作流应用程序中为应用程序 ID 指定的值(在本例中为 ZMATCR)。这个应用程序 ID 将 SAP 中的工作流应用程序映射到 Lotus Domino 中的已配置 Alloy 应用程序。
在 Application Name 字段中输入的值用于描述发送到用户收件箱的审批工作项,以及描述 Alloy 管理用户界面的角色分配。
到目前为止,您已经在 SAP 中实现的工作流应用程序和 Lotus Domino 上对应的 Alloy 应用程序之间配置了必要的映射。但是您还需要定义如何在 Lotus Domino 中呈现进入的数据。通常使用 Lotus Domino 中的表单呈现文档;因此,您需要指定进入消息的类型,以及在用户的邮件文件中用什么形式呈现它。在这里需要用到先前为 SAP ERP 后端网络中的群件绑定项指定的值。
图 2. Lotus Domino 中的定制工作流应用程序配置
在 Bound Item Type 字段中输入 MaterialMasterCreationWorkflow.ApproverTask,并将 Form name 设置为 (GenericCustomApprovalWorkflow)。您可以通过复制默认的工作流审批表单 (ERPApprovalWorkflow) 创建这个隐藏的表单,默认的审批表单是 Alloy 模板扩展的一部分,并且为任意审批消息提供标准的显示。确保您创建的是一个副本,而不是直接使用 (ERPApprovalWorkflow),这样才能在保留原始表单的同时将更改最小化,从而避免升级到未来的 Alloy 版本时出现问题。
尽管我们的示例并未用到最后两个字段(Status update form name 和 Custom agent),但它们很重要,因此需要解释一下。当这个工作流应用程序的状态更新消息需要在用户的邮件文件中显示时,可以使用 Status update form name 字段指定一个所需的定制表单。这个选项允许为状态更新消息实现定制控件和表单逻辑。
Custom agent 设置就更加强大了。可以使用该设置以编程的方式控制进入的消息中的数据元素,它们由工作流的审批表单显示。注意,如果要使用代理,您必须熟悉 SAP 系统中针对这种类型的数据的内容和规则,并且能够轻松地在 IBM Lotus Domino Designer 中创建代理。使用定制代理的一个常见场景是名称查找,其中 SAP 用户可以以 SAP 用户 ID 的形式在进入的消息中呈现出来。这种代理以编程的方式查找对应的 Lotus Notes DN 或其他名称格式,并将其添加到消息中。
现在保存并关闭新的应用程序,然后等待出现通知 “已成功保存应用程序”。
总结一下,到目前为止您已经在 SAP 中创建了一个新的工作流应用程序,包括一个面向用户的决策步骤、在 Domino Lotus 上配置 Alloy 以接收来自工作流的审批消息,以及指定一个尚未创建的表单用于呈现审批消息。现在您不仅需要创建这个定制表单,而且由于您为 SAP 中的工作流容器指定了扩展属性,所以希望 Lotus Notes 中的审批者能够访问这些额外的数据元素。他们在决定审批或拒绝时可能需要这些信息。
如前面定义的一样,在 Lotus Notes 中使用一个称为 (GenericCustomApprovalWorkflow) 的表单呈现进入消息。我们仔细看看创建这个表单的详细步骤。作为 Alloy 安装的一部分,您将 Alloy 邮件设计元素合并到组织的邮件模板中。在 Lotus Domino Designer 中打开包含 Alloy 设计元素的主邮件模板,然后找到表单 (ERPApprovalWorkflow) 并创建它的一个副本(例如,先按 Ctrl+C 再按 Ctrl+V)。见图 3。
图 3. 创建 (ERPApprovalWorkflow) 表单的一个副本
在粘贴该副本之后,Lotus Domino Designer 会询问是否将未来对原始表单的更改应用到这个副本。单击 No,然后将表单重命名为 (GenericCustomApprovalWorkflow)。此外,也将表单别名重命名为 GenericCustomApprovalWorkflow。然后,在 Lotus Domino Designer 中打开该表单并仔细查看它的内容。如图 4 所示。
图 4. Lotus Domino Designer 中的 (GenericCustomApprovalWorkflow)
如您在图 4 所见,作为 (ERPApprovalWorkflow) 表单的一个副本,(GenericCustomApprovalWorkflow) 表单非常简单。它包含批准或拒绝操作按钮、一个头部区域、一个评论区域和一个主体内容区域。要让这个表单显示额外的材料信息,您需要在 Lotus Domino Designer 中定制它。
为了简化定制工作流决策解决方案的重用,您不希望将定制字段和表单逻辑直接插入到该表单;相反,您可以利用计算子表单这种方法。对于任何仅需显示与工作流相关的额外数据(而不是复杂的表单或业务逻辑)的工作流应用程序,这种方法允许您使用 (GenericCustomApprovalWorkflow)。在 Lotus Domino Designer 中打开表单 (GenericCustomApprovalWorkflow),将鼠标指针移动到 body 字段下面,然后从主菜单选择 Create\Resource\Insert Subform,从而启动一个允许插入子表单的窗口。在这个窗口中,确保您选择 Insert Subform based on formula 选项,如图 5 所示。
图 5. Insert Subform 窗口
将 BoundItemType 指定为计算子表单的默认值,如图 6 所示。BoundItemType 是一个 Lotus Notes 项,当处理来自 SAP 的消息时,Alloy 将自动将其添加到 Lotus Notes 文档。这个项包含的值与在 NDERP Web Service 应用程序的配置中为 Bound Item Type 指定的值相同。
图 6. (ERPApprovalWorkflow) 中的计算子表单
使用这种方法您可以在独立的子表单中实现特定的数据处理,而不是在通用 (GenericCustomApprovalWorkflow) 表单中,其中每个子表单对应于一个绑定项类型(表示进入的审批消息的特定类型)。在这个例子中,期望的绑定项类型为 MaterialMasterCreationWorkflow.ApproverTask;因此,您需要创建一个具有相同名称的子表单。在 New Subform 窗口的 Name 字段输入 MaterialMasterCreationWorkflow.ApproverTask,如图 7 所示。
图 7. 创建新的子表单
在 Lotus Notes 中,表单和子表单用于呈现包含在 Lotus Notes 文档中的数据。在这个例子中,在 (GenericCustomApprovalWorkflow) 表单处理所有与工作流相关的数据,而用新的子表单呈现建模到 Workflow Container 中以表示材料业务对象的特定信息。现在在 Lotus Notes 中,如何访问在 SAP 工作流容器中指定的属性?
默认情况下,Alloy 为在 SAP 中对应的工作流容器中定义的每个元素创建 Lotus Notes 项。在这个例子中,就是 ZMaterialNumber 和 ZMaterialText 等的元素。为了避免命名冲突,Alloy 为这些字段加上前缀 WorkflowContainer00,这样材料号码的值就存储在一个称为 WorkflowContainer00ZMaterialNumber 的项中。您需要做的仅是在新的子表单中创建表单字段,以引用由 Alloy 创建的对应 Lotus Notes 项。在这个例子中,您希望呈现一个表,它包含来自 SAP 的新材料的所有相关信息。
使用常规的 Lotus Domino Designer 控件创建一个带有两个列的表,一个列保存标签,另一个列保存包含数据值的字段。将每个字段创建为计算(computed)文本(text)字段,如图 8 所示。
图 8. ZMaterialNumber 的字段属性
注意图 9 中突出显示的部分;表中的每个字段都指向使用特定于 Alloy 的前缀的对应工作流容器元素。您可能已经注意到,这个示例表单使用的扩展材料属性与前面提到的 SDN 博客条目中的属性有所不同。这些额外的元素本应该添加到 SAP ERP 中的业务对象子类型和工作流容器。
图 9. 显示扩展材料信息的表
除了工作流容器字段之外,图 10 还显示了另一个字段。ZSenderName 字段演示了 IBM Lotus Sametime® 的集成特性,您可以在 Alloy 解决方案中使用它们(要求 Lotus Sametime 服务器可用并正确配置)。
图 10. 针对请求者名称的 Lotus Notes 字段
在工作流定义中,除了其他业务对象数据之外,您还可以传递用户信息(表示为 SAP 用户 ID),以在您的审批表单中显示这些用户的 Lotus Sametime 在线状态。Lotus Notes 要求为 Lotus Sametime 感知启用的字段的类型为 Name,然后获取由 SAP 传入的值并查找该 SAP 用户的 Notes 名称。要使 Alloy 正常工作的一个要求是为 Alloy 用户将 SAP 用户名添加到 Lotus Domino 人员文档。这样,就可以使用一个简单的 LotusScript® 代理查找给定 SAP 用户 ID 的 Lotus Notes 名。为简单起见,我们不在这里讨论代理的脚本,但要注意,必须在 NDERP Web Services 应用程序中的工作流应用程序文档中引用代理。
最后,如果您还没有这样做,请保存并关闭新的子表单和 (GenericCustomApprovalWorkflow) 表单。
其他 Alloy 配置
我们已经准备好了吗?还不是很彻底。我们总结一下成果:在 SAP 中实现了后端工作流、在 Lotus Domino 中的 Alloy 上配置了对应的应用程序,并实现一个定制表单或子表单,可以从进入的审批消息中显示额外的数据。但是 SAP 和 Lotus Domino 如何确定谁向谁发送审批消息呢?
在 Alloy 中的一个设计原则是,全部业务逻辑都由 SAP 所有并管理,而不是 Lotus Domino。因此,需要在 SAP 中配置对应的角色数据。更具体一些,就是需要在 SAP User Management Engine (UME) 中配置应用程序角色,UME 是 SAP Netweaver 平台的一部分。注意,只有在 Lotus Domino 上的 Alloy 中配置了工作流应用程序之后,才能完成该配置。如果在 NDERP Web Service 应用程序中存在应用程序条目,Alloy 将在该条目和 Netweaver 上的 Alloy 管理之间进行同步,然后会在 Netweaver 上的 Alloy 管理 UI 上出现一个相应的条目,可以通过默认的 URL 访问:http://<j2ee-engine>:<port>/alloy。
可以在 SDN 上的 博客条目 中找到如何将所需的应用程序角色映射到 UME 中的用户组的详细说明。
您将能够测试新的定制工作流应用程序。测试完整的操作流程非常重要,即从工作流发起开始,接着在 Lotus Domino 中发送和处理审批消息,然后再在 SAP 中处理审批决策。
结束语
在本文中,我们描述了在 Alloy 1.0 中实现定制工作流决策场景的所有必要步骤。为了强调关键的方面,我们简化了几个地方,这可能在生产解决方案中是不可行的。其中一处是示例 SAP 工作流中的代理确定。另外,在很多情况下,您可能需要将现有的工作流公开到 Alloy,而不是在 SAP 中修改现有的工作流定义,或甚至创建新的工作流定义。对于这些情况,您必须在 SAP ERP 后端网络中用代码编写定制的出站和入站处理。SDN 上的 博客条目 解释了详细的实现步骤。
参考资料
关于作者  | |  | Hardy Groeger 是一位经过认证的高级 IT 架构师,目前担任欧洲 IBM Software Services for Lotus 的服务解决方案架构师,主要研究 Lotus 产品组合的应用程序架构和开发。自 2001 年加入 IBM 以来,他在产品开发和服务部门担任过各种职位。在加入 IBM 之前,他是德国一家 Lotus 商业合作伙伴的项目开发经理,擅长集成 SAP R/3 和 Lotus Domino。 |
对本文的评价
|