技术开发 频道

IBM WPF快速集成Oracle EBS


【IT168 专稿】

    摘要:本文通过实战探讨利用IBM Websphere Portlet Factory(WPF)集成Oracle E-Business Suite(EBS),内容涉及WPF的相关概念,WPF中的服务构建器的使用,集成Oracle ERP的方法,Oracle接口表使用,Porlet的创建及部署等。

    Websphere Portal作为广泛使用的门户解决方案,从6.0版本开始,提供WPF作为Portlet开发工具。WPF针对SAP、Lotus Domino、Excel、Siebel、PeopleSoft等提供了相应的适配器,但目前尚未发布针对Oracle EBS的标准适配器。本文通过利用WPF开发工具,结合OracleEBS提供的标准接口,快速开发,无需编码,即可实现对OracleEBS的CRUD(Create-Read-Update-Delete,把OracleEBS中的业务功能集成到企业统一门户。

1. WPF简介

   WebSphere Portlet Factory软件包括一个框架和一组为了快速创建和维护定制portlet的工具。利用WebSphere Portlet Factory的框架和工具,开发人员可以通过托拽一系列高度适应、可重用的软件组件(被称作构建器,builder)快速地搭建portlet。用户将构建器组装到模型中,就像通过快速地将公式放在一起组成电子表格一样。这些模型接下来在运行环境中被执行来动态地生成应用代码,包括JSP,Java类和XML文档,所有这些组件(artifact)一起组成了portlet应用程序。这样,开发人员可以将动态构建portlet的流程捕获并使之自动化,而不是为每个portlet进行编程。另外,开发人员能够快速并容易地从一份基础代码中创建出多样的、高度客户化的portlet,而不需要额外的代码更改或者重新部署。

   WebSphere Portlet Factory软件包括一个易用的图形化工具叫做IBM WebSphere Portlet Factory Designer,主要用于创建、浏览和运行portlet。WebSphere Portlet Factory Designer工具无缝地融合在IBM Rational Application Developer 6和开放源码的Eclipse IDE当中。

(1) 项目导航器

   “项目导航器”表示一个树形目录层次结构,它显示组成当前项目的所有对象。可以通过浏览至一个对象(例如,模型或概要文件集)并双击它来打开该对象。对象将显示在适当的视图中。

(2) Web 应用程序树

   此视图显示构建器调用已创建并添加至 Web 应用程序对象的所有元素。这包括数据服务、事件、链接的 Java 对象、方法、页面、变量、模式等。通过浏览 Web 应用程序树并选择一个对象,可以检查该对象及其内容。

(3) 模型和概要文件集选项卡

    这些选项卡表示已打开以便进行编辑的项目模型和概要文件集。具有焦点的选项卡显示“X”并填充所有视图的内容。在这种情况下,会打开一个模型和一个概要文件集。显示星号(*)的选项卡表示模型或概要文件集中有尚未保存的更改。

(4) Web 应用程序对象查看器
“对象查看器”显示有关 Web 应用程序树中所选对象的信息。此查看器中显示的信息的格式取决于在 Web 应用程序树中选择的 Web 应用程序对象的类型。

(5) 视图选项卡

    每个选项卡打开模型的不同视图:
    Web 应用程序树形视图 - 用于处理模型的主要视图。此视图将 Web 应用程序描述为树,其中每个分支表示一种不同类型的 Web 应用程序对象。

(6) 问题视图

     Factory 使用“Eclipse 问题视图”来显示与模型生成和行为相关的警告和错误消息。特定构建器调用产生错误时,在“问题列表”中双击该错误将在构建器调用编辑器中打开相关的构建器调用以供编辑。

(7) 大纲视图

     此视图显示构建器调用列表。这是模型中每个构建器调用按编号、名称或类型排列的顺序列表。进行了概要分析的构建器调用显示一个概要分析图标。

(8) 已应用的概要文件选项卡

    使用“已应用的概要文件”选项卡可以访问用于将一个或多个概要文件应用于模型的视图。将多个概要文件应用于同一模型时,此视图还允许您管理这些概要文件的组合。


2. WPF集成Oracle EBS方法概述

    Oracle EBS是一个很庞大的体系,虽然Oracle EBS中的各种业务数据都保存在数据库中,但是EBS软件的数据库里往往有数万个对象,彼此间的关联非常密切,直接修改表内容会引起很多意想不到的问题,并且一旦出现问题,查错和恢复非常困难。因此,Oracle EBS提供开放性接口,用于和其它系统的集成。这些接口程序还用来验证输入数据的完整性,确保符合业务规则。我们对Oracle EBS接口表的更新要遵循Oracle ERP中各个接口表的约束规则。接口表的更新频率可以结合业务需求定义,一般可通过按天、小时、分钟等进行控制。

    WPF作为Portlet开发工具,自带大量构建器,从技术上讲可通过接口表、Web Service、BPEL等方式进行集成,如下为WPF所支持的集成Oracle EBS几种技术实现方法:

 IBM WebSphere Adapter for Oracle E-Business Suite -- IBM Websphere产品家族提供针对 Oracle EBS的适配器,但是该适配器需借助开发工具Websphere WID和业务流引擎来Websphere Process Server来完成,开发和部署相对复杂,技术难度也要求很高;

 Oracle BPEL Process Manager -- Oracle提供遵循BPEL标准的业务流程管理器,客户需要将集成到Websphere Portal的业务功能开发成BPEL,并通过Oracle BPEL Process Manager发布成Web Service,继而WPF访问Web Service,从而实现对Oracle EBS的集成。

 Oracle E-Business Suite Interface tables -- Oracle EBS接口表作为Oracle ERP提供的对外服务标准接口,程序可通过接口表的写入完成对业务数据的导入。对接口表的操作属于标准的SQL操作,可通过JDBC等访问驱动实现。

    上述三种情况中,前两种主要是通过Web Service 和XML Gateway实现对Oracle EBS的集成,在技术实现上更复杂,并且需要附加产品实现。而通过接口表方式实现,充分利用WPF 数据集成构建器的强大功能,结合Web Service构建组合应用,可以实现基于SOA体系的应用集成。

   本文中选用接口表方式实现Oracle EBS的集成。下面我们将通过一个实战例子阐述如何整合Oracle EBS。
  
  (1) 开发实现

    本文中选用接口表方式实现Oracle EBS的集成。下面我们将通过一个实战例子阐述如何整合Oracle EBS。
在本例子中,在Websphere Portal上集成Oracle EBS,展现物料清单在Portal中,用户根据需要修改物料信息,修改通过接口表反馈到EBS中,逻辑框架如下:


     接下来,我们逐步实现集成过程:
    1) 为Websphere Portal配置并测试Oracle EBS数据库连接池

    登录WAS管理控制台,为Websphere_Portal服务器创建名为“Oracle JDBC Driver”的JDBC提供程序,配置相应的类路径,需从Oracle EBS服务器copy /oracle/PROD/db/tech_st/10.2.0/jdbc/lib/ojdbc14.jar 到WAS所在的服务器。接下来建立数据源:
    名称:OracleEBSDataSource
    JNDI名称:jdbc/oraclesapp ---WPF连接数据库时使用此名称
    URL:jdbc:oracle:thin:@oracleerp.cn.ibm.com:1521:prod
    创建完成后,需创建J2EE 连接器体系结构(J2C)认证数据条目:
   条目名称:OracleEBS;
    用户标识:apps,
    密码:password,
    创建完成后需再次为数据源OracleEBSDataSource指派“组件管理的认证别名”值:demo/OracleEBS;
完成如上操作后测试数据源,得到连接成功后得到如下信息“在节点 demo 上的服务器 Websphere_Portal 上,数据源 OracleEBSDataSource 的测试连接是成功的”。接下来开始WPF的神奇之旅:

2) 创建WPF项目

    构建 portlet 或应用程序的第一步是创建项目。此项目将包含应用程序需要的所有工件和功能部件。要新建项目,请执行以下操作:
在设计器“文件”菜单中,选择“新建 > WebSphere Portlet Factory 项目”。
在添加功能部件集页面中,选择要包括在项目中的任何功能部件集,然后单击下一步。可以稍后将功能集添加至项目或从项目中除去功能集。
在项目服务器目标页面中,依次设置如下内容:

   服务器类型
   Portlet Factory Development WAR 位置
   已安装的应用程序目录
   应用程序名
   自动部署
   要部署到的 WAS 服务器
  “测试服务器连接”按钮
   服务器主机 - 将运行应用程序的服务器的名称
   服务器端口 - 将运行应用程序的服务器的端口号
    J2EE 版本 - 应用程序将遵循的 J2EE 规范的版本(Tomcat 上不可用)
    在 Java 设置页中,设定特定项目所需的任何设置并单击下一步。
在WebSphere Portlet WAR 设置页面中,进行下列设置:
    创建用于 WebSphere Portal 中的 portlet - 启用此框以创建 portlet WAR 文件。可以选择创建两种 portlet 之一:Java 标准 portlet API 或 IBM portlet API。如果选择创建 portlet WAR,您必须根据需要更改缺省值以符合 WebSphere 服务器配置。建议您选择 Java 标准 portlet API 以创建 portlet WAR。

    服务器可用 - 如果门户网站服务器联机并且可供部署,请启用此框。如果服务器可用,请复查 WebSphere Portal 根目录、portlet WAR 名称和 portlet WAR 位置框中的信息以确保此信息正确无误。

    自动将 portlet WAR 部署到 WebSphere Portal - 启用此框可自动将 portlet WAR 部署到 Portal Server。提供服务器的管理 URL、有效管理员用户名和密码。使用“测试管理凭证”按钮确保您提供的信息正确无误。请注意,提供自动部署可方便您用于开发设置中。不应在生产设置中为 Portal Server 启用自动部署功能。

 复查“摘要和重要详细信息”页面中显示的项目信息并单击完成创建项目。
 项目将显示在设计器导航器中。 

3) 开发呈现页面
    在本案例中,我们需要开发3个html页面,用户呈现对物料的信息类表,详细信息和内容修改页,内容分别如下:
物料列表页:
    路径:/OracleEBS/oracle_ebs/product_list.html
   内容:
(编辑在录入后台时可以使用后台编辑界面中的代码框框选)

<html> 
<HEAD>
<title>Oracle EBS - Product List</title>
</HEAD>
<body>
<div width="100%" align="center">
<h1 name="title">Product List</h1>
<br />
<table name="data" cellspacing="0" cellpadding="3" />
<br />
<span name="paging_buttons" />
<br />
<span name="back_button" />
<span name="update_button" />
</div>
</body>
</html>

物料详细信息页:
    路径:/OracleEBS/oracle_ebs/product_detail.html
   内容:
<html> 
<HEAD>
<title>Oracle EBS - Product Detail</title>
</HEAD>
<body>

<div width="100%" align="center">
<h1 name="title">Product Detail</h1>
<br />
<table name="data" />

<br />
<span name="back_button" />
<span name="update_button" />
</div>
</body>
</html>
物料信息修改页:
   路径:/OracleEBS/oracle_ebs/product_edit.html
   内容:
<html> 
<HEAD>
<title>Oracle EBS - Product Edit</title>
</HEAD>
<body>
<div width="100%" align="center">
<h1 name="title">Product Edit</h1>
<br />
<table cellpadding="0" cellspacing="2">
<form name="input_form" method="POST">
<tr>
<td colspan="2"><table name="input_data" cellspacing="0" cellpadding="3" /></td>
</tr>
<tr>
<td><span name="cancel_button" /><input type="submit" name="submit_button" /></td>
</tr>
<tr><td>&nbsp;</td></tr>
</form>
</table>
</div>
</body>
</html>
    4) 开发数据定义文件
    本案例中为了规范化数据格式定义,我们采用xml格式表述参数定义,涉及两个文件:
富文本内容约束文件:
    路径:/OracleEBS/oracle_ebs/oebs_base_datadef.xml
    内容:
<!-- These are some sample data definition types to use as base types with Rich Data Definition --> 
<DataDefinitions resources="com.bowstreet.builders.webapp.usertext.messages">
<!-- for variable-length Strings, adds case-insensitive sorting, longer edit, and left alignment-->
<DataDefinition name="oebs_base_String">
<ColumnAlignment>left</ColumnAlignment>
<ColumnSorting>Case Insensitive String</ColumnSorting>
<DataEntryControl>com.bowstreet.builders.webapp.TextInputBuilder</DataEntryControl>
<DataEntryInputs>
<Inputs>
<Input name="HTMLAttributes">
<HTMLAttributes>
<size>35</size>
</HTMLAttributes>
</Input>
</Inputs>
</DataEntryInputs>
</DataDefinition>
</DataDefinitions>

    富文本内容约束文件:
   路径:/OracleEBS/oracle_ebs/service_rdd.xml 
   内容:
<DataDefinitions> 
<DataDefinition name="Row">
<Required>true</Required>
<Children>
<DataDefinition name="INVENTORY_ITEM_ID" base="base_Integer">
<Label>ID</Label>
<Required>true</Required>
<DataType>decimal</DataType>
</DataDefinition>
………………………………………
</Children>
</DataDefinition>
<DataDefinition name="arguments">
<Required>true</Required>
<Children>
<DataDefinition name="INVENTORY_ITEM_ID" base="base_ShortString">
<Label>ID</Label>
<Required>true</Required>
<DataType>string</DataType>
<ReadOnly>true</ReadOnly>
</DataDefinition>
………………………………………
</Children>
</DataDefinition>
<BaseDefinitions>
<BaseDefinition>/WEB-INF/factory/data_definitions/base_datadef.xml</BaseDefinition>
<BaseDefinition>/oracle_ebs/oebs_base_datadef.xml</BaseDefinition>
</BaseDefinitions>
<Reorder>true</Reorder>
</DataDefinitions>
    5) 开发服务提供者模型
    我们基于面向SOA架构的方法实现对Oracle EBS的集成,在本案例中我们选择对Oracle EBS物料信息表进行物料信息呈现和修改,通过开发模型“ebsProductProvider.model”实现服务的提供,在模型中,包含服务提供定义“ebsProduct”,6个服务操作,分别是:getProducts 、updateProduct、examineInterfaceTable、checkInterfaceTable、clearProductInterfaceTable、createStoredProcedure.,用户实现对物料信息的呈现物料清单、更新物料信息、呈现接口表内容、根据物料编号检测接口表、清除接口表、创建接口表处理存储过程;以及相应的数据库操作定义,生成的Web应用程序图如下:



   开发此模型,主要步骤如下:
    创建模型
    在WPF Designer中,文件->新建->Websphere Portlet Factory模型,单击“next”,选择“Oracle EBS”项目,单击“next”,选择新建模型类型:服务提供者->数据库服务提供者,单击“next”,单击“next”,输入服务名称“ebsProduct”,单击“next”,在SQL语句中,选择数据源“jdbc/oracleapps“,单击“next”,直至出现“选择将保存此模型的位置并输入模型名称”,位置输入:“OracleEBS/WEB-INF/models/oracle_ebs”,模型名称输入“ebsProductProvider”,接下来出现如下模型开发界面,定制服务,可根据需要选择是否生成WSDL,本文中不要选择。在“接口和服务模型”中,设置存根模型“oracle_ebs/ebsProductProviderStub”,请不要选择“自动生成存根”,开发过程中可根据需要生成存根,关于存根的使用,本文将不做进一步介绍,后续系列文章中将做进一步阐述。

    接下来我们将逐一创建相应服务操作和服务操作执行的SQL调用:
创建服务操作

     我们先为操作创建名为“getProductsQuery“的“SQL调用”,在SQL调用中,输入如下SQL语句,该语句对应Oracle EBS中主组织物料清单,当然,您也可通过“数据库资源管理器”生成SQL:

select distinct a.INVENTORY_ITEM_ID , b.DESCRIPTION, a.INVENTORY_ITEM_STATUS_CODE,a.CREATED_BY,a.ORGANIZATION_ID,a.SEGMENT1 
from INV.MTL_SYSTEM_ITEMS_B a, INV.MTL_SYSTEM_ITEMS_TL b where (a.ORGANIZATION_ID=b.ORGANIZATION_ID
and a.INVENTORY_ITEM_ID =b.INVENTORY_ITEM_ID) and a.ORGANIZATION_ID=141


    接下来,创建“getProducts”服务操作:单击“Online”中的“构建器选用板”,选择“服务”->“服务操作”创建名为getProducts的服务操作:

    选择“服务操作”对应的“要调用的操作”,选择:“DataServices/getProductsQuery/execute”;
    接下来,创建服务操作“updateProduct”及相关调用;
    相关的“操作列表”:doProductUpdate,该列表顺序执行:
setProductDataStatementInvokeWithParams(${Arguments/INVENTORY_ITEM_ID},${Arguments/DESCRIPTION},${Arguments/INVENTORY_ITEM_STATUS_CODE},${Arguments/SEGMENT1}) 
setProductDataStatement2InvokeWithParams(${Arguments/INVENTORY_ITEM_ID},${Arguments/DESCRIPTION},${Arguments/INVENTORY_ITEM_STATUS_CODE},${Arguments/SEGMENT1})
DataServices/updateProductStatement/execute
    相关的“SQL调用”:setProductDataStatement,对应的SQL如下,其中TRANSACTION_TYPE为要操作的接口表处理类  型,本例为“UPDATE”,ORGANIZATION_ID为物料主主组织标号,SEGMENT1为物料代码,DESCRIPTION为物料名称,本例中将更新该信息:

INSERT INTO INV.MTL_SYSTEM_ITEMS_INTERFACE 
(
INVENTORY_ITEM_ID, TRANSACTION_TYPE, SET_PROCESS_ID, ORGANIZATION_ID, DESCRIPTION, INVENTORY_ITEM_STATUS_CODE, SEGMENT1, PROCESS_FLAG,LAST_UPDATED_BY, CREATE_BY)VALUES( ?,
'UPDATE', '100', '142',?, ?, ?, 1 ,1110, 1110)
    相关的“SQL调用”:updateProductStatement,对应的SQL为:

{call APPS.IBM_WEBSPHERE_PRODUCT_UPDATE}

    接下来,创建服务操作“createStoredProcedure”及相关调用:
    相关的“SQL调用”:createStoredProcedureStatement,对应的SQL如下,其中“ APPS.FND_GLOBAL.APPS_INITIALIZE”为Oracle EBS中SQL执行前模拟用户登录的标准方法,此案例中为模拟1110登录,访问20634模块中的401应用;APPS.FND_REQUEST.SUBMIT_REQUEST为更新接口表设置,'INV'为块,'INCOIN'为子模块,详见Oracle EBS相关资料。
CREATE OR REPLACE PROCEDURE APPS.IBM_WEBSPHERE_PRODUCT_UPDATE IS v_request_id NUMBER; 
BEGIN
APPS.FND_GLOBAL.APPS_INITIALIZE( 1110, 20634, 401 );
v_request_id := APPS.FND_REQUEST.SUBMIT_REQUEST( 'INV', 'INCOIN', NULL, TO_CHAR(SYSDATE,'DD-MON-RR HH24:MI:SS'), FALSE, '141', '1', '1', '1', '2', NULL,
'2' );
COMMIT;
END;
    创建服务操作“createStoredProcedure”,选择“服务操作”对应的“要调用的操作”,选择:“DataServices/ createStoredProcedureStatement /execute”;
    接下来,创建服务操作“clearProductInterfaceTable”及相关调用;
    相关的“SQL调用”:createStoredProcedureStatement,对应的SQL如下:
select count(INVENTORY_ITEM_ID) from INV.MTL_SYSTEM_ITEMS_INTERFACE where INVENTORY_ITEM_ID=?
    创建服务操作“checkInterfaceTable”,选择“服务操作”对应的“要调用的操作”,选择:“DataServices/ checkInterfaceTable /execute”;
 调试服务操作
     创建完成相应的服务操作后,调试该服务提供程序:
     打开该模型,单击运行,浏览器打开如下页面:




     该页面中可以注意调试6个服务,请逐一验证功能,例如“ExampleInterfaceTable”,结果如下:



     如上6个功能完成后,即开发服务使用者模块调用该服务提供。
    6) 开发服务使用者模型
     针对开发好的服务提供,我们接下来开发服务提供者模块供使用。
 创建服务使用者模型 
     在WPF Designer中,文件->新建->Websphere Portlet Factory模型,单击“next”,选择“Oracle EBS”项目,单击“next”,选择新建模型类型:服务使用者->列表和详细信息服务使用者,输入名称“ebsProductEdit”,选择对应的服提供者模型oracle_ebs/ebsProductProvider:
 创建页面:
     利用构建器创建页面:
     输入如下信息:
    名称:products
    视图数据操作:DataServices/ebsProduct/getProducts
    视图页HTML:/oracle_ebs/product_list.html
    HTML模板文件:/oracle_ebs/product_list.html
    分页数据显示:选中
    每页的行数:20
    创建指向详细信息的链接:选中
    详细信息链接列:DESCRIPTION
     详细信息操作类型:直接从所选行中获取详细信息数据
    详细信息页HTML: /oracle_ebs/product_detail.html
    HTML模板文件:/factory/html_templates/gridtable.html
    上一页按钮文本:Back
    创建更新页:选中
    更新方法:DataServices/ebsProduct/updateProduct
     更新下一个操作: products_ViewPage
    数据初始化:使用结果数据填充表单字段
    更新页HTML:/oracle_ebs/product_edit.html
    启用更新验证:选中
    更新导航文本:Edit
    更新提交文本:Submit
    更新取消文本:Cancel
     生成Mail:选中
    为了在程序第一次执行是在服务器上创建接口表处理存储过程,我们需利用构建器创建名为“createStoredProcedure的事件处理程序:
    输入相应属性值为:


    接下来我们可运行调试该程序:



3. 封装成Portlet部署到Websphere Portal
     开发完成后,我们需在讲服务封装为Portlet,部署到Portal中应用。
    1) 封装Portlet
     我们可以利用WPF Portlet构建构建Portlet:
     在模型ebsProductEdit中,我们利用Portlet适配器创建部件:
     Portlet配置信息如下:


    这样,就完成了Portlet的定义,接下来,我们将程序打包发布:

    2) 打包发布
    在项目“Oracle EBS”右键单击,选择“重建WAR”,选择“重建 Portlet WAR”

    3) 程序部署到Portal
    发布完成后,生成程序包位与C:\IBM\WebSphere\PortalServer\installableApps\WPF-OracleEBS.war 
    启动并登录Websphere Portal,发布应用程序,发布后可见该程序包已包含Portlet ebsProductPortlet: 
    单击权限控制按钮即可进行权限管理:

    4) Portlet部署到页面 
    接下来将该Portlet部署到页面:



    部署完成后即可访问Portlet所在的页面:



    5) 测试功能
    查看物料信息:



    在Oracle EBS系统内部查看物料信息:



    完成编辑:


4. 总结

     通过本次实战,我们无需编码,即轻松实现的对Oracle EBS的集成,使庞大的Oracle EBS系统不再陌生。同样,利用WPF,也可以集成其他企业级应用如SAP、Lotus Domino、Siebel、PeopleSoft等。WPF还可与IBM Lotus Forms组件,IBM 基于BPEL的流程平台Websphere Process Server,同时也是构建Dashboard的基础架构平台。后续文章中,我们将进一步深入探索Websphere Portal的高级应用。

0