如何在两个日期之间创建Crystal Report

时间:2012-07-26 08:48:18

标签: c# sql-server sql-server-2008 crystal-reports

我尝试使用下面的代码,但它不起作用。

我使用SQL查询将报告数据存储在ReportDataSet中。之后,我将此ReportDataSet设置为DataSource对象的CrystalReport

private void btnGenReport_Click(object sender, EventArgs e)
    {
        CrystalReport1 objRpt = new CrystalReport1();

        string sql; //creating sql query
        sql = "SELECT invoice.InvoiceNo, invoice.Date, invoiceitems.Name, invoice.InvoiceTo, invoice.CusName, invoiceitems.Qty, invoiceitems.Rate, invoiceitems.Amount ";
        sql += "FROM (invoice INNER JOIN invoiceitems ON invoice.Date = invoiceitems.Date) ";
        sql += "WHERE (invoice.Date BETWEEN '" + DateTimePickerFrom.Value + "' AND '" + DateTimePickerTo.Value + "');";

        ReportDataSet ds = new ReportDataSet();
            string path = Application.StartupPath + "\\";
        string conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + path + "SMS_DB.mdf;Integrated Security=True;User Instance=True";
        SqlConnection con = new SqlConnection(conStr); // create connection
        try
        {
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            da.Fill(ds, "InvoiceItemData");
            objRpt.SetDataSource(ds.Tables["InvoiceItemData"]);
            crystalReportViewer1.ReportSource = objRpt;
            con.close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error ! \n" + ex.ToString());
        }
    }

1 个答案:

答案 0 :(得分:1)

我将假设一些事情:

  1. 您的项目正在使用Visual Studio 2010,.NET Framework 4和VS2010的Crystal Reports运行时
  2. 您的类型化数据集ReportDataSet是使用VS的数据集设计器通过与数据库文件SMS_DB.mdf的连接设置的,并且此文件中已存在数据
  3. 您在报表设计器中设置了您键入的Crystal报表rt1,其中数据源是项目中类型化数据集InvoiceItemData中的表ReportDataSet
  4. 所有这些控件都采用相同的形式
  5. 您仍然在安装了.NET Framework 4和Crystal Reports运行时VS2010的计算机上进行调试
  6. 换句话说,我假设你已经设置了所有内容的条件,你已经完成了最新的非beta环境中的btnReportGen按钮点击所做的一切,并且你不要试图在另一台机器上运行这个版本。

    现在,我有一些建议和澄清要做。

    1. 在这种情况下,您没有使用类型化数据集作为报表数据源:数据集是您的数据源,数据源是您键入的数据表,这就是您在代码中正确发送报表更新数据表的原因。 / LI>
    2. 为选择器控件和报表查看器使用单独的winforms,并在点击“生成”按钮时从选取器控件表单中调用报表查看器表单。否则,您将遇到向报表查看器发送错误数据的问题,这将导致生成错误报告或根本不报告。
    3. 使用报表文档中的参数并将选取器控件值发送到报表文档,以便您可以在报表上显示它们,以便用户知道他们至少在点击生成按钮时发送正确的值。
    4. 在将控件值发送到查看器表单并在查询中使用它们之前,请检查您的控件值是否有效。要检查的一些事项:它们都设置好了吗?他们都约会吗? To值是否大于或等于From值?该范围对您的数据库有效吗? (这也使您可以选择向用户显示更有用的错误消息,并能够将它们发送回正确的控件,以便他们可以修复它。)
    5. 由于您已经在使用类型化数据集和数据集设计器,因此请使用提供的类型表适配器,并在设计器中创建包含参数的自定义查询,然后使用该查询填充表。这样可以避免因尝试以编程方式执行所有操作而导致的许多麻烦。您有可用的工具,因此请使用它们。
    6. 如果你考虑上述所有问题,我认为你会发现自己有一个正常工作的项目。但是,如果你仍然卡住了,我可以通过每个建议,并通过屏幕截图和示例代码修复所有内容。如果你需要我这样做是没关系的,因为我在VS2010中创建了各种各样的Crystal Report项目,我只是从经验告诉你,作为程序员和用户最适合你的是什么。你可能会认为只是通过编程方式输入所有内容并将其丢给报表查看器来节省时间和资源,但这也是它不合作的原因。