如何以编程方式生成Crystal Reports的多个副本(详细信息部分)?

时间:2011-09-19 07:27:15

标签: printing crystal-reports

我有一个网页,询问用户输入的编号,并根据输入执行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相关,这对我来说不是一个选项。非常感谢任何帮助。

3 个答案:

答案 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)

我通过以下步骤处理了这样的情况:

  1. 创建一个虚拟表,其中包含一个名为key的字段,其中包含值1,2,3,4,5 ......,直到某个合理的上限。 (我用200。)
  2. 在“数据库专家”中添加此表。 (您将收到有关多个起点的警告;请参阅下文。)
  3. 在“选择专家”中,提供类似{dummytable.key} <= {?numcopies}
  4. 的公式
  5. 如果您使用的是字段值,则可以在连接级别的数据库专家中进行过滤,而不是使用“选择专家”。
  6. 您将获得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(); 
}