水晶报表参数赋值

// 声明将参数传递给查看器控件所需的变量。
ParameterFields paramFields = new ParameterFields ();
ParameterField paramField = new ParameterField ();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue ();//--离散值
ParameterRangeValue rangeVal = new ParameterRangeValue ();//--区域值
// 假设第一个参数是具有多个值的离散参数。
// 设置参数字段的名称,它必须和报表中的参数相符。
paramField.ParameterFieldName = "客户姓名";
// 设置第一个离散值并将其传递给该参数。
discreteVal.Value = "Jeason";
paramField.CurrentValues.Add (discreteVal);
// 设置第二个离散值并将其传递给该参数。
discreteVal = new ParameterDiscreteValue ();
discreteVal.Value = "Hank";
paramField.CurrentValues.Add (discreteVal);

// 将该参数添加到参数字段集合。
paramFields.Add (paramField);

// 假设第二个参数为区域值。
paramField = new ParameterField ();
// 设置参数字段的名称,它必须和报表中的参数相符。
paramField.ParameterFieldName = "客户ID";
// 设置范围的开始值和结束值并将该范围传递给该参数。
rangeVal.StartValue = 10;
rangeVal.EndValue = 50;
paramField.CurrentValues.Add (rangeVal);

// 将第二个参数添加到参数字段集合。
paramFields.Add (paramField);

// 将参数字段集合放入查看器控件。
crystalReportViewer1.ParameterFieldInfo = paramFields;

//整个赋值过程完毕
______________________________________________________________________


一. 把参数完全交过水晶报表

打开报表文件.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值