2013年9月26日 星期四

[Notes] 2013 TechDays


今年(2013)的TechDays 課程相當豐富,

可以看到各家廠商的新產品和來自全國的 IT, RD的交流, 真是興奮。

另一方面也藉由老師和前輩們的分享, 看到自己的不足和需要加強之處~

除了微軟發表各重量級的新版軟體, 這次的TechDays,對於小弟來說,也更著墨於

1. 產品和雲端的結合
2.  HDInsight 的Hadoop架構
3. 開發工具與專案管理的結合
4. 跨平台開發
5. Agile thinking 

明天是最後一天, 早點休息養足精神囉!



2013年9月17日 星期二

ReportViewer 在VS2010的使用方式(三)


ReportViewer VS2010的使用方式(三)

作者:JB

目前我們已經知道如何用ReportViewerbind資料,
1.
ReportViewer 在VS2010的使用方式(一):使用元件功能設定資料來源

在此篇文章會介紹如何修改Rdlc報表做分頁。
此文章仍是沿用既有的專案做修改。

1.      開啟「MyReport.rdlc



2.      點選【資料列群組】下方的【詳細資料】右邊的箭頭,選擇【加入群組】→【父群組】。



3.      Tablix群組,輸入「群組依據」為
= Int((RowNumber(Nothing)-1)/5)
按下「確定」。



※此公式意指不對任何欄位做群組,而是單純以RowNumber5筆分頁

4.      此時報表上面的欄位多出一個Group1資料行。(如果您不想顯示這個資料行,稍後會進行刪除。)



5.      但是到這邊執行起來的話,會出現一個error
「‘Tablix1’ 的排序運算式使用函數 RowNumber。排序運算式中不能使用 RowNumber。」       
原來我們剛剛加了群組後,報表會自動把群組的欄位(這邊是RowNumber)當成排序的條件!
所以我們必須自行刪除這個排序條件。

點選【資料列群組】下方的【Group1】右邊的箭頭,選擇【群組屬性】。
開啟群組屬性視窗後, 到「排序」頁面下,點選右邊的排序依據,然後【刪除】它。 (如下圖)
刪除後,先別急著關閉群組屬性


6.      雖然在上面的步驟已經解決了把RowNumber當成排序條件的錯誤。 但是這樣還不能成功分頁。
必須再做以下設定,一樣是在「群組屬性」→「分頁符號」頁面下,勾選

u  在群組的每個執行個體之間
u  也在群組的結尾



7.      進行以上的設定後,終於可以分頁了! 但是左邊多出一個Group1的資料行? 另外從第二頁開始的表頭欄位通通不見了?
第一頁:正常


第二頁:#@#$R$%$@



8.      多出一個Group1的資料行解決方式,在報表設計畫面上,直接選取Group1的整個資料行,


右鍵選擇【刪除資料行】


此時會跳出確認對話窗,請務必選擇「只刪除資料行」!


成功將Group1欄位刪除,但是仍然有群組的作用,所以分頁沒有問題!



9.      至於要重新將每個分頁上面的表首欄位叫出來, 可能大家有發現在 「Tablix屬性」裡面,有選項可以設定耶! 大家可以試看看,在VS2010 Sp1 這個設定是無效的 (怒!




要解決這個問題,請參考以下前輩的文章:

[C#][WebForm]如何固定ReportView表頭

RDLC 設計心得,重複標題,連續報表,單頁大小

但是目前測試結果,好像有時候可以有時候不行 … Orz
有興趣可以參考以下步驟試看看




畫面會變成這樣



點選【資料列群組】→Group1上面的「靜態」 , 到右方的屬性將
RepeatOnNewPage」設定為 True





10.  結論是 X你又浪費我一天時間了 >_<

ReportViewer 在VS2010的使用方式(二)


 ReportViewer VS2010的使用方式(二)

作者:JB

ReportViewer 在VS2010的使用方式(一)
我們是使用ReportViewer元件上內建的資料來源做設定, 這邊則介紹如何手動指定資料來源。

PS.
專案我是沿用
上一篇的程式,所以假設我們已經建立好資料模型和Rdlc報表的部分。

1.      新增一支index_manual.aspx
2.      index_manual.aspx加入ReportViewer Script Manager,但是不做任何報表和來源資料的設定。


3.      手動作ReportViewer的設定和繫結,可分成以下步驟:
u  Step1. 設定ReportViewer的屬性和Rdlc報表來源
u  Stpe2. 設定ReportDataSource (待會要給ReportViewer使用)
u  Step3. ReportViewer掛載ReportDataSource

4.      設定ReportViewer的屬性和Rdlc報表來源

ReportViewer1.Visible = true;
ReportViewer1.ShowRefreshButton = false; //
不顯示refresh按鈕
ReportViewer1.PageCountMode = PageCountMode.Actual; //顯示實際頁數
ReportViewer1.LocalReport.ReportPath=@"Rdlc\MyReport.rdlc";


※請注意在指定ReportPath的時候,要加上外層的資料夾名稱,並以 \ 指到下一層。

5.      設定ReportDataSource

///第一個參數: RDLC報表裡面的DataSet名稱
///第二個參數:動態資料(DataTable
ReportDataSource rds = new ReportDataSource("MyDataSet", new Data().Get());

※請注意Data類別裡面的Get()方法是我們自行建立取得資料的函式。

6.    ReportViewer掛載ReportDataSource

ReportViewer1.LocalReport.DataSources.Clear();
ReportViewer1.LocalReport.DataSources.Add(rds); //
加入ReportDataSource
ReportViewer1.DataBind();
ReportViewer1.LocalReport.Refresh();


7.      執行結果



2013年9月16日 星期一

ReportViewer 在VS2010的使用方式(一)

ReportViewer VS2010的使用方式(一)

作者:JB

因為專案需要,所以是第一次使用ReportViewer這個元件。
雖然比一般報表支援更多功能,至於好不好用,則見人見智了。
(不過BUG倒是不少 ~_~

另外我是使用VS2010Microsoft.ReportViewer.WebForms.dll 版本: v2.0.50727
( Namespace :  
Microsoft.Reporting.WebForms.ReportViewer  )


1.      加入一支「index.aspx」並將其設定為起始頁面。




2.      建立資料模型
專案下新增一個Model資料夾,並在裡面加入任何資料模型。 因為是範例,所以我這邊加入一個回傳DataTableClass,並手動產生一些資料。 (實際上你可以使用ADO.NETEF模型皆可)

public class Data
{
   private const String COL_1 = "
姓名";
   private const String COL_2 = "
性別";
   private const String COL_3 = "
電話號碼";

   ///
取得資料
   public DataTable Get()
   {
     DataTable dt = new DataTable();
     dt.Columns.Add( new DataColumn( COL_1 ) );
     dt.Columns.Add( new DataColumn( COL_2 ) );
     dt.Columns.Add( new DataColumn( COL_3 ) );

     ///
加入一些資料
    
for (int i = 0; i < 20; i++)
     {
        String simName = String.Format("JB{0}", i.ToString());
        String simSex = (i%2 ==0) ? "
" :"";
        String simPhoneNum = "09XX-123-456";
        DataRow dr = dt.NewRow();
        dr[COL_1] = simName;
        dr[COL_2] = simSex;
        dr[COL_3] = simPhoneNum;
        dt.Rows.Add(dr);
     }
     return dt;
}
3.      RDLC報表
因為ReportViewer必須搭配Rdlc報表,所以我在專案加入一個Rdlc資料夾,開始新增一個Rdlc報表。

加入一個「報表精靈」...



請從報表精靈設定Rdlc報表的資料集屬性~
名稱: 請自行設定(稍後會使用到)
資料來源
如果您有設定資料模型,這裡就會列出資料模型的名稱。
此範例則顯示本專案名稱。 另外也可以在這邊直接點選【新增】加入一個新的資料庫模型。
可用資料集:資料模型下的資料集或資料表名稱。

設定好之後,右邊會顯示欄位名稱和型別。





選擇可用的欄位。 另外也可以在這邊設定要做群組的資料列或資料行,或是稍後設定。




最後會顯示預覽和樣式選擇,完成報表精靈。



4.      ReportViewer
建好報表後,接下來終於換主角登場。 請在index.aspx放上去一個ReportViewer
另外因為ReportViewer必須搭配ajax,所以請在網頁上加入一個ScriptManager的宣告,否則在執行階段會馬上出現錯誤:「報表檢視器 Web 控制項需要 Web Form 上的 System.Web.UI.ScriptManager」。



點選ReportViewer右上角的設定,選擇報表為剛才新增的Rdlc報表。




JB
這時候直接執行, 出現以下錯誤訊息。 原來是我們剛才的步驟都僅止於設定Rdlc報表、ReportViewer的欄位,至於實際上的資料怎麼進來,還需要另行設計 lol







5.      ObjectDataSource

上面提到ReporViewer的資料來源要另行設計,這個關鍵就是要建立「ObjectDataSource」, 剛才你可能發現了,可以直接在ReportViewer上面直接建立一個ObjectDataSource。 如下圖






資料來源類型請選擇「物件」






選擇SELECT的方法




到這邊就大功造成,可以直接執行來看結果吧!



6.      最後,我們再來複習一下,整個建立ReportViewer的步驟:
u  建立資料模型
u  建立Rdlc報表
u  建立ReportViewer並設定來源報表
u  ReportViewer建立DataSource來源