花了兩天的時間,找了資料分頁的相關技術資料 當DataGrid遇見100萬筆資料
再將 extjs grid paging 的 sample 好好看了一遍並測試
分頁展示的部份終於完成了
在進入程式說明之前,我們先來看一下整體運作的架構
首先我們讓User去查詢 po_finished.aspx 將已完成簽核的單據給撈出來
並以分頁的方式來呈現,當然Ajax及分頁的處理都交給 pgfinished.js
這個以 extjs library所撰寫的 javascript
由於之前提到我們是以 JsonStore 來擷取後端資料並以Json String的方式傳輸到前端
所以我們定義了一個 qryfinished2.aspx 來當作 pgfinished.js 跟 qryfinished.asmx 這個 Web Service 中間的橋樑
資料分頁的部份,除了前端操作介面傳遞 Page Number 與 Page Size 外
我們在資料庫的部份是以 Store Procedure 來接收前端傳過來的這兩個參數值
依據這樣的架構,我們就可以很簡單的享有資料分頁的功能
接下來我們進入程式說明的部份
qryMasterPage.master
<%@ Master CodeFile="qryMasterPage.master.vb" Inherits="qryMasterPage" Language="VB" %> <script src="js/ext-2.0/adapter/ext/ext-base.js" type="text/javascript"></script> <script src="js/ext-2.0/ext-all.js" type="text/javascript"></script> <link href="menus.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> </script> </head> <script src="js/ext-2.0/examples/examples.js" type="text/javascript"></script> <br /> |
po_finished.aspx
因為有多個畫面都共用一個 Master Page,所以將個別使用的部份寫在
ContentPlaceHolder 裡面
<%@ Page AutoEventWireup="false" CodeFile="po_finished.aspx.vb" Inherits="po_finished" <asp:Content ID="Content1" runat="Server" ContentPlaceHolderID="ContentPlaceHolder1"> <script type="text/javascript"> <script src="combos.js" type="text/javascript"></script> <link href="combos.css" rel="stylesheet" type="text/css" /> <script src="pgfinished.js" type="text/javascript"></script> <!-- extjs Library --> <div id="pb_master"> |
pgfinished.js
/* Ext.onReady(function(){ Ext.QuickTips.init(); // pluggable renders t=record.data.SignTime-record.data.StartTime; var fs = new Ext.FormPanel({ fs.render('form-ct'); store.load({params:{start:0, limit:25}}); // 必要參數 fs.getTopToolbar().add('->', { }); |
在 pgfinished.js 裡面由上到下,我們先定義一個 Ext.data.JsonStore 將 qryfinished2.aspx 中所傳回的 Json String
存在 store 變數中,供 Grid Panel 使用
在 Form Panel 上我們定義了一個 Field Set 以及一個 Grid Panel,在 Grid Panel 中我們將 data store 指向我們剛定義的
store 變數,並在底下加上一個 PageToolBar (bbar 參數),PageSize設為 25 即一頁顯示25筆 Record
Define 完 UI 部份,我們將 Form Panel render 在 qryMasterPage.master 中的 <DIV> tag "form-ct"
即 Form 的 Container,同時開始進行資料的擷取 store.load()
由於我們要做分頁,所以必須將參數傳遞給 store 中 define 的 url
qryfinished2.aspx
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="qryfinished2.aspx.vb" Inherits="qryfinished2" %> |
qryfinished2.vb
Partial Class qryfinished2 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If start = 0 Then JSONString = myJSONObject.ToJSONString(uid, pg, limit) ' 將 JSONString 傳至前端 |
接下來我們來看 qryfinished.asmx的程式
Imports System.Web <WebService(Namespace:="http://xxx/webservices> _ Dim connERP As System.Data.Odbc.OdbcConnection = Nothing <WebMethod()> _ ReDim oAudits(0) Try Init_Connection() strSQL = "select count(*) as n from vw_po_finished" ' 計算總筆數 store 中的 totalProperty 使用 sqlCommand = New System.Data.SqlClient.SqlCommand(strSQL, connWorkFlow) drWorkflow = sqlCommand.ExecuteReader() If drWorkflow.Read() Then drWorkflow.Close() strSQL = "exec sp_po_finished @page=" + CStr(pg) + ",@limit=" + CStr(limit) + ",@userid='" + uid + "'" sqlCommand = New System.Data.SqlClient.SqlCommand(strSQL, connWorkFlow) drWorkflow = sqlCommand.ExecuteReader() Do While drWorkflow.Read() '組織 Json Array ReDim Preserve oAudits(iCount - 1) starttime = drWorkflow.GetDateTime(drWorkflow.GetOrdinal("StartTime")).ToString() oAudits(iCount - 1) = New Audits() oAudits(iCount - 1).Diff = getSignTime(CDate(starttime), CDate(signtime)) Loop drWorkflow.Close() Close_Connection() Return "{""totalCount"":" + CStr(totalcount) + ",""data"":" + JavaScriptConvert.SerializeObject(oAudits) + "}" ' 回傳 Json String Private Sub Init_Connection() connWorkFlow = getSqlConnection(connWorkFlowString) End Sub Private Sub Close_Connection() If Not connWorkFlow Is Nothing Then connWorkFlow = Nothing |
最後我們再說明一下 SQL Server 2000 中如何透過 T-SQ來達到資料分頁的作法
CREATE PROCEDURE [dbo].[sp_po_finished] set @strSQL='SELECT TOP '+convert(varchar(10),@limit)+' * from vw_po_finished ' print @strSQL exec (@strSQL) end |
說穿了,就是透過兩個 select TOP statement 來完成,舉例說 我們要看 26~50 筆的記錄
就是 select TOP 25 ... NOT IN (select TOP (2-1)*25 ...),因為 26~50 筆在第二頁 :)
完成圖
程式碼
張貼留言