APEX 上传xls文件
Posted on August 22, 2010 - Filed Under APEX | Leave a Comment
上一篇文章介绍了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的文档令人吃惊的简单,很多内容都没有提及。
APEX 4 中的文件上传功能
Posted on August 13, 2010 - Filed Under APEX | 1 Comment
有一个APEX小应用需要提供Excel数据上传功能,并且要对上传的数据进行后续加工处理,于是就有了下面这段有点通用的代码。 APEX 4.0中上传的存储位置有两个选择,一个是集中式的WWV_FLOW_FILES,一个是自定义的表。对于前者我不喜欢,所有应用上传的文件都存储在一个地方,有些时候管理起来不够方便;如果是自定义的表,每个应用单独存放,那么不论在迁移还是某些维护都相对简单,当然,对于上传功能的设计而言就需要多花几分钟时间了。下面是自定义表的一个例子。 1. 先创建存储表 attach_data blob 二进制数据 attach_mimetype varchar2(255) 文件类型 attach_filename varchar2(255) 文件名 attach_last_update date 上传时间 attach_charset varchar2(128) 字符集 attach_id number 文件ID 一般而言,最好将该表最小化,包含必须的几个字段即可,如果需要和其他表关联,则可以通过ATTACH_ID关联。 2. APEX页面中增加File…上传的item,属性设置如下: 3. 添加提交表单的按钮,提交时触发一次Automatic Row Processing (DML)的Process,设置表名和主键,系统会自动将相关数据(包括上传的文件)插入对应的表中。关于主键ID的自动生成,可以在After header位置增加一个自动fetch row的设置即可。 4. 文件上传功能本身是非常简单的,接下来是针对该上传文件的后续处理。在顺序上,要先有处理上传的Process(就是第3步),然后再有后续处理的Process。手工在Page Process处再添加一个名为Parsing Attachment(名字随意)的Process,再Source处理加入匿名PL/SQL代码。例如我喜欢直接调用写好的包,那就写上: process_upload.process_file_upload; 这里需要用户首先对Excel做一个另存问文本文件的操作,目前为止,我还没发现可以用PL/SQL来直接操作二进制Excel文件。如果有必要,可以考虑使用Java Procedure对Excel文件进行处理。 附上几段代码: PROCEDURE process_file_upload IS l_blob_data BLOB; l_blob_len NUMBER; l_position NUMBER; l_raw_chunk RAW(2); l_raw_line RAW(32767); l_line [...]
APEX Listener 增设管理界面
Posted on April 21, 2010 - Filed Under APEX | Leave a Comment
最新版的APEX Listener修复了很多bug,并且提供了一个非常管用的新特性。 使用Listener最大的好处就是它支持各种主流应用服务器,比如WebLogic或Apache Tomcat,可以启用WEB服务器的压缩功能(HTTP Compress)。早先的版本对中文的支持很差,可以正常展示,但是一旦保存就会乱码,这导致我曾在一段时间内,开发和管理使用数据库内置XDB服务,普通用户则通过Listener访问,并且不提供中文字符的保存。这个版本完美解决了乱码问题。 此外,该版本最醒目的新特性是提供了一个管理界面: 以Tomcat为例,配置好后会在temp/apex 目录下生成 apex-config.xml 配置文件。该配置界面只在第一次使用时有效,如果之后需要修改参数,则需要先配置好WEB服务器的用户权限(admin role)。编辑tomcat-users.xml 文件: <tomcat-users> <role rolename=”Admin” /> <user username=”admin” password=”admin” roles=”Admin” /> </tomcat-users> Listener 参数修改后会立即生效。 基本上,APEX Listener 测试版已经相对完善了,希望下一个版本可以改进会话管理功能,省得时间久了一堆死进程非得重启才能清理干净。 P.S: 如果已经存在apex-config.xml,又需要登录管理界面,则请访问 http://host/apex/listenerAdmin
关于Forms转换到APEX小记
Posted on February 26, 2010 - Filed Under APEX | 3 Comments
Oracle Forms是非常高效、健壮的开发工具,它的历史已经超过了20年,在今后几年里将会继续完善和支持下去。APEX已经具备了相当多的Web 2.0因素,它继承了Oracle Forms最大优势,那就是几乎可以用PL/SQL来完成所有的开发工作,对于企业内部应用,它无异成为了首选的平台。在这种趋势下,自APEX 3.2版本开始,就引入了Forms Converter,该工具用于将传统的Forms应用转换到APEX应用,对于一些Oracle Forms应用丰富、历史悠久的企业而言,它是相当吸引眼球的。 从FastForms到SQL*Forms,从CS架构到现在基于Web的WebForms,Oracle Forms的基础结构却变化不大,本质依旧是Java程序,程序逻辑的实现几乎完全基于SQL和PL/SQL。APEX则是非常纯粹的WEB应用开发平台,它需要的是PL/SQL、Java Script、CSS和最基础的HTML知识。对于开发人员而言,两者需要技术技能几乎相同。从Oracle Forms转移到APEX,对开发人员的技能培训几乎可以省略。Oracle Forms的几个核心组件:块(Block)、触发器(Trigger)、PL/SQL库、值列表(LOV)都可以交由Forms Converter完成转换。 转换器会生成XML格式的原数据文件,然后上传到APEX生成具体的Web应用。在这里,转换器的作用是“转换”,而不是“迁移”。两个平台在技术上是不同的,从而导致某些功能上的差异,比如Forms中的快捷键在目前的APEX中是不存在的,此外,Forms中某些java beans的应用也无法在APEX上实现。Oracle Forms和Oracle APEX各元素的差异主要如下表所示: Oracle Forms Oracle APEX Alerts 在应用层或页面上的验证逻辑中实现文本消息 Blocks 在APEX是区域(Region) Canvases 在转换过程中被忽略 Editors HTML编辑器 Lists of Values 记录组在转换过程中将会被调整 Program Units 对应PL/SQL程序单元 Triggers APEX中没有触发器,不过页面查询过程有相应的机制实现逻辑,比如Processes 对于APEX 4.0版本,或许还有另外一些特殊的差异,比如Websheets,内置的图表引擎(这是非常酷的,可以做简单的BI),加强的Web Services功能等。在用户界面上,Oracle Forms响应迅速,而APEX则可以通过AJAX特效实现类似功能。 关于转换的具体操作,可以参考《Oracle® Application Express Application Migration Guide,这本书《Oracle Application Express Forms Converter》有更详细的介绍。
Oracle Application Express Listener
Posted on October 22, 2009 - Filed Under APEX | Leave a Comment
在今日之前,APEX应用可以通过两种方式访问(架构),即: Oracle HTTP Server/mod_plsql XDB HTTP protocol server/embedded PL/SQL gateway 今天,Oracle发布了Oracle Application Express Listener,这是很早以前就预告要在APEX下一版本(4.x)提供的主要新特性之一。通过APEX Listener,Web层增加了对以下平台的支持: Oracle WebLogic Tomcat OC4J 尽管11g内置了PL/SQL gateway可以当做一个逻辑上独立的Web Server来用,Oracle的技术顾问认为在应用规模不大的环境下,该方式比DB + Web Server的两层架构性能更佳,但是在我个人的测试下,发现并非如此。对于正式环境,我强烈建议使用独立的Web Server。 下面是一个Tomcat的配置指导: Download Tomcat Download Unpack Tomcat Edit the Tomcat configuration file to increase the maximum header size (the default is 4k). Edit ….\apache-tomcat-6.0.18\conf\server.xml <Connector port=”8080″ protocol=”HTTP/1.1″ connectionTimeout=”20000″ maxHttpHeaderSize=”32676″ redirectPort=”8443″ [...]
APEX与EBS登录权限集成
Posted on September 28, 2009 - Filed Under APEX, E-Business Suite | Leave a Comment
APEX的访问权限主要分为两种:Authentication和Authorization,简单来说,前者控制登录权限,一次登录各处可用;后者控制各页面或模块的权限。事实上,APEX应用中甚至无需管理用户数据,你所需要的是管理逻辑上的权限,而不需要存储权限数据本身,如此,登录权限的管理便可以非常灵活。 而EBS的权限控制稍微复杂一点,但是从登录权限来看却简单许多,主要是通过包FND_WEB_SEC来进行验证,如: SQL> set serveroutput on SQL> exec dbms_output.put_line(fnd_web_sec.validate_login(‘ZEENO’, ‘PW123′)); Y PL/SQL procedure successfully completed 只需要调用该过程,即可直接使用EBS的用户登录了。如果APEX和EBS分处不同的数据库中,则可以使用远程过程调用方式: fnd_web_sec.validate_login@DBLINK(‘ZEENO’, ‘PW123′); 首先,APEX本地库中创建验证函数: CREATE FUNCTION ebs_auth(p_username IN VARCHAR2, p_password IN VARCHAR2) RETURN BOOLEAN AS BEGIN — 使用EBS远程验证 IF fnd_web_sec.validate_login@dblink(p_username, p_password) = ‘Y’ THEN RETURN TRUE; ELSE RETURN FALSE; END IF; END ebs_auth; 按照规范,需要添加p_username和p_password两个参数。 接下来,在APEX中创建新的Authentication Scheme,一切按正常方式进行,所需要改动的,是将上面的验证函数添加到Authentication Function: 如此,即可使用EBS用户、密码进行登录了。
