posts - 84, comments - 54, trackbacks - 0, articles - 0
             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Web application 中使用Crystal Report(一)

          Posted on 2007-04-11 23:26 馬達+斯加 閱讀(1759) 評論(8)  編輯  收藏 所屬分類: Java Report
          最近的項目中使用了Crystal Report作為報表工具,與Jasper Report不同,在報表的靈活性和開發速度上要勝出很多,一旦用上就不愿意換其他了。
          在Web application中使用CR,主要可以通過兩種方案實施:
          一種是將rpt文件嵌入application中,該方案實施簡單、快速,最重要的不受license限制,是普通項目開發的絕佳選擇。我們可以直接去Business Objects上面下載一個已經集成了CR開發插件的Eclipse,或者只下載插件也可以。利用該插件中的開發向導,可以非常容易的進行開發了。
          生成HTML報表也是相當的簡單,我們可以通過CR提供的標簽庫生成:
          <%@ taglib uri="/WEB-INF/tld/crystal-tags-reportviewer.tld" prefix="crviewer" %>

          <crviewer:viewer 
          isOwnPage="true" 
          displayGroupTree
          ="false"
          printMode
          ="ActiveX"
          allowDrillDown
          ="false"
          hyperlinkTarget
          ="false"
          displayToolbarViewList
          ="false"
          displayToolbarFindButton
          ="false"
          displayToolbarToggleTreeButton
          ="false"
          displayToolbarCrystalLogo
          ="false"
          reportSourceType
          ="reportingComponent" 
          viewerName
          ="CrystalReport1-viewer" 
          reportSourceVar
          ="CrystalReport1">
          <crviewer:report reportName="Test.rpt" />
          </crviewer:viewer>
          也可以通過自己寫代碼讀取report source,然后作為一個javabean供表現層使用:
              /**
               * Retrieve embedded report source by the specified report name.
               * 
               * 
          @param reportName
               * 
          @return
               
          */

              
          private static IReportSource getEmbeddedReport(String reportName){
                  IReportSource reportSource 
          = null;
                  String report 
          = CRConstant.EMBEDDED_RPT_FOLDER + reportName + ".rpt";
                  ReportClientDocument reportClientDoc 
          = new ReportClientDocument();
                  
          try {
                      reportClientDoc.open(report, 
          0);
                  }
           catch (ReportSDKException e) {
                                      
                      log.warn(
          "Cant get embedded report source");
                      log.error(e.getMessage());
                  }

                  reportSource 
          = reportClientDoc.getReportSource();
                  
          return reportSource;
              }

          非標簽方式生成HTML報表
          <%@ page 
          language
          ="java"
          contentType
          ="text/html; charset=UTF-8"
          pageEncoding
          ="UTF-8"

          %>
          <%@ page import="com.crystaldecisions.reports.reportengineinterface.*"%>
          <%@ page import="com.crystaldecisions.report.web.viewer.*" %>
          <%
           CrystalReportViewer viewer 
          = (CrystalReportViewer)session.getAttribute("crViewer");
          viewer.processHttpRequest(request, response, getServletConfig().getServletContext(), 
          null); 
           
          %>

          另外一種是集成Crystal Enterprise Server進行報表開發。所有的rpt都在server上,application 可以通過包括Enterprise account,LDAP,Windows NT(如果是Window服務器)等多種方式登陸Server讀取報表。該方案中rpt可以提供多個應用使用,并且方便管理及二次開發,但是license非常貴,因此,主要是應用在大型項目中。
          其中最簡單的便是使用Enterprise Account方式登錄了:
              /**
               * Loging Crystal Enterprise server
               *
               
          */

              
          private void createEnterpriseSession() throws SDKException{
                  String cms 
          = CRConstant.CMS;
                  String userName 
          = CRConstant.AUTH_USERNAME;
                  String password 
          = CRConstant.AUTH_PASSWORD;
                  String authMode 
          = CRConstant.AUTH_MODE;
                  
          try {
                      
                      ISessionMgr sessionMgr 
          = CrystalEnterprise.getSessionMgr();
                      iEnterpriseSession 
          = sessionMgr.logon(userName, password, cms, authMode);
                      log.info(
          "Got Enterprise session successfully");
                      
                  }
           catch (SDKException e) 
                      log.warn(
          "Cant log on CMS:\nCMS:" + cms + "\nUserID:"
                              
          + userName + "\nPassword:" + password + "\nAuthMode:"
                              
          + authMode);
                      
          throw e;
                  }
             
                  
              }

          但是,這里特別需要注意的是,CMS的值必須是Enterprise server的名稱,而不能使用IP地址。
          在此方案中,可以使用一個iFrame直接將Server中生成的報表包含進來(CR enterprise portlet就是這樣干的)。

          評論

          # re: Web application 中使用Crystal Report(一)[未登錄]  回復  更多評論   

          2007-05-04 17:57 by 我們走在JAVA的光明大道上
          很好的經驗!謝謝分享

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 17:37 by Alan.xiao
          通過eclipse的插件打開一個用crystal reporst 10做的報表,提示要連接數據庫,因此通過它的數據庫資源管理器連接了sql server,結果發現只能看到數據庫中的表,存儲過程看不到,所以它把那張報表里面的數據按名字對應表里面去了,而實際上本應對應一個存儲過程的,所以顯示數據庫中沒有該表。請問您,這是怎么回事,該如何解決

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 17:48 by 回樓上
          好久沒用了,記得好像cr里面只能看到table,view。碰到很復雜的報表,我們一般是建一個working table,很少用存儲過程。
          另外想問一下,為什么存儲過程的名字會和table一樣呢?一般會避免這種情況才是。

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 17:50 by Alan.xiao
          如果以上描述您不是很理解,那我換個說法:

          報表已經存在,我目前要做的是在jsp中生成,而這樣做需要輸入參數,輸入參數就需要“報表源”,得到報表源就需要“jdbc數據源”,而原來的的報表是通過DSN連接的數據庫,所以不得已重新配置,結果配好數據源后發現沒法讀取數據庫中的存儲過程。

          (要是能截圖就好了)

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 17:52 by Alan.xiao
          只有存儲過程,沒有改名字的table,但因為那個插件讀不到存儲過程,就把那個當table了,而該table又不存在,所以就報錯啦

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 18:00 by 回樓上
          沒有做過這種case,如果沒記錯的話,使用哪個數據源不是在rpt中定義的嗎?

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 18:05 by Alan.xiao
          是啊,是在rpt中定義的,但幫組文檔中有這樣一句話:

          要使用 Java Reporting Component 創建報表源,必需指定要查看或導出的報表所在的位置。將使用相對或絕對路徑指定報表位置。而且,為使 Java Reporting Component 正確地為報表檢索數據,必須通過 JNDI 正確指定報表的數據源,或必須依據 JDBC 數據源設計報表。

          # re: Web application 中使用Crystal Report(一)  回復  更多評論   

          2007-12-20 18:08 by 回樓上
          或者,你可以嘗試用JDBC數據源新建一個使用到stored proc的非常簡單的報表,看看在你的application里面能否正確運行。
          主站蜘蛛池模板: 龙海市| 沙洋县| 新兴县| 巫溪县| 浙江省| 旌德县| 罗田县| 广昌县| 泰来县| 泾阳县| 长宁县| 烟台市| 静乐县| 峨眉山市| 嘉鱼县| 三河市| 株洲县| 临泽县| 饶平县| 阿图什市| 玛曲县| 奈曼旗| 邵武市| 蓝山县| 思茅市| 黔东| 阳曲县| 长丰县| 荔浦县| 韩城市| 井陉县| 武强县| 介休市| 云林县| 大洼县| 共和县| 陆丰市| 武穴市| 阜新市| 通江县| 聊城市|