这是一本基础教程,虽然很基础,但是实际上很多看着资深的SAP顾问并不了解这些基础。我一直认为一个合格的Function Consultant首先必须熟悉产品本身,然后有吃透业务的能力,如此才能做出最优的方案。这个圈子里有多少人上配“顾问”二字呢?更多的工作怕只是Operation而已。 有多少人悉数了解SAP的各产品线? 有多少人知道SAP的工作原理? 有多少人完全掌握了SAP已有的功能从而避免重复造轮子? (范围仅限于中国,大量二次开发的怪圈子) SAP的领域主要有这么几个关键词:业务,流程,方案。基本上,在SAP的顾问圈子和客户圈子里,没有多少话题是关于技术的,甚至关于产品本身也较少涉及。这并不是说SAP的技术不行,正好相反,一个产品稳定到了极致,恰恰说明其技术水平也非常精湛。SAP的技术实现上的细致、严谨和稳定可以让你安稳地做你的流程。比如SAP中的权限设计,从技术实现角度看甚至透着一种美感。所以一般ERP业内的说法是:SAP实施可以培养管理专家,但是难以培养技术专家,这正是“无折腾,不专家”最佳诠释。 也许,应当对技术给一个定义。很多人对“技术”一词的理解仅仅是ABAP,这是非常狭隘的。大而言之从二次开发、数据库管理、系统架构、系统管理、性能优化都是技术,小而言之软件功能界面的一些细微构思也透露着技术之美。没有脱离业务的ERP,也没有脱离技术的ERP。只是在国内的SAP客户中中小企业居多,系统一旦部署完毕技术方面就退居幕后,或者干脆外包,导致很多顾问以为SAP顾问这一行是不需要懂技术的。其实持这种想法的人在Oracle ERP领域也大有人在,只是SAP领域更为显著。譬如系统优化,有纯粹的代码优化,有数据库优化,有架构优化,但更多的是结合业务同步实施的优化方案,技术和业务并不对立。上层的业务方案直接框定了底层的优化余地,没有切肤之痛的人估计是难以理解的。 这实质上也是一种思维的二分法。连岳解释了二分法思维是如何害死人的:”当你说不要无谓辱骂人时,有人就说难道要拍马屁?除了这两分,你可以好好说话;当你说不要装大爷时,有人就说难道要当孙子?除了这两分,你可以当正常人。” 当我们说技术细节也很重要时,当然是已站在熟悉业务的基础上。一个本应是最需要开放的行业,却偏偏被一群保守的人霸占着,仿佛有人吃透了产品本身就要来抢他的饭碗似的。 说了许多,好像依旧没有切入正题,而其实已经介绍的差不多了。所谓基础教程自然是教授基础知识的,只是介绍产品,每块内容其实并没有深入阐述,每个章节都有更多的书籍来深入。这本书,是所有SAP从业者最好的入门书籍之一。 豆瓣链接:SAP基础教程(第3版)
Archives for 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, [...]
APEX 上传xls文件
上一篇文章介绍了APEX中上传文件的方式,以纯文本文件为例说明了如何对上传的文件进行后续处理。PL/SQL可以直接对纯文本内容进行处理,那么如果直接上传xls二进制文件呢?通常,可以用Java Procedure做这件事,但是自APEX Listener 1.x 发布后,有更简单的方式实现对xls内容的处理。 1.10 版本之后,apex-config.xml 中多了下面这个参数: false 将该参数设置为true则开启excel到collection的转换功能,简单设置步骤如下: 1. 添加File Browse…的Page Item,名字为P1_FILENAME,Storage Type 为 WWV_FLOW_FILES 2. 添加名为UPLOAD的Button Item,Button Request 设置为 xls2collection 运行该页面,选择一个xls后缀的Excel文件,点击UPLOAD按钮即可上传该Excel文件。 上传的文件和数据分别存放在wwv_flow_files和apex_collections中。其中COLLECTION_NAME的默认名称为Page Item的名称,此例中为P1_FILENAME,C001为Excel的TAB页名称,接下来的各字段为表格内容。 SELECT * FROM apex_collections a WHERE a.collection_name = ‘P1_FILENAME’ apex_collections是视图,限制了security_group_id,你需要在应用程序中,并且是当前会话中使用。 删除Collection方式为: apex_collection.delete_collection(p_collection_name => ‘P1_FILENAME’); 详细说明可参考APEX 4.0的API Reference文档中的APEX_COLLECTION章节。 有了APEX Listener,很多事情变得更简单了,当然,除了文档,APEX的文档令人吃惊的简单,很多内容都没有提及。