原文地址:OAF与XML Publisher集成
有两种方式,一种是用VO与XML Publisher集成,另一种是用PL/SQL与XML Publisher集成
用VO与XML Publisher集成
用VO生成数据.AM里调用
在application module新增方法:
import oracle.jbo.XMLInterface; import oracle.xml.parser.v2.XMLNode; public XMLNode getReportXMLNode(String keyId) { ChgDisPrintTmpVOImpl vo = getChgDisPrintTmpVO1(); vo.executeQuery(); XMLNode xmlNode = ((XMLNode) vo.writeXML(4, XMLInterface.XML_OPT_ALL_ROWS)); return xmlNode; }
用CO调用方法
增加一个funciton
public void PrintPDF(OAPageContext pageContext, OAWebBean webBean, XMLNode xmlNode, String keyId) { HttpServletResponse response = (HttpServletResponse) pageContext.getRenderingContext().getServletResponse(); String changeOrderType = pageContext.getParameter("ChangeOrderType"); // Set the Output Report File Name and Content Type String contentDisposition = "attachment;filename=Distribution" + keyId + ".pdf"; response.setHeader("Content-Disposition", contentDisposition); response.setContentType("application/pdf"); try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); xmlNode.print(outputStream); //xmlNode.print(System.out); ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray()); OADBTransactionImpl oaTrans = (OADBTransactionImpl) pageContext.getApplicationModule(webBean).getOADBTransaction(); String templateName = "CUX_CHANGEMEMO_TEMPLATE_ENG"; TemplateHelper.processTemplate(oaTrans.getAppsContext(), "CUX", templateName, "zh", "CN", inputStream, TemplateHelper.OUTPUT_TYPE_PDF, null, response.getOutputStream()); response.getOutputStream().flush(); response.getOutputStream().close(); } catch (Exception e) { response.setContentType("text/html"); throw new OAException(e.getMessage(), OAException.ERROR); } pageContext.setDocumentRendered(false); }
修改CO processFormRequest事件
public void processFormRequest(OAPageContext pageContext, OAWebBean webBean) { String event = pageContext.getParameter(EVENT_PARAM); if("print".equals(event)) { String KeyId = pageContext.getParameter("KeyId"); parameters = new Serializable[] { KeyId }; XMLNode xmlNode = (XMLNode) am.invokeMethod("getReportXMLNode ", parameters); PrintDisPDF(pageContext, webBean, xmlNode, KeyId); } }
用PL/SQL与XML Publisher集成
用PL/SQL方法实例
PROCEDURE print_payment_request(p_payment_request_id IN NUMBER, x_out_xml OUT CLOB) IS BEGIN dbms_lob.createtemporary(x_out_xml, TRUE); l_temp_str := '<?xml version="1.0" encoding="UTF-8"?>' || chr(10) || '<HEADERDATA>' || chr(10); dbms_lob.writeappend(lob_loc => x_out_xml, amount => length(l_temp_str), buffer => l_temp_str); l_temp_str := l_temp_str || '<MATERIALS>' || r_h.materials || '</MATERIALS>' || chr(10); l_temp_str := '</HEADERDATA>'; dbms_lob.writeappend(lob_loc => x_out_xml, amount => length(l_temp_str), buffer => l_temp_str); END;
红无备注:此处建议释放临时templob,否则可能带来某些异常,如Temporary LOB导致临时表空间暴满
写法如下
vn_xml_clob clob;
vs_xml_str clob;
--临时变量
vs_xml_str:=
'<PRODUCTLIST></PRODUCTLIST>'
//这样的赋值应该是vs_xml_str直接当作varchar2类型来用了,oracle自己转换的,因为如果后面那个串太长了,这样符赋是会报错的。
dbms_lob.createtemporary(vn_xml_clob,
TRUE
);
--初始化clob对象表空间
dbms_lob.append(vn_xml_clob, vs_xml_str);
---把字符串拼接给clob对象
os_xml:=vn_xml_clob;
dbms_lob.freetemporary(vn_xml_clob);
--用完了释放空间
原因参考另外一篇博客
AM调用方法
public CLOB getPaymentRequestXMLClob(String paymentRequestId) { Number reqId = null; CLOB tempClob = null; OADBTransaction oaDbTrans = getOADBTransaction(); OracleCallableStatement stmt = null; try { reqId = new Number(paymentRequestId); String strSQL = "BEGIN cux_contract_reports_pkg.print_payment_request(p_payment_request_id=> :1,x_out_xml=>:2); END;"; stmt = (OracleCallableStatement) oaDbTrans.createCallableStatement(strSQL, 1); stmt.setNUMBER(1, reqId); stmt.registerOutParameter(2, Types.CLOB); stmt.execute(); tempClob = stmt.getCLOB(2); stmt.close(); } catch (Exception exception1) { throw OAException.wrapperException(exception1); } return tempClob; }
CO调用方法
public void PrintPDF(OAPageContext pageContext, OAWebBean webBean, CLOB xmlClob) { HttpServletResponse response = (HttpServletResponse) pageContext.getRenderingContext().getServletResponse(); // Set the Output Report File Name and Content Type String contentDisposition = "attachment;filename=PaymentRequest.pdf"; response.setHeader("Content-Disposition", contentDisposition); response.setContentType("application/pdf"); try { Reader inputReader = xmlClob.getCharacterStream(); OADBTransactionImpl oaTrans = (OADBTransactionImpl) pageContext.getApplicationModule(webBean).getOADBTransaction(); String templateName = "CUX_CONTRACT_PAYMENT_REQUEST"; TemplateHelper.processTemplate(oaTrans.getAppsContext(), "CUX", templateName, "zh", "CN", inputReader, TemplateHelper.OUTPUT_TYPE_PDF, null, response.getOutputStream()); response.getOutputStream().flush(); response.getOutputStream().close(); } catch (Exception e) { response.setContentType("text/html"); throw new OAException(e.getMessage(), OAException.ERROR); } pageContext.setDocumentRendered(false); }
修改CO事件 processFormRequest
String event = pageContext.getParameter(EVENT_PARAM); if("print".equals(event)) { String paymentRequestId = pageContext.getParameter("paymentRequestId"); Serializable[] param = {paymentRequestId}; CLOB tempClob = (CLOB) am.invokeMethod("getPaymentRequestXMLClob",param); PrintPDF(pageContext, webBean ,tempClob); }
vn_xml_clob clob;
vs_xml_str clob;
--临时变量
vs_xml_str:=
'<PRODUCTLIST></PRODUCTLIST>'
//这样的赋值应该是vs_xml_str直接当作varchar2类型来用了,oracle自己转换的,因为如果后面那个串太长了,这样符赋是会报错的。
dbms_lob.createtemporary(vn_xml_clob,
TRUE
);
--初始化clob对象表空间
dbms_lob.append(vn_xml_clob, vs_xml_str);
---把字符串拼接给clob对象
os_xml:=vn_xml_clob;
dbms_lob.freetemporary(vn_xml_clob);
--用完了释放空间