2010年7月19日 星期一

給水晶報表傳值的兩種方式

給水晶報表傳值的兩種方式
在設計水晶報表的過程中,對於傳值給水晶報表,發現網上很難找到比較全的資料,所以特對此內容進行一下總結,供大家分享.

如果沒有為水晶報表傳值,其顯示的結果通常為對應數據庫表的所有記錄,那麼怎樣才能讓水晶報表只顯示用戶需要的數據呢?這就是給水晶報表傳值的問題.解決這個問題有兩種方式:給水晶報表傳遞查詢的值和給水晶報表傳遞用戶查詢的結果.

1、給水晶報表傳遞查詢值
要實現給水晶報表傳遞查詢值,首先在設計報表時,需要在Parameter Fields中添加參數字段(方法為:在Field Explorer面板中,鼠標在Parameter Fields上游擊,選擇New,自己取一個名字.比如我們數據庫中存在一個'日期'的字段,我們添加一個Month用來查詢滿足Month的值).然後點擊菜單項Crystal Reports->Report->Selection Formula->Record,彈出Formula Workshop對話框,編輯查詢語句如:Month({tbl_SellMain.日期})={?Month}.{tbl_SellMain.日期}可以通過連接中雙擊日期字段得到.這樣水晶報表設計就完成了.Main Report Preview可以查看報表的顯示結果,根據提示輸入Month的值後,可以看到顯示結果中只有滿足用戶輸入條件的結果了.

如果在C#中不添加任何代碼,在每次顯示報表時,都會提示輸入Month的信息,那麼怎樣在程序中傳入Month的值呢?

在C#中添加如下代碼.
using CrystalDecisions.Shared;
//指定報表對應的報表文件
crystalReportViewer1.ReportSource = path; //crystalReportViewer1為添加在窗體中的CrystalReportViewer.

//給報表傳值,獲得滿足條件的查詢結果
ParameterFields paramFields = crystalReportViewer1.ParameterFieldInfo;

ParameterField paramMonth = paramFields["Month"];

ParameterValues curValues=paramCompany.CurrentValues;
ParameterDiscreteValue discreteValue = new ParameterDiscreteValue();
discreteValue.Value = 5; //5為用戶設置的查詢,此處表示查詢的月份為5月
curValues.Add(discreteValue);

crystalReportViewer1.ParameterFieldInfo = paramFields;
這樣,顯示的結果就僅為5月份的數據.

2、給水晶報表傳遞用戶查詢的結果
給水晶報表傳遞查詢結果的方式比較直觀,在報表設計時也只需要設計好要顯示的字段即可.其步驟為:通過SqlDataAdapter獲得查詢數據,然後填充到一個DataTable對像,然後用此對像填充ReportDocument對像,最後將水晶報表的ReportSource指定為此ReportDocument對像.

在C#中實現的代碼為:
//生成查詢語句
string select="select * from tbl_SellMain where";
if (txtName.Text.Trim() != "")
select += " 公司名稱='" + txtName.Text.Trim() + "' and";
select += " Year(日期)=" + cmbYear.Text + " and";
select += " Month(日期)=" + cmbMonth.Text;

SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=GYHR;Integrated Security=True");
SqlDataAdapter da = new SqlDataAdapter(select, conn);
DataTable dt=new DataTable();
da.Fill(dt);

//這裡必須事先申明一個ReportDocument對像 Report,同時加載數據報表
ReportDocument rd = new ReportDocument();
//獲取.rpt文件真實路徑
string path;
rd.Load(path);
rd.Database.Tables[0].SetDataSource(dt); //對應報表設計的第一個數據表
crystalReportViewer1.ReportSource = rd;
//crystalReportViewer1.PrintReport(); 打印

沒有留言:

張貼留言