前段時間開發報表,採用了 reportviewer + rdlc , 開發整理如下.
ms 的datagrid ,gridview,和 reportviewer 分頁機制差不多,都需要繫結全部資料,ms控制項自動處理分頁。 只是reportviewer 是按頁面布局分頁的,而不是按資料條數。繫結全部資料的方式會無謂的增加伺服器壓力,尤其是資料計算和表關聯多的情況下。為了減輕伺服器壓力,我們採用資料分頁,資料傳到應用伺服器端後,再加工一下(插入空資料),做也可分頁資料來源。
如果資料庫有 100 條資料,每頁10條資料,那儲存過程返回10條資料後,還需要再插入90條資料。當資料大的時候,插入的資料也很多。有沒有插入資料再少一點的辦法呢?
當然是有了,沒有就不寫了。
。先提兩個概念:維度和指標.
維度: 是指公司,專案,區域等要分析的物件.
指標: 是指針對維度進行計算的結果
1. 先對維度進行分頁.
2.針對分頁結果,有針對性的進行指標計算 ,可以把每個計算列,做成函式,方便呼叫,同時,也方便維護和測試。
方案是把頁碼做成分組,這樣再插入的時候,就只插入 celling( 90 ÷ 10 ) 條的空分組資料即可。 插入的資料少了 n 倍。
存存過程示例**:
createproc
[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("之後,再把 datatable 轉成 實體列表。方便rdlc資料繫結。sp_report_modulevisitstatisview
", pars);
pagecount = convert.toint32(pars[6].value);
dt.reportwrap(pageindex -1 , pagecount);
另註:上面的 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條件 把 主題區域 的...