OAF_开发系列27_实现OAF中Java类型并发程式开发调用XML Publisher(案例)

简介: 20150814 Created By BaoXinjian 一、摘要 通过Java Concurrent Program导入XML文件和RTF文件导出PDF报表,一种官方的源码解读,通过以下三个关键程序实现 1.

20150814 Created By BaoXinjian

一、摘要


通过Java Concurrent Program导入XML文件和RTF文件导出PDF报表,一种官方的源码解读,通过以下三个关键程序实现

1. 通过DataProcess设定XML数据来源

2. 通过RtfProcess设定RTF模板来源

3. 通过FoProcess产生PDF文件

 

二、方案设计 - 代码


Step1. 创建XML数据定义文件(EmpDataTemplate.xml),并上传至服务器的/u2/VIS/visappl/gavin/concprog/目录

<?xml version="1.0" encoding="UTF-8" ?>   
 <dataTemplate name="EmpData" description="Employee Details" Version="1.0"> <parameters> <parameter name="p_DeptNo" dataType="character" /> </parameters> <dataQuery> <sqlStatement name="Q1"> <![CDATA[ SELECT d.DEPTNO DEPTNO ,d.DNAME DNAME ,d.LOC LOC ,e.EMPNO EMPNO ,e.ENAME ENAME ,e.JOB JOB ,e.MGR MGR ,TO_CHAR(e.HIREDATE,'YYYY/MM/DD') HIREDATE ,e.SAL SAL ,nvl(e.COMM, 0) COMM FROM scott.dept d ,scott.emp e WHERE d.deptno = e.deptno AND d.deptno = nvl( :p_DeptNo, d.deptno) ]]> </sqlStatement> </dataQuery> <dataStructure> <group name="G_DEPT" source="Q1"> <element name="DEPT_NUMBER" value="DEPTNO" /> <element name="DEPT_NAME" value="DNAME" /> <element name="LOCATION" value="LOC" /> <element name="EMPLOYEE_NUMBER" value="EMPNO" /> <element name="NAME" value="ENAME" /> <element name="JOB" value="JOB" /> <element name="MANAGER" value="MGR" /> <element name="HIREDATE" value="HIREDATE" /> <element name="SALARY" value="SAL" /> <element name="COMMISSION" value="COMM" /> </group> </dataStructure> </dataTemplate>

Step2. 创建rtf模板(EmpDataTemplate.rtf)并上传至服务器的/u2/VIS/visappl/gavin/concprog/目录:

Step3. 创建java concurrent程序(EmpDataTemplate.java)。如果不能编译通过,需到服务器上的$JAVA_TOP目录下载相关类文件(可使用zip命令打包下载: zip -r ~/conclib ./oracle/apps/fnd/cp/*):

package bxj.oracle.apps.ap.java;

import java.sql.Connection;  
import oracle.apps.fnd.cp.request.CpContext; import oracle.apps.fnd.cp.request.JavaConcurrentProgram; import oracle.apps.xdo.dataengine.DataProcessor; import oracle.apps.fnd.util.ParameterList; import oracle.apps.fnd.cp.request.ReqCompletion; import oracle.apps.fnd.cp.request.OutFile; import oracle.apps.fnd.cp.request.LogFile; import oracle.apps.fnd.util.NameValueType; import oracle.apps.xdo.template.RTFProcessor; import oracle.apps.xdo.template.FOProcessor; import com.sun.java.util.collections.Hashtable; import java.io.File; public class runEmpXMLConcProg implements JavaConcurrentProgram { public runEmpXMLConcProg() { } String deptNo; public void runProgram(CpContext cpContext) { ParameterList params = cpContext.getParameterList(); ReqCompletion compl = cpContext.getReqCompletion(); OutFile outFile = cpContext.getOutFile(); LogFile logFile = cpContext.getLogFile(); logFile.writeln(">>1 start ..", LogFile.STATEMENT); while (params.hasMoreElements()) { NameValueType val = params.nextParameter(); if (val.getName().equals("P_DEPTNO")) deptNo = val.getValue(); } logFile.writeln(">>2 P_DEPTNO = " + deptNo, LogFile.STATEMENT); Connection jdbcConnection = cpContext.getJDBCConnection(); try { //Initialization – instantiate the DataProcessor class// DataProcessor dataProcessor = new DataProcessor(); //Set Data Template to be executed  dataProcessor.setDataTemplate("/u2/VIS/visappl/gavin/concprog/EmpDataTemplate.xml");
logFile.writeln(">>3 dataProcessor.setDataTemplate", LogFile.STATEMENT); // Assign parameter Hashtable parameters = new Hashtable(); parameters.put("p_DeptNo", deptNo); dataProcessor.setParameters(parameters); logFile.writeln(">>4 dataProcessor.setParameters", LogFile.STATEMENT); // Set the jdbc connection dataProcessor.setConnection(jdbcConnection); logFile.writeln(">>5 dataProcessor.setConnection", LogFile.STATEMENT); // Specify the output directory and file for the data file dataProcessor.setOutput("/u2/VIS/visappl/gavin/concprog/EmpDetails.xml"); logFile.writeln(">>6 dataProcessor.setOutput", LogFile.STATEMENT); // Process the data template dataProcessor.processData(); logFile.writeln(">>6.1 dataProcessor.processData", LogFile.STATEMENT); // Convert rtf to xsl RTFProcessor rtfProcessor = new RTFProcessor("/u2/VIS/visappl/gavin/concprog/EmpDataTemplate.rtf");
logFile.writeln(">>7 new RTFProcessor()", LogFile.STATEMENT); rtfProcessor.setOutput("/u2/VIS/visappl/gavin/concprog/EmpDataTemplate.xsl"); rtfProcessor.process(); logFile.writeln(">>8 rtfProcessor.process()", LogFile.STATEMENT); // Geneate PDF FOProcessor foProcessor = new FOProcessor(); foProcessor.setData("/u2/VIS/visappl/gavin/concprog/EmpDetails.xml"); logFile.writeln(">>9 foProcessor.setData()", LogFile.STATEMENT); foProcessor.setTemplate("/u2/VIS/visappl/gavin/concprog/EmpDataTemplate.xsl"); logFile.writeln(">>10 foProcessor.setTemplate()", LogFile.STATEMENT); foProcessor.setOutput("/u2/VIS/visappl/gavin/concprog/EmpDetails001.pdf"); logFile.writeln(">>11 foProcessor.setOutput()", LogFile.STATEMENT); foProcessor.setOutputFormat(FOProcessor.FORMAT_PDF); foProcessor.generate(); logFile.writeln(">>12 foProcessor.generate() 001", LogFile.STATEMENT); compl.setCompletion(ReqCompletion.NORMAL, "Concurrent Normal Completed!"); } catch (Exception e) { logFile.writeln("Java Concurrent Program Error: "+e.toString(), LogFile.STATEMENT); compl.setCompletion(ReqCompletion.ERROR, e.toString()); } } }

 

三、方案设计 - 应用设定


Step1. 将XML文件和RTF文件上传至服务器相应目录

Step2.  将RunProgram Class包上传至相应目录

Step3. 设定并发可执行程序

 Step4. 设定并发程式及其参数

 

四、运行测试


Step1. 调用Request

Step2. 系统会自动依次产生三个文件xsl->xml->pdf

Step3. 查看xml data文件

Step4. 查看pdf

 

Thanks and Regards

参考:LiaoDunxia - http://blog.csdn.net/t0nsha/article/details/6336872

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
25天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
46 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
12天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
72 13
|
17天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
52 10
|
10天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
48 2
|
20天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
51 2
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
72 1