2012-07-26 51 views
1

我试图使用下面的代码,但它不起作用。如何在两个日期之间创建水晶报表

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

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()); 
     } 
    } 
+0

你的报告没有你的查询的WHERE子句吗?还有,你得到的错误究竟是什么? – 2012-07-26 13:15:09

+1

WHERE子句对我来说看起来不正确。我现在无法检查,但我相信它应该是'“WHERE(invoice.Date BETWEEN'”+ DateTimePickerFrom.Value.ToShortDateString()+“'AND'”+ DateTimePickerTo.Value.ToShortDateString()+“') “;' – Ally 2012-07-26 13:24:49

+0

你应该使用sql参数,而不是从字符串构造查询! http://en.wikipedia.org/wiki/SQL_injection – billy 2012-07-26 13:27:25

回答

1

我要承担几件事情:

  1. 您的项目使用Visual Studio 2010,.NET Framework 4中,和Crystal Reports为VS2010
  2. 运行时的类型化的DataSet ReportDataSet是通过你的数据库文件SMS_DB.mdf的连接使用VS的数据集设计设置,有数据已在该文件
  3. 那您键入的水晶报表rt1是次的报表设计器中设置Ë数据源是从类型化的DataSet ReportDataSetInvoiceItemData在您的项目
  4. 所有这些控件是相同的形式
  5. 你仍然将机器放置于VS2010的.NET Framework 4和Crystal Reports运行时都在调试这个上安装

换句话说,我假设你已经设置好一切已经,你所做的一切都交给最新的,非测试环境中的btnReportGen点击按钮的条件,那你'不要试图在另一台机器上运行这个版本。

现在,我对您有一些建议和澄清。

  1. 你不是使用类型化的DataSet在这种情况下,报表数据源:数据集是您dataserve和数据源是你的类型的DataTable,这就是为什么你正确地发送报告的更新您的数据表码。
  2. 为您的选取器控件和报表查看器使用单独的winforms,并在您点击生成按钮时从您的选取器控件窗体中调用您的报表查看器窗体。否则,你会遇到将不良数据发送到报告查看器的问题,报告查看器将生成不正确的报告或根本没有。
  3. 在报告文档中使用参数并将选取器控制值发送到报告文档,以便您可以在报告上显示它们,以便用户知道他们至少在生成按钮时发送正确的值。
  4. 在将它们发送给查看器窗体并在查询中使用它们之前,检查您的控件值是否有效。有些事情要检查:他们都设置?他们都是约会吗? To值是否大于或等于From值?该范围对您的数据库有效吗? (这也使您可以选择向用户显示更有用的错误消息,并能够将它们发送回正确的控件以便他们修复它。)
  5. 由于您已经使用了类型化数据集和数据集设计器,请使用提供的键入的表格适配器并在设计器中使用参数创建自定义查询,然后使用该查询填充表格。这将为您节省很多因尝试以编程方式执行所有操作而导致的麻烦。您有可用的工具,请使用它们。

如果考虑上述所有的,我想你会发现自己有一个正确的工作项目。然而,如果你仍然陷入困境,我可以通过每一个建议,并通过屏幕截图和示例代码来解决所有问题。没关系,如果你需要我这样做是因为我已经在VS2010中创建了大量的Crystal Report项目,并且我只是告诉你,从经验来看,作为程序员和用户最适合你的是什么。您可能认为只需通过以编程方式输入所有内容并将其投放到报表查看器,即可节省时间和资源,但这也是不合作的原因。