我们系统里面用到水晶报表展示,就是从水晶里面读取参数出来,某些符合一定规则的参数自己设置展示的方式,程序是用用java实现的,,一般的报表设置参数都没问题。但是某些参数在为空的情况下第一次可以显示出来,翻页显示就要提示重新输入参数,点击确定才能看。我每个参数,即使为空都设置过的,。。水晶自己带的desktop.war在浏览这个报表的时候也会出现这样的问题,但是iis下的csp文件可以浏览。希望有兄弟遇到过这样情况的可以提供帮助
代码如下:
IEnterpriseSession es = (IEnterpriseSession) session.getAttribute("enterpriseSession");
    IInfoObject oInfoObject = (IInfoObject) session.getAttribute("infoObject");
    IReport report = (IReport)oInfoObject;
    List parameters = report.getReportParameters();
    Fields fields = new Fields();
    //0:number, 1:currency, 2:boolean, 3:date, 4:time, 5:datetime, 6:String
    //0:数字、1:货币、2:boolean、3:日期、4:时间、5:时间日期、6:字符串
    if(parameters.size() > 0){
    int pSize = parameters.size();
    for (int i = 0; i < pSize; i++){
IReportParameter param = (IReportParameter)report.getReportParameters().get(i);
   String paramName = URLEncoder.encode(param.getParameterName(), "utf-8");
   String paramValue = (String)requestParamMap.get(paramName);
   ParameterField pf = new ParameterField();
   pf.setAllowNullValue(false);
   //设置参数名称
   pf.setName(param.getParameterName());
   //try{
   //ParameterField pf = param.getParameterField();
   //}catch(Exception e){}
   //设置参数值类型
   int valueType = param.getValueType();
   switch(valueType){
   case 0:
   pf.setType(FieldValueType.numberField);
         break;
       case 1:
        pf.setType(FieldValueType.currencyField);
         break;
       case 2:
       pf.setType(FieldValueType.booleanField);
         break;
       case 3:
       pf.setType(FieldValueType.dateField);
         break;
       case 4:
       pf.setType(FieldValueType.timeField);
break;
       case 5:
       pf.setType(FieldValueType.dateTimeField);
         break;
       case 6:
                pf.setType(FieldValueType.stringField);
                break;
        default:
         break;
   }
   //设置参数值[只有离散值]
   if(param.isDiscreteValueSupported()){
   addDiscreteFieldValue(pf, param.getValueType(), paramValue);
   }
        fields.add(pf);private void addDiscreteFieldValue(IParameterField paramField, int valueType, String paramValue) {
ParameterFieldDiscreteValue pfdv = new ParameterFieldDiscreteValue();
Values values = new Values();
    switch (valueType) {
     case 0:
     case 1:
     case 2:
     case 6:
     pfdv.setValue(paramValue);
     break;
        case 3:
        case 4:
        case 5:
         SimpleDateFormat dateFormatter = new SimpleDateFormat("(yyyy,M,d)");
         Date dateValue = dateFormatter.parse(paramValue.substring(paramValue.indexOf('(') ), new ParsePosition(0));
            pfdv.setValue(dateValue);
         break;
        default:
            pfdv.setValue(paramValue);
         break;
}
    values.add(pfdv);
    //paramField.getCurrentValues().add(pfdv);
    paramField.setCurrentValues(values);
}

解决方案 »

  1.   

    贴我的设置报表参数的方法给你,自己比对看看.
    希望能帮到你.
        /**
         * 使用常规运行报表的方式,设置参数字段的方法
         * @param viewer CrystalReportViewer
         * @param paramValues Map
         */
        public static void setViewerParameters(CrystalReportViewer viewer,
                                               Map paramValues) throws
                BusinessException {
            try {
                Fields paramFields = viewer.getParameterFields();
                for (int j = 0; j < paramFields.size(); j++) {
                    ParameterField paramField = (ParameterField) paramFields.
                                                getField(j);
                    Object value = paramValues.get(paramField.getName());
                    if (value != null && value instanceof List) {
                        Vector vc = (Vector) value;
                        Values values = new Values();
                        for (int i = 0; i < vc.size(); i++) {
                            String temp = (String) vc.get(i);
                            ParameterFieldDiscreteValue newDiscreteValue = new
                                    ParameterFieldDiscreteValue();
                            newDiscreteValue.setValue(temp);
                            values.add(newDiscreteValue);
                        }
                        paramField.setCurrentValues(values);                } else if (value != null) {
                        Values values = new Values();
                        ParameterFieldDiscreteValue newDiscreteValue = new
                                ParameterFieldDiscreteValue();
                        newDiscreteValue.setValue(value);
                        values.add(newDiscreteValue);
                        paramField.setCurrentValues(values);
                    }
                }
            } catch (Exception ex) {
                 throw new BusinessException("设置参数字段方法出错!",ex);
            }
        }
      

  2.   

    leasa(暴暴) 谢谢了。。我的代码和你的是一样的,,貌似不行:)))
    Cappuccino啊。。我也是被逼的啊。。呵呵。。
    等待其他兄弟帮忙了。。