[转]RDL(C) Report Design Step by Step 3: Mail Label
本文轉(zhuǎn)自:http://www.cnblogs.com/waxdoll/archive/2006/09/02/493350.html
?Crystal Report在報(bào)表向?qū)е刑峁┝巳N向?qū)ь愋徒o用戶進(jìn)行選擇——Standard、Cross-Tab和Mail Label,而Visual Studio/BIDS報(bào)表向?qū)е挥袃煞N——表格格式和矩陣,這是和Crystal Report的前兩種報(bào)表類型相對(duì)對(duì)應(yīng)的,那么怎么在Visual Studio/BIDS中實(shí)現(xiàn)Mail Label呢?
??? 先來看一下什么是Mail Label。Mail Label如果直譯成中文的話,就是“郵件標(biāo)簽”,這是一個(gè)有歧義的名詞,一些郵箱(如Gmail)和客戶端郵件工具(如Foxmail)將“郵件標(biāo)簽”作為一種將郵件進(jìn)行分類以方便信息管理的工具。而本篇隨筆討論的顯然無關(guān)“電子”郵件,而是一種比較常用的報(bào)表。設(shè)想如下的場(chǎng)景:如果一個(gè)組織(比如一家出版社)需要向一批客戶發(fā)一份比較正式的書面信件(比如征訂啟事)。而這些客戶的通信地址、收件人郵政編碼等又以某種形式(數(shù)據(jù)庫、平面文件等)存儲(chǔ)在計(jì)算機(jī)中,工作人員顯然不希望在每一個(gè)信封上手工書寫這些信息,他/她要做的無非是把這些打印出來并粘貼到信封上就可以了。這樣的話,一個(gè)普通的報(bào)表也可能就已經(jīng)能夠滿足他/她的需求了,盡管我們知道郵政編碼、通信地址、收件人三個(gè)字段之間是需要換行的。但是,如果他/她恰巧使用的是常見的如A4之類的紙張,而同時(shí)他/她又不希望浪費(fèi)紙張,那么他/她希望要的報(bào)表可能就是如圖1所示的報(bào)表了。這就是所謂的“郵件標(biāo)簽”報(bào)表了,當(dāng)然“郵件標(biāo)簽”報(bào)表不僅僅局限于多個(gè)信件通信地址的一次打印,凡是具有類似結(jié)構(gòu)的報(bào)表都可以被稱為“郵件標(biāo)簽”報(bào)表。
圖1 Access的Northwind示例數(shù)據(jù)庫中的“郵件標(biāo)簽”報(bào)表(點(diǎn)擊小圖看大圖)
??? 正如圖1的標(biāo)題所示,Access是支持“郵件標(biāo)簽”報(bào)表的,不過在報(bào)表設(shè)計(jì)上只是讓標(biāo)簽中涉及到的字段縱向排列而已,真正實(shí)現(xiàn)多列標(biāo)簽打印是通過對(duì)報(bào)表的“頁面設(shè)置”來完成的,如圖2所示。
圖2 Access中“郵件標(biāo)簽”報(bào)表的“頁面設(shè)置”
??? 在進(jìn)行報(bào)表設(shè)計(jì)之前,我們先為本文的郵件標(biāo)簽進(jìn)行數(shù)據(jù)準(zhǔn)備。本文的示例報(bào)表的數(shù)據(jù)來源于SQL Server 2005的示例數(shù)據(jù)庫AdventureWorks,在AdventureWorks數(shù)據(jù)庫中使用以下SQL語句建立視圖Production.MailLabel:
代碼1:創(chuàng)建視圖Production.MailLabel USE?[AdventureWorks] GO /**//******?對(duì)象:??View?[Production].[MailLabel]????腳本日期:?08/26/2006?16:05:26?******/ SET?ANSI_NULLS?ON GO SET?QUOTED_IDENTIFIER?ON GO CREATE?VIEW?[Production].[MailLabel] AS SELECT?????Production.Product.Name,?Production.Product.Color,?Production.ProductPhoto.ThumbNailPhoto FROM?????????Production.Product?INNER?JOIN ??????????????????????Production.ProductProductPhoto?ON?Production.Product.ProductID?=? Production.ProductProductPhoto.ProductID?INNER?JOIN ??????????????????????Production.ProductPhoto?ON?Production.ProductProductPhoto.ProductPhotoID?=? Production.ProductPhoto.ProductPhotoID WHERE?????(Production.Product.Color?IS?NOT?NULL) GO??? 打開視圖,我們可以得到如圖3所示的示例數(shù)據(jù),這將是本文示例所使用的報(bào)表數(shù)據(jù)。
圖3 示例使用數(shù)據(jù)
??? 也就是說,本文的示例演示的郵件標(biāo)簽中展示的數(shù)據(jù)是AdventureWorks生產(chǎn)的自行車的名稱、顏色以及縮略圖。
??? 既然是郵件標(biāo)簽,我們要將Name、Color以及ThumbNailPhoto這三個(gè)一行中字段縱向顯示,這個(gè)比較容易實(shí)現(xiàn);我們還需要將指定行數(shù)的數(shù)據(jù)作為一列顯示在報(bào)表中,這就涉及到行到列的轉(zhuǎn)換問題。事實(shí)上,可以說行列轉(zhuǎn)換問題是郵件標(biāo)簽報(bào)表面臨的最大的問題,要解決這個(gè)問題,一種可行的方案是使用SQL語句中出現(xiàn)在FROM子句中的PIVOT關(guān)系運(yùn)算符將表結(jié)構(gòu)進(jìn)行轉(zhuǎn)換,然后使用Table控件顯示數(shù)據(jù)。另外,我們知道標(biāo)準(zhǔn)控件中的Matrix控件的功能其實(shí)就是一個(gè)Pivot Table(數(shù)據(jù)透視表),我們可以清楚地在控件工具欄上看到對(duì)Matrix控件的提示是“用于任何多列樣式報(bào)表的行列布局”,該控件對(duì)數(shù)據(jù)的處理其實(shí)是和PIVOT運(yùn)算符是相通的,就是說使用該控件可以避免使用PIVOT運(yùn)算符而實(shí)現(xiàn)一個(gè)交叉表的結(jié)構(gòu),所以本文選擇使用這種方案來實(shí)現(xiàn)郵件標(biāo)簽報(bào)表。
??? 1、創(chuàng)建報(bào)表服務(wù)器項(xiàng)目RDLML。
??? 2、新建共享數(shù)據(jù)源DataMailLabel,設(shè)置到數(shù)據(jù)庫AdventureWorks的連接,并為報(bào)表指定相應(yīng)的訪問憑據(jù)。
??? 3、不使用向?qū)陆▓?bào)表rptMailLabel,在報(bào)表設(shè)計(jì)器的“數(shù)據(jù)”選項(xiàng)卡,新建數(shù)據(jù)集MailLabel,使用工具欄按鈕切換到通用查詢?cè)O(shè)計(jì)器,在“關(guān)系圖”窗格中使用右鍵菜單“添加表”并選擇視圖Production.MailLabel,選擇Name、Color、ThumbNailPhoto三列作為輸出,這樣我們?cè)赟QL窗口中可以看到以下SQL語句:
代碼2:選擇數(shù)據(jù)的SQL語句 SELECT? ????Name,? ????Color,? ????ThumbNailPhoto FROM?Production.MailLabel??? 4、在SQL窗格中修改代碼2中的SQL語句如代碼3所示。
代碼3:修改代碼2得到的SQL語句 SELECT? ????(ROW_NUMBER()?OVER?(ORDER?BY?Name)?-?1)?/?4?+?1?AS?TitleRow,? ????(ROW_NUMBER()?OVER?(ORDER?BY?Name)?-?1)?%?4?+?1?AS?TitleColumn,? ????Name,? ????Color,? ????ThumbNailPhoto FROM?Production.MailLabel??? 代碼3中,ROW_NUMBER()用于為返回?cái)?shù)據(jù)的行號(hào),需要和OVER關(guān)鍵字結(jié)合使用,使用OVER關(guān)鍵字可能會(huì)導(dǎo)致圖4所示提示信息的出現(xiàn),這是由于通用查詢?cè)O(shè)計(jì)器不支持OVER關(guān)鍵字所導(dǎo)致的,而事實(shí)上T-SQL是支持該關(guān)鍵字的,可以忽略此信息的出現(xiàn)。
圖4 使用OVER關(guān)鍵字出現(xiàn)的提示信息
??? 代碼3選擇出的數(shù)據(jù)如圖5所示。
圖5 代碼3選擇出的數(shù)據(jù)
??? 5、按照?qǐng)D6的方式進(jìn)行報(bào)表布局設(shè)計(jì)。
圖6 報(bào)表布局設(shè)計(jì)
??? 其中,拖動(dòng)圖像控件到報(bào)表布局時(shí)會(huì)出現(xiàn)“圖像向?qū)А?#xff0c;在“選擇圖像源”頁面中選中“數(shù)據(jù)庫”,并在接下來的“指定圖像字段”頁面中,進(jìn)行如圖7所示的設(shè)置。
圖7 指定圖像字段(點(diǎn)擊小圖看大圖)
??? 6、選中值為“=Fields!TitleRow.Value”的文本框,右鍵“屬性”,在“文本框?qū)傩浴睂?duì)話框的“可見性”選項(xiàng)卡中,選擇“初始可見性”為“隱藏”,同樣設(shè)置值為“=Fields!TitleColumn.Value”的文本框。
??? 7、為了明顯區(qū)分郵件標(biāo)簽列表中的各個(gè)項(xiàng)目,可以選中列表框控件,F4調(diào)出屬性瀏覽器,設(shè)置BorderColor為L(zhǎng)ightGray,設(shè)置BorderStyle為Dashed;另外,為了使報(bào)表看起來更美觀,可以在列表框中微調(diào)控件的位置。
??? OK,到此為止,一個(gè)郵件標(biāo)簽報(bào)表就設(shè)計(jì)完成了,其預(yù)覽效果如圖8所示。
圖8 預(yù)覽效果(點(diǎn)擊小圖看大圖)
??? 至于在這些步驟中隱藏的設(shè)計(jì)思路,請(qǐng)朋友們自己總結(jié)。
??? DEMO下載
??? 感謝jimmyhell在本Blog的評(píng)論,是他提出了這個(gè)問題,不然我不會(huì)想到要去做一個(gè)郵件標(biāo)簽報(bào)表,謝謝!
???? ?
Life is like a boat, and I'm at sea.
?
總結(jié)
以上是生活随笔為你收集整理的[转]RDL(C) Report Design Step by Step 3: Mail Label的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python对json数据的提取
- 下一篇: UML用例图与类图