© IBM公司版权所有,2003年。保留所有权利。
将现有的企业应用(比如SAP®、PeopleSoft®和Siebel®)移植到portlet,成功与否取决于创建和部署这些portlet的速度。使用新的IBM Application PortletBuilder,您可以创建与企业应用功能相当的portlet,而且毫不费劲。
本文讲述如何运用专为SAP而设计的IBM Application Portlet Builder(以下简称为Portlet Builder)来创建portlet以访问SAP。在学完了本文的三个示例之后,您将会熟悉PortletBuilder的使用。首先,您将回顾使用PortletBuilder提供的XML模板来创建一个简单的Human Resources portlet;接着,您将一步一步地了解为Material Management portlet创建自己的XML文件以认可购买请求的过程;最后,您将看到如何快速地构建两个SAP portlet以开发Click-to-Action功能。
本文面向的读者应该对portal管理有一定了解,并具有一些SAP的基础知识。Portlet Builder是WebSphere® Portal Application Integrator的一个组件,您可以从 WebSphere Portlet Catalog下载。
安装IBM Application Portlet Builder for SAP
关于Portlet Builder的详细安装说明在WebSphere Developer Domain WebSphere PortalZone的 文档链接中。您可以找到SAP的具体配置说明。为了直观起见,图1显示了SAP Business ObjectBuilder,图2显示了配置屏幕(对于字段的描述也可以在文档中找到)。
图1. SAP Business Object Builder页面
图2. 参数配置
您将要创建的SAP Human Resources portlet是CostCenter的List Employee。您将根据搜索条件显示雇员的列表。
- 在SAP Business Object Builder页面上单击 Create new portlet按钮。
- 填
入MyHRPortlet作为portlet的名称,然后输入适合于您的环境的连接信息。认证信息可以现在添加,也可以稍后再添加,这取决于您所选择的选项,是否提示用户输入ID/Password,或是否提供UserID/Password。
图 3. 连接信息和Portlet名称
- 单击
Next按钮,
然后单击
Create new business object按钮,以创建业务对象。一个portlet可以包含多个业务对象。为了简单起见,我们将只在本例中创建一个portlet。
图 4. 创建新的业务对象
- 从列表中选择一个业务对象XML文件。XML文件为构建业务对象提供配置信息,包括BAPI(Business Application Programming Interface)、输入参数、输出参数、视图信息和映射的Java类。在本例中,选择
SAPListEmployeesByCostCenter.xml。
图 5. 选择业务对象XML文件
- 单击
Next按钮,然后选择
Allowed actions => Search。在本例中,我们只想列出雇员的信息,因此,
Update、
Create和
Delete都不需要。
图 6. 选择Action
- 单击
Next按钮以组成您自己的业务对象。选择业务对象所需要的字段。如果您想显示一个不同的列标题,可以改变
Display name的文本。
Field behaviour决定了每个字段的访问属性。
Summary显示了搜索后特定纪录的概述。
Searchable字段允许只有这些字段才可以用于搜索。可以用
Type和
Namespace来使字段能够Click-to-Action。
图7. 构建业务对象
- 单击
Next按钮,然后单击
Finish按钮,以完成整个过程。
图8. 完成业务对象的构建
- 以管理员用户的身份登录到Portal Server,以把 MyHRPortlet添加到页面中。
- 转到portlet页面,然后单击右上方角的 Edit按钮。
- 输入SAP User ID和 Password。
- 单击
Save按钮。
图9. 输入SAP用户ID和密码
- 对于Cost Center,输入
1000。 - 单击
Search按钮以搜索雇员。
图10. 通过Cost Center搜索雇员
搜索返回低于Cost Center 1000的8个雇员的信息摘要。
图 11. 低于Cost Center 1000
的雇员的列表
- 选择一个雇员并显示其详细信息。
图 12. 雇员的详细信息
构建Purchase Requisition Collective Approval portlet
可以用Portlet Builder创建包含SAP业务对象数据的XML文件来生成新的SAP portlet。要创建包含SAP业务对象数据的XML文件,您需要定义业务场景,确定SAPBAPI,并指定关键的导入和导出数据。本例介绍了创建一个portlet以使SAP用户能够认可Purchase Requisitions的必要步骤。
您需要定义业务需求和场景用以创建一个新的portlet。典型的需求包括SAP功能域名称(比如,Material Management中的Purchase Requisition Approval)、用户输入数据、输出数据和预期的屏幕流。在这个场景中,您希望尚待认可的SAP购买请求显示在portal上,这样用户就可以发布个人的行式项目(lineitem)。如果需要的话,用户应该可以重新设置认可状态。SAP用于项目级认可的交易代码是 ME55。
必须确定需要满足已定义的业务需求的BAPI。要检索SAP BAPI的详细信息,用户必须运行SAP中的交易代码BAPI。使用以下BAPI来实现为购买请求发布portlet定义的动作:
- BAPI_REQUISITION_GETITEMSREL:集体显示尚待发布的行式项目
- BAPI_REQUISITION_RELEASE:设置Release
- BAPI_REQUISITION_RESET_RELEASE:重新设置Release
通过加进一些关键的信息,比如业务场景、BAPI名称、导入和导出数据以及交易数据行为(显示、更新、创建、删除等等),可以最终确定新的portlet规范。所提供的XML文件就是构建在这些规范的基础上的。Data Input
在本例中,允许用户在portlet中输入下列数据:
- Release Code(发布代码)
- Release Group(发布组别)
这是应该显示在portlet上的数据,以供用户检查:
- Requisition Number(请求单号)
- Item Number(项目编号)
- Document Type(文档类型)
- Purchasing Group(购买组别)
- Person Who Created the Object(创建对象的人员)
- Requisitioner(请求者)
- Requisition Date(请求日期)
- Material Number(材料编号)
- Description(描述)
- Quantity(数量)
- Unit of Measure(度量单位)
- Price(价格)
- Currency(货币)
- Price Unit(价格单元)
- Delivery Date(交付日期)
- Account Assignment(指定帐户)
- Plant(工厂)
构建Purchase Requisition Collective Approval XML文件
下面的XML文件包含SAP BAPI和Portlet Builder所需要的其他信息。
<?xml version="1.0" encoding="UTF-8"?>
<sapcfg>
<retrieve>
<bapi name="BAPI_REQUISITION_GETITEMSREL" post="n" pre="n"/>
<input>
<field name="REL_GROUP" ref="Release Group"/>
<field name="REL_CODE" ref="Release Code"/>
<field name="ITEMS_FOR_RELEASE" ref="Display Mode" value="X"/>
</input>
<output>
<table name="REQUISITION_ITEMS">
<field name="PREQ_NO" ref="Requisition Number"/>
<field name="PREQ_ITEM" ref="Item Number"/>
<field name="DOC_TYPE" ref="Document Type"/>
<field name="PUR_GROUP" ref="Purchasing Group"/>
<field name="CREATED_BY" ref="Person Who Created the Object"/>
<field name="PREQ_NAME" ref="Requisitioner"/>
<field name="PREQ_DATE" ref="Requisition Date"/>
<field name="MATERIAL" ref="Material Number"/>
<field name="SHORT_TEXT" ref="Description"/>
<field name="QUANTITY" ref="Quantity"/>
<field name="UNIT" ref="Unit of Measure"/>
<field name="C_AMT_BAPI" ref="Price"/>
<field name="CURRENCY" ref="Currency"/>
<field name="PRICE_UNIT" ref="Price Unit"/>
<field name="DELIV_DATE" ref="Delivery Date"/>
<field name="ACCTASSCAT" ref="Account Assignment Category"/>
<field name="PLANT" ref="Plant"/>
</table>
</output>
</retrieve>
<udf_release>
<bapi name="BAPI_REQUISITION_RELEASE" post="n" pre="n"/>
<input>
<field name="NUMBER" ref="Requisition Number"/>
<field name="REL_CODE" ref="Release Code"/>
<field name="ITEM" ref="Item Number"/>
</input>
<output>
<field name="REL_STATUS_NEW" ref="Released"/>
</output>
</udf_release>
<udf_resetrelease>
<bapi name="BAPI_REQUISITION_RESET_RELEASE" post="n" pre="n"/>
<input>
<field name="NUMBER" ref="Requisition Number"/>
<field name="REL_CODE" ref="Release Code"/>
<field name="ITEM" ref="Item Number"/>
</input>
<output>
<field name="REL_STATUS_NEW" ref="Released"/>
</output>
</udf_resetrelease>
<mapping>
<map name="Release Group" class="java.lang.String" inSummary="n"
isComputed="n" isEditable="n" isKey="y" isPadded="y" isPrimaryKey="n"
isRequired="n" isVisible="y" addSearchParamToBO="y"/>
<map name="Release Code" class="java.lang.String" inSummary="n"
isComputed="n" isEditable="n" isKey="y" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y" addSearchParamToBO="y"/>
<map name="Display Mode" class="java.lang.String" inSummary="n"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="n"/>
<map name="Released" class="java.lang.String" inSummary="y" isComputed="n"
isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n" isRequired="n"
isVisible="y"/>
<map name="Requisition Number" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="y"
isRequired="n" isVisible="y"/>
<map name="Item Number" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="y"
isRequired="n" isVisible="y"/>
<map name="Document Type" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Purchasing Group" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Person who Created the Object" class="java.lang.String"
inSummary="y" isComputed="n" isEditable="n" isKey="n" isPadded="n"
isPrimaryKey="n" isRequired="n" isVisible="y"/>
<map name="Requisitioner" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Requisition Date"
class="com.ibm.wps.portlets.businessobject.sap.types.SAPDate"
inSummary="y" isComputed="n" isEditable="n" isKey="n" isPadded="n"
isPrimaryKey="n" isRequired="n" isVisible="y"/>
<map name="Material number" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Description" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Quantity" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Unit of Measure" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Price" class="java.lang.String" inSummary="y" isComputed="n"
isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n" isRequired="n"
isVisible="y"/>
<map name="Currency" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<map name="Price Unit" class="java.lang.String" inSummary="y"
isComputed="n" isEditable="n" isKey="n" isPadded="n" isPrimaryKey="n"
isRequired="n" isVisible="y"/>
<fixed>release|Release</fixed>
<fixed>resetrelease|Reset Release</fixed>
</map>
</mapping>
</sapcfg>
|
要生成Purchase Requisition Collective Approval portlet,需要执行以下操作:
- 把XML文件(也可以通过
下载文件得到)复制到WebSphere安装路径中运行BusinessObject Builder portlet的
sap_config目录,例如, WAS-Instal-Path\installedApps\BOBuilderPortlet_WPS_PA_158.ear\BOBuilderPortlet.war\sap_config 。 - 按照前面的示例创建Purchase Requisition Collective Approval portlet。
- 选择允许的动作, Search和 Update。
- 将portlet放在一个portal页面中,然后输入连接信息,如前面的示例所描述。
- 为 Release Group和 Release Code输入值。
- 单击
Search按钮。一个Purchase Requisition纪录的列表会显示出来。
图13. 购买请求集体认可搜索页面
- 选择一个纪录。所选纪录的详细信息会显示出来。
图14. 购买请求集体认可显示页面
- 选择动作 Release,然后单击 OK按钮。
图15. 购买请求集体认可详细信息页面
被选的纪录会被标记一个 X 以指示它被发布。
图16. 购买请求集体显示页面
运用Click-to-Action构建SAP Portlet
这个过程通过两个SAP Internal Order portlet演示了Click-to-Action的功能。再一次按照第一个示例并使用PortletBuilder创建一个SAP portlet以列出内部订单。
- 在创建业务对象的步骤中,为Click-to-Action选择 Order Number。
- 在Order Number字段的那一行中,为
Type输入一个值,比如,
orderNumber。 - 为
Namespace输入一个值,比如,
sap.test。
图17. 列出内部订单
现在,创建第2个SAP portlet以显示内部订单的详细信息。
- 按照您在第一个portlet中所做的那样为 Type和 Namespace输入同样的值。
- 将上面两个portlets并排添加到一个页面中。
- 输入值以列出内部订单。
- 单击一个订单号码旁边的一个小图标,然后选择
Get SAP Internal Order Details,以在第2个portlet中显示详细信息。
图18. Click-to-Action
图19. 内部订单详细信息
IBM Application Portlet Builder是WebSphere Portal ApplicationIntegrator的一个组件,它可以与IBM WebSphere Portal一起帮助成功地集成关键的企业应用。Portlet Builder使用起来很直观并且很简单。它使您能够创建portlet来访问和操作企业应用中的数据,而不需要了解这个系统的编程知识。通过选择在企业应用程序中可用的业务对象,您可以指定哪些数据字段应该在portlet中显示。
| 名字 | 大小 | 下载方法 |
|---|---|---|
| SAPPurchaseReq.zip | 0.1 MB | HTTP |
-
IBM WebSphere Portal Family
-
IBMWebSphere Portal Toolkit
-
WebSphere Portal Application Integrator (WPAI)
-
访问 SAP 系统 - 第 2 部分:用 WebSphere Studio Application Developer 和 WebSphere Adapter for mySAP.com 构建 SAP 应用程序
Fetchi Chen是位于IBM Austin的IBM Software Services for WebSphere的顾问。他已经有超过20年的软件开发经验。他设计了许多系统软件,并且为许多不同行业的公司提供过解决方案。他是IBM认证的WebSphere Portal解决方案开发人员,还是Sun认证的J2EE Enterprise Architect。Fetchi在Penn State大学获得硕士学位。您可以通过 fchen@us.ibm.com与他联系。