2012-07-26 71 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項目,並且我只是告訴你,從經驗來看,作爲程序員和用戶最適合你的是什麼。您可能認爲只需通過以編程方式輸入所有內容並將其投放到報表查看器,即可節省時間和資源,但這也是不合作的原因。