Sabtu, 03 Desember 2011

Teknik Paging menggunakan Table Adapter (Stored Procedure) pada VB.Net

Ok...pertama kita buat terlebih dahulu stored procedurenya. Storde procedure ini yang melakukan paging. Disini juga digunakan fitur baru yang ada di Sql Server 2005 yaitu Common Table Expression (CTE) yang bisa kita gunakan untuk membuat virtual table (create table on the fly).

Database yang digunakan yaitu AdventureWorks, tabelnya tabel Production.Product.

1. Buat stored procedure :


Code:

Create Proc GetProductPaging
@from int, @to int
As
With cteProduct
As
(
Select row_number() Over(Order By ProductID ASC) As recnum,
[Name],ProductNumber
From Production.Product
)
Select * From cteProduct Where recnum Between @from And @to


2. Setelah itu buat design form seperti dibawah ini (label, numericupdown, Button, DataGridView)



3. Tambahkan TableAdapter dengan klik menu Data > Add New Data Source, pilih Database sebagai DataSource nya...Setelah itu pilih object Stored Procedure yang sudah dibuat diatas...maka hasilnya akan dibuatkan sebuah Dataset dengan TableAdapter seperti gambar dibawah ini :



4. Sekarang kita mulai membuat code nya. Tamabahkan code ini didalam class Form yang digunakan :

Code:

Imports System.Data.SqlClient

Public Class Form1

Private intStartRec, intRecPerPage, intTotalRec As Integer
Private taProduct As AdventureWorksDataSetTableAdapters.GetProductPagingTableAdapter
Private tblProduct As DataTable

Private Sub GetData(ByVal startRecord As Integer, ByVal maxRecord As Integer)
taProduct = New AdventureWorksDataSetTableAdapters.GetProductPagingTableAdapter
tblProduct = taProduct.GetData(startRecord, maxRecord)
DataGridView1.DataSource = tblProduct
End Sub

Private Sub SetRecordLabel()
Label2.Text = "Start Record Number : " + (intStartRec + 1).ToString + _
" From total record : " + intTotalRec.ToString
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
intRecPerPage = NumericUpDown1.Value '//jumlah record per page
intStartRec = 0 '//index record awal
GetData(intStartRec, intRecPerPage)
intTotalRec = taProduct.GetTotalRecord
SetRecordLabel()
End Sub

Private Sub btnFirst_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirst.Click
intRecPerPage = NumericUpDown1.Value
intStartRec = 0
GetData(intStartRec, intRecPerPage)
SetRecordLabel()
End Sub

Private Sub btnPrevious_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevious.Click
intRecPerPage = NumericUpDown1.Value
intStartRec -= intRecPerPage

'cek jika start index recordnya < 0
'maka berarti recordnya sudah tidak ada lagi (stop Previous!!)
If intStartRec >= 0 Then
GetData(intStartRec + 1, intStartRec + intRecPerPage)
SetRecordLabel()
Else
'reset kembali start record indexnya
intStartRec += intRecPerPage
End If
End Sub

Private Sub btnNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNext.Click
intRecPerPage = NumericUpDown1.Value
intStartRec += intRecPerPage

'cek jika start index recordnya sama dengan jumlah record total
'atau lebih besar dari total record
'maka berarti recordnya sudah tidak ada lagi (stop Next!!)
If intStartRec < taProduct.GetTotalRecord() Then
GetData(intStartRec + 1, intStartRec + intRecPerPage)
SetRecordLabel()
Else
'reset kembali start record indexnya
intStartRec -= intRecPerPage
End If
End Sub

Private Sub btnLast_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLast.Click
intRecPerPage = NumericUpDown1.Value
intTotalRec = taProduct.GetTotalRecord()
intStartRec = intTotalRec - intRecPerPage
GetData(intStartRec, intTotalRec)
SetRecordLabel()
End Sub

End Class


5. Setelah itu kita akan tambahkan sebuah fungsi untuk menghitung jumlah total record yang ada pada tabel tsb dengan memanfaatkan fitur baru yang terdapat didalam VB 2005 dan juga C# 2005 pada fitur OOP nya yaitu Partial Class.
Yang akan kita extend yaitu Class TableAdapter yang sudah digenerate di atas.

Code:

Namespace AdventureWorksDataSetTableAdapters
Partial Public Class GetProductPagingTableAdapter
Private intTotalRec As Integer

Public Function GetTotalRecord() As Integer
Using sqlCmd As New SqlCommand
Using sqlConn As New SqlConnection("Database=AdventureWorks;Server=.\SqlDev2k5;Integrated Security=SSPI")
sqlCmd.CommandType = CommandType.Text
sqlCmd.Connection = sqlConn
sqlCmd.CommandText = "Select Count(*) From Production.Product"
If sqlConn.State <> ConnectionState.Open Then sqlConn.Open()
intTotalRec = Convert.ToInt32(sqlCmd.ExecuteScalar)
Return intTotalRec
sqlConn.Close()
End Using
End Using
End Function
End Class
End Namespace

Hasilnya :



Download source code :

Code:

http://newbiebanget.fileave.com/PagingDenganTA.rar

Tidak ada komentar:

Posting Komentar

Daftar Blog Saya