Archives for October 2010

Oracle Fusion Applications,你准备好了吗?

我最近关注的相关领域无疑就是Oracle Fusion Applications了。作为EBS R12之后的下一代业务套件,你也即将关注 最早的消息可能来自OOW Keynotes中Larry的信号了,从数据库机,到云,到Salesforce,到Fusion Apps……紧接着是Oracle Press中的同步公告,明确昭告了下一代业务套件的圣子降临。 之前谈论Fusion往往是指Fusion Middleware,而即将来临的将是Fussion Applications。它的主要亮点在于采用了面向服务架构(SOA),构建在100%标准中间件之上。Fussion Apps是以任务为中心的应用,集成协作方面具有先天优势。从技术上讲,主要包括以下范围: SOA Suite Identity Management ADF Web Center Oracle Application Server Oracle Database Essbase Bi Publisher OBIEE Content Management Collaboration Enterprise Manager 作为新的业务套件,它的第一个版本将包括以下模块: Financials (财务) HCM (人力资源管理) CRM (客户关系管理) SCM (供应链管理) Project Portfolio Management (项目组合管理) Procurement (采购) GRC (Governance, Risk, and Compliance) Fusion Apps主要针对的客户群包括Oracle [...]

WebADI开发指南

最新的EBS文档12.1.3中增加了《Oracle E-Business Suite Desktop Integration Framework Developer’s Guide》,终于结束了WebADI没有官方开发指南的局面。 Oracle EBS中数据的上传下载一直是一个比较头疼的问题,尤其是在处理用户自行批量上传数据方面,虽然可以通过二次开发实现,但从开发工作量和便捷性方面看都是一种相对别扭的方案。11i中就表现出和Office系列集成态度的WebADI是值得推荐的方案,尽管当年功能的薄弱和开发工具(?)的低能,但依旧被广泛应用。R12中这一块得到了非常大的改进,比如很多曾经用WebADI集成器来进行开发配置的功能都有了Web版本。这也算成形了吧。 虽然改进的方面有很多,个人来看下面这几块改进是非常有帮助的: 集成器的定义,可以直接Web方式定义,并且各个模块(接口、布局、Uploader等)区分清晰。 接口类型分为三种:Table/API-procedure/API-function,尤其对于错误返回机制作了改进。 接口各字段属性验证,这个虽然可以在代码中实现,关键是此处可以直接在表单层面进行控制了。 LOV定义,11i中需要通过修改底表数据来实现,而今只需要定义Component即可。 Importer功能,可以使用同步/异步方式提交并发请求,也可以直接使用PL/SQL API。 参数定义功能增强,11i有个很无语的bug,修改参数定义会出现莫名的问题。 当然,最大的改进还是WebADI的模块化设计,这使得开发和维护非常简单、有效率。 文档还分出一个小章节来描述使用FNDLOAD移植WebADI,虽然早就被大家摸索出来了(回忆N年前那段黑暗中探索的快乐时光~),但是对于这种清晰的官方描述还是值得肯定的。

关于Table API

在Oracle ERP二次开发领域,有一个非常重要的开发规范就是关于Table表数据操作的。一般而言,技术团队都会规定避免将数据操作sql直接写到逻辑层代码中,至少将具体的底表操作语句独立放到一个package里。EBS的开发规范中称之为Table Handler,就是在需要直接操作数据表的地方调用该Table Hander来执行DML动作。不管项目有多大,都应该遵循这个规范。 此次SQL Developer升级到3.0后,也增加了一个名为Table API的自动生成功能。 自动生成RECORD和Insert/Update/Delete Procedure: PACKAGE test_tapi IS TYPE test_tapi_rec IS RECORD( content test.content%TYPE, id test.id%TYPE, upload_time test.upload_time%TYPE); TYPE test_tapi_tab IS TABLE OF test_tapi_rec; — insert PROCEDURE ins(p_content IN test.content%TYPE DEFAULT NULL, p_id IN test.id%TYPE, p_upload_time IN test.upload_time%TYPE DEFAULT NULL); — update PROCEDURE upd(p_content IN test.content%TYPE DEFAULT NULL, p_id IN test.id%TYPE, [...]