zoukankan      html  css  js  c++  java
  • 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); --用完了释放空间
  • 相关阅读:
    There is no session with id session多人使用一个账号
    记录一次@Autowire和@Resource遇到的坑
    shiro 未认证登录统一处理以及碰到的问题记录
    Realm [*] was unable to find account data for the submitted AuthenticationToken
    springboot项目监听器不起作用
    发送邮件com.sun.mail.util.TraceInputStream.<init>(Ljava/io/InputStream;Lcom/sun/mail
    mysql查询重复数据记录
    使用shiro在网关层解决过滤url
    maven添加jetty插件,同时运行多个实例
    Linux 安装Zookeeper集群
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/5802018.html
Copyright © 2011-2022 走看看