使用eclipse在jsp上顯示水晶報表(六)參數

來源:互聯網
上載者:User

 這個夠嗆,花了我整整三天時間。

一.  把參數完全交過水晶報表

   開啟報表檔案.rpt,在欄位總管裡,右擊參數-》建立

   在下面的選項屬性裡可以設定參數的名稱,類型,提示文本,是否允許多個值,值範圍類型(如果是字串用離散,日期或數字用範圍)

   注意:上面都是比填的,如果參數是用來對應某個欄位的,類型必需跟該欄位一樣。

  在值屬性裡可以建一個值的列表,點上去,然後點右邊的按鈕就進入值列表編輯框了;是否提示時僅顯示說明;編輯掩碼,可以給參數的指定一定的格式;最小長度;最大長度;

  現在你可以給這個報表建立一個查看器jsp,加viewer標籤的就行了。

  注意這個jsp的頁面編碼設定為UTF-8.

二.  參數所需包跟相關對象

    1.  需要的java類和包       

         com.crystaldecisions.sdk.occa.report.data.*

         com.crystaldecisions.reports.sdk.DataDefController

    2.  建立一個儲存參數欄位的 Fields 對象。 參數對象都是放在這個裡面,通過Fields對象可以添加、刪除和尋找參數對象   

         Fields fields = new Fields();

    3.  ParameterField 參數欄位對象。

         ParameterField paramField1 = new ParameterField();

    4.  為想設定的每個參數欄位建立一個 Values 對象。Values對象是用來儲存ParameterFieldDiscreteValue 對象或 ParameterFieldRangeValue 對象

         Values newVals1 = new Values();

    5. 離散值對象ParameterFieldDiscreteValue 對象

       ParameterFieldDiscreteValue newDiscVal1 = new ParameterFieldDiscreteValue();

       ParameterFieldDiscreteValue[ ] newDiscVals = new ParameterFieldDiscreteValue[ ];

       範圍值對象ParameterFieldRangeValue 對象

       ParameterFieldRangeValue newRangeVal1 = new  ParameterFieldRangeValue();

       ParameterFieldRangeValue[ ] newRangeVals = new  ParameterFieldRangeValue[ ];

      他們的大概關係:一個Fields-》多個ParameterField

                                      一個ParameterField-》一個Values

                                     一個Values-》多個ParameterFieldDiscreteValue 或ParameterFieldRangeValue

三.  後台設定參數

     1.  參數的管理都是通過 報表DataDefController 來控制的。

         DataDefController dataDefController = new DataDefController();

         對於主報表 dataDefController = reportClientDoc.getDataDefController();

         對於子報表

         dataDefController = clientDoc.getSubreportController().getSubreport(reportName).getDataDefController();

     2.  參數的設定資訊是通過 IDataDefinition 來擷取的。

          IDataDefinition dataDefinition = dataDefController.getDataDefinition();   

         如:Fields fields = dataDefController.getDataDefinition().getParameterFields() ;

          而對參數的設定改動是通過 ParameterFieldController 來控制的

          ParameterFieldController  paramfieldcontroller= dataDefController.getParameterFieldController( );

         如: 給主報表參數欄位設定單個值

           paramFieldController.setCurrentValue("", "StringParam", new String("Hello"));        //字串類型
           paramFieldController.setCurrentValue("", "BooleanParam", new Boolean(true));    //布爾類型
           paramFieldController.setCurrentValue("", "CurrencyParam", new Double(123.45));//貨幣類型
           paramFieldController.setCurrentValue("", "NumberParam", new Integer(123));        //數字類型

          給某個參數欄位設定多個離散值

          Object [] multiVals = {"String1", "String2", "String3"};                    //注意要對應參數欄位的類型
          paramFieldController.setCurrentValues("", "StringMultiParam", multiVals);

     3.  取得Fields

          Fields fields = dataDefController.getDataDefinition().getParameterFields() ;

      4.  對已經建立的參數欄位,通過Fields的在知道名字的情況下通過Find方法取得

      ParameterField paramField = (ParameterField)dataDefController.getDataDefinition().getParameterFields().findField(parameterName, FieldDisplayNameType.fieldName, Locale.getDefault());

        參數欄位七個基本類型
       布爾(Boolean) 、貨幣(Double)、數字(Integer)、字串(String)、日期、日期時間、時間(Date)

       參數的值必須跟參數的類型符合才行.  

      5.  如果是建立的參數欄位,那必需設定參數欄位的報表名稱設定為與參數關聯的報表名稱。如果參數欄位用於主報表,則使用空白字串 ("")。使用 setReportName 方法設定報表名稱。

         paramField1.setName("Country");            //設定名字

         paramField1.setReportName("");             //如果為 "  "就是用於主報表,如果子報表,要設定字報表名

         如果是已經在rpt中存在的參數,就不用設定名字和報表名稱了,也不用添加到Fields中。

         newDiscVal1.setValue("China");              //設定離散值,後面將添加到參數值列表中

         newDiscVal1.setDescription("The country is China.");//這個要不要都沒關係

         將參數欄位值添加到 Values 集合對象。   

          newVals1.add(newDiscVal1);               //可以添加多個

          為參數欄位設定 Values 集合。

          pfield1.setCurrentValues(vals1);

          向 Fields 對象添加每個參數欄位。 Fields 對象現在可用於查看器   

          fields.add(pfield1);                  //非建立參數不用

   下面是重點啦。雖然很簡單,但是折磨了我三天

    6.  改動查看報表JSP頁面的參數欄位離散值列表或範圍值列表

         先用取得paramField對象,這個前面有說怎麼取得,這裡不多說了

        要添加的離散值

        ParameterFieldDiscreteValue newDiscValue = new ParameterFieldDiscreteValue();
        newDiscValue.setValue(newValue);

       取得原來的Values集合,在把Values集合複製到一個新的Values集合。我原來是用paramField.getValues(),不知道是JRC中出錯還是什麼,這個方法竟然完全沒用,paramField.getDefaultValues().才能真正的取得參數對象的Values集合

        Values newVals = (Values)paramField.getDefaultValues().clone(true);

       在原來的離散值中再添加多個離散值

       newVals.add(newDiscValue);

      為參數欄位設定新的Values集合。這裡原來是用paramField.setCurrentValues(newVals),也是不行,要用下面的  paramField.setDefaultValues(newVals);

       paramField.setDefaultValues(newVals);

 7.   禁用使用者提示,自動使用設定的參數欄位值。這在以下情況中特別有用:所設定的參數欄位值對於使用者為未知(例如系統產生的參數)。

     通過boolean multiValue = paramField.getAllowMultiValue();判斷報表是否允許多值。
    
     不允許多值的情況下:

  clientDoc.getDataDefController().getParameterFieldController().setCurrentValue(reportName, parameterName , newValue);

  如果是用於主報表,reportName為" ",否則為子報表名稱。

  允許多值的情況下:

  ①如果不考慮原來的離散值列表

   String[] newValues = new String[]{"China","USA",..........};

  clientDoc.getDataDefController().getParameterFieldController().setCurrentValues(reportName, parameterName ,newValues);

 

  ②在原來離散值列表的基礎上添加新的離散值,並設定

      DataDefController dataDefController = null;
      if(reportName.equals(""))
         dataDefController = clientDoc.getDataDefController();
     else
       dataDefController = clientDoc.getSubreportController().getSubreport (reportName).getDataDefController();
  
     ParameterField paramField = (ParameterField)dataDefController.getDataDefinition().getParameterFields().findField(parameterName, FieldDisplayNameType.fieldName, Locale.getDefault());

    ParameterFieldDiscreteValue newDiscValue = new ParameterFieldDiscreteValue();
    newDiscValue.setValue(newValue);

    Values newVals = (Values)paramField.getDefaultValues().clone(true);

    newVals.add(newDiscValue);

    clientDoc.getDataDefController().getParameterFieldController().setCurrentValue(reportName, parameterName ,newVals);

       查看器的設定

       crystalReportPageViewer.setParameterFields(fields);//這個感覺用不用都沒關係

       crystalReportPageViewer.setEnableParameterPrompt(false);

      報表的參數設定好後,則調用查看器的重新整理方法以應用新的參數。

      if(session.getAttribute("refresh")==null){
           crystalReportPageViewer.refresh();
           session.setAttribute("refresh","true");
     }
    調用 processHttpRequest 方法以在當前的瀏覽器視窗中啟動此查看器。     

    crystalReportPageViewer.processHttpRequest(request, response, getServletConfig().getServletContext(), null);

    注意不要在查看器裡面設定重新整理按鈕,一按就會丟失參數設定。頁面編碼UTF-8。如果不行就tomcat profect-》reload this context

 

 唉,剛才寫的一大段,唰一下就沒了,最近的blog系統不穩定啊

 

                  

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.