ReportView報表實現帶參數存儲過程創建報表以及爲rdlc傳遞參數

http://www.xueit.com/asp.net/show-4626-1.aspx

以下操作在環境:Windows2003 R2 + .NET2.0 + IIS6 + MS SQL2000 + VS2005(en)

先來看一個表結構

Create Table Test
(
PID varchar(100),
PName varchar(100),
PQty int,
PPrice money
)

創建一個存儲過程

CREATE PROCEDURE procTest
@condition varchar(1000)
AS
DECLARE @sql varchar(8000)
SET @sql = 'SELECT PID, PName, PQty FROM Test '
IF @condition <> ''
   SET @sql = @sql + @condition
EXEC(@sql)

這裏需要說明的是,我看MSDN和網上的例子使用的都是直接SELECT語句帶參數的存儲過程,但很多時候都需要通過構造SQL語句進行查詢,所以我這裏主要講的是如何使用EXEC這樣構造SQL語句的存儲過程。

建一 ASP.NET WebApplication,在App_Code目錄(沒有的話可以右鍵選擇 Add ASP.NET Folder新建此目錄)裏增加一個新項,並選擇DataSet,填寫DataSet名,點擊確定。

在打開的窗口中右鍵選擇Add再選擇TableAdapter,彈出TableAdapter連接嚮導對話框,連接數據庫(這個過程略),選擇 Use existing stored procedrues(已存在的存儲過程),點擊下一步,選擇procTest,直接點完成,這樣一個TableAdapter算是建好了。

如果那個存儲過程直接是SELECT PID, PName, PQty FROM Test 那建好的TableAdapter就會直接把PID, PName, PQty 當作列顯示出來,但用的是EXEC所以要手工將PID, PName, PQty 在右鍵->新建Column裏把這幾個加進去,加完後,存盤,然後新建一個Report文件,新建完後,在Report窗口左側會把剛剛建的 TableAdapter顯示出來,把PID, PName, PQty 列拖到Report窗口中,佈局自己搞定,存盤。

打開Default.aspx文件(自己新建一個都沒所謂),在Toolbox裏的Data中將ReportView控件拖到窗口上,選擇剛剛新建的Report文件,然後再拖一個Textbox和一個Button,雙擊Button打開Code窗口填寫代碼

protected void Button1_Click(object sender, EventArgs e)
{
string condition = "";
if ( Textbox1.Text.Trim() != "" )
{
   string condition = "PID = '" + Textbox1.Text.Trim() + "'";
}

//清除數據源原參數
ObjectDataSource1.SelectParameters.Clear();
//增加數據源參數
ObjectDataSource1.SelectParameters.Add("condition", condition);
//讓ReportView重新加載數據源
ReportViewer1.LocalReport.Refresh();
}

好,這樣一來,報表便寫成了,按下Ctrl+F5健,便可看到效果了

報表中使用最多的就是列合計了,那如何增加列合計呢?

首先使用=Sum(Fields!PQry.Value)是肯定不行的,如果這樣使用,你會發現在報表中出現一個#Error的樣字,剛開始我也是百思不得其解,按照MSDN的解釋使用Sum是可以進行合計的啊,=Fields!PQry.Value可以顯示,爲什麼=Sum(Fields!PQry.Value)卻顯示#Error呢,後經多次調試才發現問題出在TableAdapter的列中,回顧剛剛的過程,那些列都是自己手工加進去的而不是根據SQL自動創建的,所以Sum認不出Fields!PQry.Value,只能是出現一個#Error,看來只能另外想辦法了。

我剛開始認爲那個Report.rdlc文件上的Textbox都是可以獲取的,獲取後人爲的把合計值加進去,可不管我用什麼方法,FindByControl裏總是null,看來只能想其他辦法,我想應該用參數方式將合計值傳過去,重新打開Report.rdlc文件,在窗口的灰色空白處右鍵選擇Report Paraments後可以增加參數,隨後隨便新建一個參數paraQty,選擇允許空值與允許null值,這樣參數建好了,點擊確定關閉窗口並拖一個 Textbox到窗口上,Textbox內容填寫=Parameters!paraQty.Value,就看怎麼傳值了。可MSDN上也沒講什麼,網上問的人也不少,但都沒有解決辦法,鬱悶的要死,又不想重新使用其他控件,看來只能細心研究了,經過多次努力,終於找到解決辦法,就是使用 SetParameters方法將參數傳遞過去,代碼如下(代碼加在ReportViewer1.LocalReport.Refresh();這句上面)

Microsoft.Reporting.WebForms.ReportParameter p = new Microsoft.Reporting.WebForms.ReportParameter("paraQty", "123");
ReportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter[] { p });

重新按下Ctrl+F5,在報表中就會看到123的字樣了,好,現在只要將123替換成合計值就完成了,當然得到合計值的辦法很多,比如直接從 ObjectDataSource1(爲ReportView控件選擇rdlc文件時自動創建的數據源控件)中獲取即可,值得一提的是不能使用 Compute("Sum(PQty)", "true")獲得,因爲PQty列的數據類型是String的,所以使用Sum時會報錯,只能通過累加的方式取得,完整代碼如下

protected void Button1_Click(object sender, EventArgs e)
{
string condition = "";
if ( Textbox1.Text.Trim() != "" )
{
string condition = "PID = '" + Textbox1.Text.Trim() + "'";
}

//清除數據源原參數
ObjectDataSource1.SelectParameters.Clear();
//增加數據源參數
ObjectDataSource1.SelectParameters.Add("condition", condition);
//獲取數據源
DataTable dt = ((DataView)ObjectDataSource1.Select()).Table;
//合計相關列
int qty_sum = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
qty_sum += int.Parse(dt.Rows[i]["PQty"].ToString());
}
//設置報表參數
Microsoft.Reporting.WebForms.ReportParameter p = new Microsoft.Reporting.WebForms.ReportParameter("paraQty", qty_sum.ToString());
ReportViewer1.LocalReport.SetParameters(new Microsoft.Reporting.WebForms.ReportParameter[] { p });
//讓ReportView重新加載數據源
ReportViewer1.LocalReport.Refresh();
}
至此便大功告成。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章