ReportViewer,RDLC 報表開發之分頁

2022-01-14 04:54:46 字數 3266 閱讀 8224

前段時間開發報表,採用了 reportviewer + rdlc , 開發整理如下.

ms 的datagrid ,gridview,和 reportviewer 分頁機制差不多,都需要繫結全部資料,ms控制項自動處理分頁。 只是reportviewer 是按頁面布局分頁的,而不是按資料條數。繫結全部資料的方式會無謂的增加伺服器壓力,尤其是資料計算和表關聯多的情況下。為了減輕伺服器壓力,我們採用資料分頁,資料傳到應用伺服器端後,再加工一下(插入空資料),做也可分頁資料來源。

如果資料庫有 100 條資料,每頁10條資料,那儲存過程返回10條資料後,還需要再插入90條資料。當資料大的時候,插入的資料也很多。有沒有插入資料再少一點的辦法呢?

當然是有了,沒有就不寫了。

。先提兩個概念:維度和指標.

維度: 是指公司,專案,區域等要分析的物件.

指標: 是指針對維度進行計算的結果

1. 先對維度進行分頁. 

2.針對分頁結果,有針對性的進行指標計算 ,可以把每個計算列,做成函式,方便呼叫,同時,也方便維護和測試。

方案是把頁碼做成分組,這樣再插入的時候,就只插入 celling( 90 ÷ 10 ) 條的空分組資料即可。 插入的資料少了 n 倍。

存存過程示例**:

create

proc

[dbo

].[r_analysis](

@query

varchar(50)=

'', --

查詢條件

@pageindex

int=

1 , --

從1開始

@pagesize

int=

50 , --

每頁條數,傳入 <=0 表示不分頁。

@pagecount

int=

0 output --

總頁數 輸出引數)as

begin

declare

@rowcount

int ;

--寫業務,返回分頁結果 , 分頁結果放到 表變數 @list 中

/*示例:
with query_rank as

(select row_number() over (order by 1 )as rownumber ,*

from t_room

)select col1,col2, dbo.func1(col1) , dbo.func2(col1,col2)

fromquery_rank

whererownumber between 100 and 150

*/
if(@pagesize

>

0 )begin

--計算 @rowcount

set@pagecount

=ceiling( @rowcount

*1.0

/@pagesize) ;

endelse

begin

set@pagecount=1

endend

所需要的兩個程式加工函式:

public

static ienumerablereportwrap(this ienumerablesource, int currentpageindex, int pagecount)

where t : ireportmodel, new()

yield

break;

}func createemptyobj = (currentindex) =>

;for (int i = 0; i < currentpageindex; i++)

foreach (var item in source)

for (int i = currentpageindex + 1; i < pagecount; i++)

}public

static datatable reportwrap(this datatable source, int currentpageindex, int pagecount)

func createemptyobj = (currentindex) =>

;for (int i = 0; i < currentpageindex; i++)

for (int i = currentpageindex + 1; i < pagecount; i++)

return source;

}

程式呼叫函式**,很簡單:

datatable dt = db.exec_sp_datatable("

sp_report_modulevisitstatisview

", pars);

pagecount = convert.toint32(pars[6].value);

dt.reportwrap(pageindex -1 , pagecount);

之後,再把 datatable 轉成 實體列表。方便rdlc資料繫結。

另註:上面的 ireportmodel , 是乙個只包含 syspageindex 屬性的介面. 它約束了報表返回的model 必須繼承自 ireportmodel 且必須擁有 無參建構函式.

1. 無參建構函式的作用是 初始化空物件. 比如: 字串型別的,要設定為 string.empty . 數值型別要設定為 0.

2.介面是約束model 必須具有 syspageindex 屬性用於頁碼值.

報表rdlc 的設定:

繫結資料來源,新增父組,選 syspageindex。在該列的屬性上設定: hidden = true , width = 0cm。即隱藏該列。後端繫結**:

reportdatasource data = new reportdatasource("

logsource

", mybiz.getlogreportdata("

query

~/admin/report/log.rdlc

")));

this.reportviewer1.localreport.datasources.clear();

this.reportviewer1.localreport.datasources.add(data);

至此,分頁就做好了.

reportingservice 報表開發雜項

1 新增行號 rownumber nothing ssrs內建函式rownumber,這裡最主要的是傳入引數 nothing 2 行間不同背景色的設定 iif rownumber nothing mod 2,white gainsboro 通過行號模2,設定背景顏色。3 分母為0的處理 iif fi...

Reporting Service報表開發

專案中需要用到報表,經過技術驗證和成本方面的考慮,最後決定使用reporting service,因此在這裡把開發中的一些故事記下來,以備後用。開發環境 vs2005,sql server 2005 sp3,這裡說下為什麼要用sp3,安全問題嘛,呵呵,如果用sp2,就會出現報表無法列印,報的錯誤是 ...

BIEE報表開發

1 報表開發例項結果圖 2 開發報表步驟 1 建立分析 2 建立儀錶盤提示 3 建立儀錶盤並發布 登入 輸入使用者名稱和密碼 1 新建 分析 選擇主題區域 主題區域部分相當於資料庫中的表 所選列區域部分相當於select後面從表中所取的字段 過濾器區域相當於sql中的where條件 把 主題區域 的...