隨筆-0  評(píng)論-3  文章-28  trackbacks-0

          一. 把參數(shù)完全交過(guò)水晶報(bào)表

             打開(kāi)報(bào)表文件.rpt,在字段資源管理器里,右擊參數(shù)-》新建

              在下面的選項(xiàng)屬性里可以設(shè)置參數(shù)的名稱,類型,提示文本,是否允許多個(gè)值,值范圍類型(如果是字符串用離散,日期或數(shù)字用范圍)

              注意:上面都是比填的,如果參數(shù)是用來(lái)對(duì)應(yīng)某個(gè)字段的,類型必需跟該字段一樣。

             在值屬性里可以建一個(gè)值的列表,點(diǎn)上去,然后點(diǎn)右邊的按鈕就進(jìn)入值列表編輯框了;是否提示時(shí)僅顯示說(shuō)明;編輯掩碼,可以給參數(shù)的指定一定的格式;最小長(zhǎng)度;最大長(zhǎng)度;

             現(xiàn)在你可以給這個(gè)報(bào)表創(chuàng)建一個(gè)查看器jsp,加viewer標(biāo)簽的就行了。

             注意這個(gè)jsp的頁(yè)面編碼設(shè)置為UTF-8.

          二.   參數(shù)所需包跟相關(guān)對(duì)象

               1.  需要的java類和包       

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

                    com.crystaldecisions.reports.sdk.DataDefController

               2.  創(chuàng)建一個(gè)存儲(chǔ)參數(shù)字段的 Fields 對(duì)象。 參數(shù)對(duì)象都是放在這個(gè)里面,通過(guò)Fields對(duì)象可以添加、刪除和查找參數(shù)對(duì)象   

                    Fields fields = new Fields();

               3.   ParameterField 參數(shù)字段對(duì)象。

                    ParameterField paramField1 = new ParameterField();

               4. 為想設(shè)置的每個(gè)參數(shù)字段創(chuàng)建一個(gè) Values 對(duì)象。Values對(duì)象是用來(lái)存儲(chǔ)ParameterFieldDiscreteValue 對(duì)象或 ParameterFieldRangeValue 對(duì)象

                    Values newVals1 = new Values();

               5. 離散值對(duì)象ParameterFieldDiscreteValue 對(duì)象

                  ParameterFieldDiscreteValue newDiscVal1 = new ParameterFieldDiscreteValue();

                  ParameterFieldDiscreteValue[ ] newDiscVals = new ParameterFieldDiscreteValue[ ];

                 范圍值對(duì)象ParameterFieldRangeValue 對(duì)象

                  ParameterFieldRangeValue newRangeVal1 = new   ParameterFieldRangeValue();

                  ParameterFieldRangeValue[ ] newRangeVals = new   ParameterFieldRangeValue[ ];

                他們的大概關(guān)系:一個(gè)Fields-》多個(gè)ParameterField

                                                 一個(gè)ParameterField-》一個(gè)Values

                                                一個(gè)Values-》多個(gè)ParameterFieldDiscreteValue 或ParameterFieldRangeValue

          三.   后臺(tái)設(shè)置參數(shù)

                1.  參數(shù)的管理都是通過(guò) 報(bào)表DataDefController 來(lái)控制的。

                    DataDefController dataDefController = new DataDefController();

                    對(duì)于主報(bào)表 dataDefController = reportClientDoc.getDataDefController();

                    對(duì)于子報(bào)表

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

                2.  參數(shù)的設(shè)置信息是通過(guò) IDataDefinition 來(lái)獲取的。

                     IDataDefinition dataDefinition = dataDefController.getDataDefinition();    

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

                    而對(duì)參數(shù)的設(shè)置改動(dòng)是通過(guò) ParameterFieldController 來(lái)控制的

                     ParameterFieldController   paramfieldcontroller= dataDefController.getParameterFieldController( );

                    如: 給主報(bào)表參數(shù)字段設(shè)置單個(gè)值

                      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));         //數(shù)字類型

                     給某個(gè)參數(shù)字段設(shè)置多個(gè)離散值

                     Object [] multiVals = {"String1", "String2", "String3"};                     //注意要對(duì)應(yīng)參數(shù)字段的類型
                     paramFieldController.setCurrentValues("", "StringMultiParam", multiVals);

                3.  取得Fields

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

                 4.  對(duì)已經(jīng)建立的參數(shù)字段,通過(guò)Fields的在知道名字的情況下通過(guò)Find方法取得

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

                   參數(shù)字段七個(gè)基本類型
                  布爾(Boolean) 、貨幣(Double)、數(shù)字(Integer)、字符串(String)、日期、日期時(shí)間、時(shí)間(Date)

                  參數(shù)的值必須跟參數(shù)的類型符合才行.  

                 5.  如果是新建的參數(shù)字段,那必需設(shè)置參數(shù)字段的報(bào)表名稱設(shè)置為與參數(shù)關(guān)聯(lián)的報(bào)表名稱。如果參數(shù)字段用于主報(bào)表,則使用空白字符串 ("")。使用 setReportName 方法設(shè)置報(bào)表名稱。

                    paramField1.setName("Country");             //設(shè)置名字

                    paramField1.setReportName("");              //如果為 "   "就是用于主報(bào)表,如果子報(bào)表,要設(shè)置字報(bào)表名

                   如果是已經(jīng)在rpt中存在的參數(shù),就不用設(shè)置名字和報(bào)表名稱了,也不用添加到Fields中。

                    newDiscVal1.setValue("China");               //設(shè)置離散值,后面將添加到參數(shù)值列表中

                    newDiscVal1.setDescription("The country is China.");//這個(gè)要不要都沒(méi)關(guān)系

                    將參數(shù)字段值添加到 Values 集合對(duì)象。   

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

                     為參數(shù)字段設(shè)置 Values 集合。

                     pfield1.setCurrentValues(vals1);

                     向 Fields 對(duì)象添加每個(gè)參數(shù)字段。 Fields 對(duì)象現(xiàn)在可用于查看器   

                     fields.add(pfield1);                   //非新建參數(shù)不用

              下面是重點(diǎn)啦。雖然很簡(jiǎn)單,但是折磨了我三天

               6.  改動(dòng)查看報(bào)表JSP頁(yè)面的參數(shù)字段離散值列表或范圍值列表

                    先用取得paramField對(duì)象,這個(gè)前面有說(shuō)怎么取得,這里不多說(shuō)了

                   要添加的離散值

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

                  取得原來(lái)的Values集合,在把Values集合克隆到一個(gè)新的Values集合。我原來(lái)是用paramField.getValues(),不知道是JRC中出錯(cuò)還是什么,這個(gè)方法竟然完全沒(méi)用,paramField.getDefaultValues().才能真正的取得參數(shù)對(duì)象的Values集合

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

                  在原來(lái)的離散值中再添加多個(gè)離散值

                  newVals.add(newDiscValue);

                 為參數(shù)字段設(shè)置新的Values集合。這里原來(lái)是用paramField.setCurrentValues(newVals),也是不行,要用下面的   paramField.setDefaultValues(newVals);

                  paramField.setDefaultValues(newVals);

          7.   禁用用戶提示,自動(dòng)使用設(shè)置的參數(shù)字段值。這在以下情況中特別有用:所設(shè)置的參數(shù)字段值對(duì)于用戶為未知(例如系統(tǒng)生成的參數(shù))。

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

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

            如果是用于主報(bào)表,reportName為" ",否則為子報(bào)表名稱。

            允許多值的情況下:

            ①如果不考慮原來(lái)的離散值列表

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

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

           

            ②在原來(lái)離散值列表的基礎(chǔ)上添加新的離散值,并設(shè)置

                 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);

                 查看器的設(shè)置

                  crystalReportPageViewer.setParameterFields(fields);//這個(gè)感覺(jué)用不用都沒(méi)關(guān)系

                  crystalReportPageViewer.setEnableParameterPrompt(false);

                 報(bào)表的參數(shù)設(shè)置好后,則調(diào)用查看器的刷新方法以應(yīng)用新的參數(shù)。

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

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

              注意不要在查看器里面設(shè)置刷新按鈕,一按就會(huì)丟失參數(shù)設(shè)置。頁(yè)面編碼UTF-8。如果不行就tomcat profect-》reload this context

          posted on 2008-03-28 16:50 閱讀(624) 評(píng)論(0)  編輯  收藏 所屬分類: java基礎(chǔ)
          主站蜘蛛池模板: 巴马| 河东区| 遂宁市| 柳江县| 含山县| 会泽县| 历史| 正镶白旗| 阜新市| 曲阳县| 佛学| 汉源县| 陆丰市| 文水县| 天峻县| 安阳县| 恩平市| 牙克石市| 溧阳市| 嘉义市| 固阳县| 湖南省| 称多县| 大余县| 邻水| 黔东| 沂源县| 石门县| 红河县| 曲周县| 博客| 林口县| 洛宁县| 蕉岭县| 巴南区| 平武县| 罗田县| 陈巴尔虎旗| 彭山县| 清丰县| 灵寿县|