如何在水晶报表中动态添加字段?

chrch 2004-08-02 12:31:45
如何在水晶报表中动态添加字段?难道只能在程序设计的时候做吗??
...全文
578 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zaiqiong 2004-08-15
项一下,水晶报表的技术文章太少了。
回复
zx22883 2004-08-12
楼上的,BO的高级工程师说过能不能动态绑定图表字段?
回复
东山大少168 2004-08-07
Crystal已经被BO公司收购。今日BO的一个高级工程师来我公司培训,
我问过他,他说:水晶报表中可以通过定义公式来实现动态报表。
用代码来移动公式字段,使字段间距相等是可行的!
回复
chrch 2004-08-06
up
回复
东山大少168 2004-08-06
这是我写的一段代码。fieldObject 可以定义。
我是用在报表里建立足够多的公式字段,然后在
程序里与其对应。
但是crystal9.22不知是什么原因,有时运行时可以,有时不可以指定一个fieldobject的位置。

Dim Total As Integer
Total = ListBox_up.Items.Count
If Total > 9 Then Total = 9
For i = 0 To Total - 1
'************************************************************************************************
'///////////公式选定字段
Dim Check As String = "select id from 数据结构 where 数据表id=446 and 字段类型='System.DateTime' and id='" & ListBox_up.Items(i).Value & "'"
Dim V_Check As New sys_DataSource("数据结构", Check, True)
If V_Check.dbDataset.Tables(0).Rows.Count > 0 Then
rpt.DataDefinition.FormulaFields("f" & (i + 1).ToString).Text = "Cstr({员工基本信息." & ListBox_up.Items(i).Text & "},'yyyy/M/dd')"
Else
rpt.DataDefinition.FormulaFields("f" & (i + 1).ToString).Text = "{员工基本信息." & ListBox_up.Items(i).Text & "}"
End If
V_Check.close()
'////////////////////////////////////////////////////////////////////////////////////////////////
'Dim section As CrystalDecisions.CrystalReports.Engine.Section
'section = rpt.ReportDefinition.Sections("DetailSection1")
'Dim fieldObject As CrystalDecisions.CrystalReports.Engine.FieldObject
'If TypeOf (section.ReportObjects("f" & (i + 1).ToString & "1")) Is CrystalDecisions.CrystalReports.Engine.FieldObject Then
' fieldObject = section.ReportObjects("f" & (i + 1).ToString & "1")
' If TypeOf (fieldObject) Is CrystalDecisions.CrystalReports.Engine.FieldObject Then
' 'fieldObject.Left = CInt(11520 * i / Total)
' 'If i = 0 Then fieldObject.Left = fieldObject.Left + 100
' Else
' Response.Write("<script>alert('内容!')</script>")
' Exit Sub
' End If
'End If

''************************************************************************************************
' ///////////标题的位置 PageHeaderSection1
Dim section2 As CrystalDecisions.CrystalReports.Engine.Section
section2 = rpt.ReportDefinition.Sections("PageHeaderSection1")
If TypeOf (section2.ReportObjects("text" & (1 + i).ToString)) Is CrystalDecisions.CrystalReports.Engine.TextObject Then
Dim txtObj As CrystalDecisions.CrystalReports.Engine.TextObject
txtObj = rpt.ReportDefinition.Sections("PageHeaderSection1").ReportObjects("text" & (1 + i).ToString)
If TypeOf (txtObj) Is CrystalDecisions.CrystalReports.Engine.TextObject Then
txtObj.Text = ListBox_up.Items(i).Text.ToString
' 'txtObj.Left = CInt(11520 * i / Total)
' 'If i = 0 Then txtObj.Left = txtObj.Left + 100
'Else
' Response.Write("<script>alert('标题!')</script>")
' Exit Sub
End If
End If
Next
rptViewer.ReportSource = rpt
rptViewer.DisplayGroupTree = False
rptViewer.RefreshReport()

End If
回复
chrch 2004-08-05
楼上的kent3721(迎风一刀砍) 能说明白一点怎么动态生成吗?
回复
东山大少168 2004-08-05
我用的crystal 9.22,可以动态生成字段,并动态移动位置,但是好不稳定,有时可以,有时不可以。
回复
佳良88 2004-08-04
听说用交叉表可以实现。具体也不清楚
回复
gameskybbs 2004-08-04
交叉表使用上有限制
可以在设计的时候把全部的字段放上去 动态的隐藏字段是可以的
回复
cocotsy 2004-08-03
帮顶一下,楼上达人能说清楚点么?
回复
chrch 2004-08-02
能不能在程序运行的时候自定义报表样式??

如果水晶报表不能实现,那什么工具在.NET环境下可以实现这个功能呢??

解决的话,分不是问题
回复
Cyrilx 2004-08-02
顶一下
回复
chrch 2004-08-02
up
回复
symbol08 2004-08-02
http://www.kehui.net/index.php?op=article&file=read&aid=20534

如何向 CrystalReportViewer 和 ReportDocument 传递参数……


一、CrystalReportViewer
通过 CrystalReportViewer.ParameterFieldInfo 属性……



1、CrystalReportViewer 成员
公共实例属性
ParameterFieldInfo(从 CrystalReportViewerbase 继承) ParameterFields。获取或设置参数字段集合。



二、ReportDocument
通过 ReportDocument.DataDefinition.ParameterFields 属性……



1、ReportDocument 成员
公共实例属性
DataDefinition DataDefinition。获取 DataDefinition 对象。



2、DataDefinition 成员
公共实例属性
ParameterFields ParameterFieldDefinitions。获取 ParameterFieldDefinitions 集合。



三、参数字段运行时自定义(CrystalReportViewer)



参考:
设置参数 | Windows 窗体查看器的绑定选项 | Web 窗体查看器的绑定选项



可支持用户在 Crystal 报表中通过参数进行输入。这种参数有多种用途。例如:
使参数基于数据库字段并允许用户指定该字段的值,以便对报表中的数据进行筛选。
使用参数字段将条件格式应用于报表。
使用参数字段来定义排序顺序。
下列示例说明如何在运行时通过代码设置参数字段值。此例解释了如何设置两个不同的参数:第一个是多值离散参数,第二个是区域值参数。



在运行时修改参数字段



[Visual Basic]
' 声明将参数传递给
'查看器控件所需的变量。
Dim paramFields As New ParameterFields()
Dim paramField As New ParameterField()
Dim discreteVal As New ParameterDiscreteValue()
Dim rangeVal As New ParameterRangeValue()



' 第一个参数是具有多个值的离散参数。



' 设置参数字段的名称,它必须
'和报表中的参数相符。
paramField.ParameterFieldName = "客户姓名"



' 设置第一个离散值并将其传递给该参数
discreteVal.Value = "AIC Childrens"
paramField.CurrentValues.Add(discreteVal)



' 设置第二个离散值并将其传递给该参数。
' discreteVal 变量被设置为新值,这样,以前的设置
'就不会被覆盖。
discreteVal = New ParameterDiscreteValue()
discreteVal.Value = "Aruba Sport"
paramField.CurrentValues.Add(discreteVal)



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



' 第二个参数为区域值。paramField 变量
'被设置为新值,这样,以前的设置就不会被覆盖。
paramField = New ParameterField()



' 设置参数字段的名称,它必须
'和报表中的参数相符。
paramField.ParameterFieldName = "客户 ID"



' 设置区域的开始值和结束值并将区域传递给该参数。
rangeVal.StartValue = 42
rangeVal.EndValue = 72
paramField.CurrentValues.Add(rangeVal)



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



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



crystalReportViewer1.ReportSource = "c:reportsmy report.rpt"



[C#]
// 声明将参数传递给
//查看器控件所需的变量。
ParameterFields paramFields = new ParameterFields ();
ParameterField paramField = new ParameterField ();
ParameterDiscreteValue discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue rangeVal = new ParameterRangeValue ();



// 第一个参数是具有多个值的离散参数。



// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField.ParameterFieldName = "客户姓名";



// 设置第一个离散值并将其传递给该参数。
discreteVal.Value = "AIC Childrens";
paramField.CurrentValues.Add (discreteVal);



// 设置第二个离散值并将其传递给该参数。
// discreteVal 变量被设置为新值,这样,以前的设置
//就不会被覆盖。
discreteVal = new ParameterDiscreteValue ();
discreteVal.Value = "Aruba Sport";
paramField.CurrentValues.Add (discreteVal);



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



// 第二个参数为区域值。paramField 变量
//被设置为新值,这样,以前的设置就不会被覆盖。
paramField = new ParameterField ();



// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField.ParameterFieldName = "客户 ID";



// 设置范围的开始值和结束值并将该范围传递给
//该参数。
rangeVal.StartValue = 42;
rangeVal.EndValue = 72;
paramField.CurrentValues.Add (rangeVal);



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



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



[C++]
// 声明将参数传递给
//查看器控件所需的变量。
ParameterFields* paramFields = new ParameterFields ();
ParameterField* paramField = new ParameterField ();
ParameterDiscreteValue* discreteVal = new ParameterDiscreteValue ();
ParameterRangeValue* rangeVal = new ParameterRangeValue ();



// 第一个参数是具有多个值的离散参数。
// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField->ParameterFieldName = "客户姓名";



// 设置第一个离散值并将其传递给该参数。
String* val = "AIC Childrens";
discreteVal->Value = val;
paramField->CurrentValues->Add (discreteVal);



// 设置第二个离散值并将其传递给该参数。
// discreteVal 变量被设置为新值,这样,以前的设置
//就不会被覆盖。
discreteVal = new ParameterDiscreteValue ();
val = "Aruba Sport";
discreteVal->Value = val;
paramField->CurrentValues->Add (discreteVal);



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



// 第二个参数为区域值。paramField 变量
//被设置为新值,这样,以前的设置就不会被覆盖。
paramField = new ParameterField ();



// 设置参数字段的名称,它必须
//和报表中的参数相符。
paramField->ParameterFieldName = "客户 ID";



// 设置范围的开始值和结束值并将该范围传递给
//该参数。
rangeVal->StartValue = __box(42);
rangeVal->EndValue = __box(72);
paramField->CurrentValues->Add (rangeVal);



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



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



crystalReportViewer1->ExportReport();
回复
发帖
图表区
创建于2007-09-28

4806

社区成员

.NET技术 图表区
申请成为版主
帖子事件
创建了帖子
2004-08-02 12:31
社区公告
暂无公告