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); --用完了释放空间
  • 相关阅读:
    1mustache基本使用
    better-scroll
    PTA 题解:jmu-Java&Python-统计文字中的单词数量并按出现次数排序
    Java : Comparable 和 Comparator 接口
    java校验特殊符号
    vue项目左右布局的菜单效果,树形菜单
    响应式树形菜单导航,jq+ajax
    2020书单
    vite 为什么快
    vite 尝鲜
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/5802018.html
Copyright © 2011-2022 走看看