2009年11月20日 星期五

使用Client-Side Report (RDLC) 建立固定筆數的資料表

在上一個例子中,我們使用SQL來產生固定筆數的資料,而在這裡,我們將使用上一篇文章的SQL來建立報表,首先建立Strongly Typed DataTable如下





其中TableAdapter裡的兩個方法GetData1()及GetData2()的SQL則分別如下
GetData1()
SELECT LastName, BirthDate
FROM Employees
GetData2()
WITH EmptyRowNum AS
(
 SELECT ROW_NUMBER() OVER( ORDER BY CustomerID) AS 'Num'
 FROM Customers
)
SELECT 
  ISNULL(LastName,'') LastName , 
  ISNULL(BirthDate,'') BirthDate
FROM
Employees
right outer join
(
 SELECT Num FROM EmptyRowNum WHERE Num <= 12
) TT
on EmployeeID = TT.Num

RDLC報表設計畫面如下(請將BorderStyle設定為Solid以畫出格線)

當使用GetData1()的方法將資料匯入RDLC中後,其結果如下

而使用GetData2()的方法將資料匯入RDLC中後,結果如下

由GetData2()的方法可以以SQL輕鬆的達到我們的需求。
在上一篇文章說到當我們只知道使用GetData1()的方法時,還可以使用另一種寫程式的方式來解決,其方法如下

NorthwndTableAdapters.Employees1TableAdapter adapter =
            new NorthwndTableAdapters.Employees1TableAdapter();

        Northwnd.Employees1DataTable employee =
            adapter.GetData1();

        for (int i = employee.Count; i < 12; i++)
        {
            Northwnd.Employees1Row row = employee.NewEmployees1Row();
            row.LastName = "";
            row.BirthDate = DateTime.Parse("1901/01/01");
            employee.AddEmployees1Row(row);
        }

        ReportDataSource rds = new ReportDataSource();
        rds.Name = "Northwnd_Employees1";
        rds.Value = employee;
        ReportViewer1.LocalReport.DataSources.Add(rds);

其結果如下

請注意BirthDate最後三筆時間為 1901/1/1,此為我們使用撰寫程式的方式,新增的空資料。
當然這並不是我們所要的結果,如果資料型態是DateTime的時候,資料來源就一定需要有預設值,我們可以再設計RDLC的時候,使用運算式的方式(之後如果有機會再來介紹)來將其隱藏
BirthDate欄位的運算式

修改之後的結果如下

結論:
不管使用哪種方法,只要可以解決問題就是好方法,這裡特別感謝pinnywu的協助,提供第一種方式,讓我認知到SQL如果夠強的話,前端的程式真的可以少寫很多,建議各位在寫應用程式的人,有空多學習SQL,畢竟不管前端應用程式怎麼改,後端都還是要接資料庫,所以把SQL學好,對於寫程式幫助是很大的。

沒有留言: