OAF与XML Publisher集成(转)

原文地址: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);  --用完了释放空间

转载于:https://www.cnblogs.com/huanghongbo/p/5802018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值