我有一个网页,询问用户输入的编号,并根据输入执行SQL查询,然后获取结果以填充Crystal Reports页面。以下是搜索数据库并填写报告的代码:(为简单起见,我删除了大量不会为问题增加值的查询字符串,对于Crystal Reports字段也是如此)
Dim sql As String = ""
sql = " SELECT * from table1 where input_id = '" & INPUT_NUMBER & "'"
Dim ds As DataSet = getTable(sql)
Dim orpt As New CrystalReport3
CrystalReportViewer1.ReportSource = orpt
orpt.DataDefinition.FormulaFields("fldMaterialID").Text = """" & ds.Tables(0).Rows(0).Item("MATERIAL_ID").ToString & """"
orpt.DataDefinition.FormulaFields("fldMaterialID2").Text = """" & ds.Tables(0).Rows(0).Item("MATERIAL_ID").ToString & """"
orpt.DataDefinition.FormulaFields("fldBar").Text = """" & ds.Tables(0).Rows(0).Item("MATERIAL_ID_BAR_CODE").ToString & """"
orpt.Refresh()
我试图让用户查看报告的多个副本。我已经尝试过了:
orpt.PrintToPrinter(2, False, 0, 1)
但那没用。我搜索了Google,StackOverflow,但我得到的所有解决方案都与带有Saved Queries的Crystal Reports相关,这对我来说不是一个选项。非常感谢任何帮助。
答案 0 :(得分:4)
我终于做到了。
对于那些想知道如何或更好StackOverFlow.com
经验的人,我很高兴分享解决方案。
阅读this great article之后,我受到了解决方案的启发,并且能够通过
完成预期的结果 1 - 用包含相同列数的ADO dataset
替换FormulaFields
我通过在VS.2008中创建一个新的DataSet并将其命名为adoDataSet
来实现这一点。然后向其添加所有必需的列名称(此时没有链接到实际数据,因为稍后将动态提取数据。这就像数据的模板一样)。默认情况下,所有列都将是String类型,但对我的情况来说还可以。
3-在Crystal Reports中,我使用DataBase Expert将提到的数据集拉入报表,并使用adoDataSet中的列替换公式字段的位置
4-然后在我的代码中使用数据填充公式字段,我只调用了一个接受SQL查询并返回正常OracleClient数据集的相同函数(因此它可能会根据需要返回多行 )
5-但是,此数据集不能直接与Crystal Reports一起使用,因此必须先将其转换为先前创建的adoDataSet
的相同类型。所以一个简单的TryCast
为我做了这件事。
Dim sql As String = ""
sql = " SELECT * from table1 where input_id = '" & INPUT_NUMBER & "'"
Dim ds As DataSet = getTable(sql)
Dim orpt As New CrystalReport3
CrystalReportViewer1.ReportSource = orpt
dim ds1 as New adoDataSet
ds1 = TryCast(ds,adoDataSet) ' ds is based on OracleClient data set
' while adoDataSet is the one CrystalReports likes to use
orpt.SetDataSource(ds1)
从那里我能够生成尽可能多的副本,因为我拥有数据,并且可以使数据显示我喜欢的次数。
答案 1 :(得分:0)
我通过以下步骤处理了这样的情况:
key
的字段,其中包含值1,2,3,4,5 ......,直到某个合理的上限。 (我用200。){dummytable.key} <= {?numcopies}
。您将获得key
= 1,2,...,{?numcopies}
的详细记录副本。
在我的应用程序中,每个记录都有一个名为Company的字段,它们都包含相同的值,因此我使用该字段来连接表,避免了Crystal对多个起点的警告。要复制此项,请向两个表添加一个master
密钥,每个记录包含两个表的相同值,并在Database Expert中添加该字段的连接。
答案 2 :(得分:0)
这里我使用Visual Studio 2013创建水晶报表,并在报表上使用ADO Dataset作为数据库字段。现在我想在水晶报表查看器上的打印按钮上设置默认的2份帐单。所以我在水晶报表查看器上加载了代码
private void button1_Click(object sender, EventArgs e)
{
Report.Bill objRpt = new Report.Bill();
objRpt.SetDataSource(DT1);
objRpt.PrintToPrinter(2, true, 0, 0);
crystalReportViewer1.ReportSource = objRpt;
crystalReportViewer1.Refresh();
}