Pada kali ini saya mau sharing mengenai salah satu cara paginasi (Pagination) pada SQL Server. Salah satunya dengan menggunakan Common Table Expression (CTE) yang disediakan SQL Server.
Berbeda dengan query "Select TOP n * FROM table" yang hanya menampilkan data sebanyak n baris mulai dari baris pertama sampai baris n pada hasil query. CTE bisa dipakai mirip fungsi "limit" pada database MYSQL.
Langsung saja, untuk MODEL
function getAllData($no_page){ $perpage = 20; // nilai $perpage disini sama dengan di $config['per_page'] if($no_page == 1){ $first = 1; $last = $perpage; }else{ $first = ($no_page - 1) * $perpage + 1; $last = $first + ($perpage -1); } return $this->db->query("WITH CTE AS ( SELECT a.*, ROW_NUMBER() OVER (ORDER BY a.id_tabel desc) as RowNumber FROM tabel_data a ) SELECT * FROM CTE WHERE RowNumber BETWEEN $first AND $last")->result_array(); } function data_pagination($url, $rows = 10, $uri = 3){ $this->load->library('pagination'); $config['per_page'] = 20; $config['base_url'] = site_url($url); $config['total_rows'] = $rows; $config['use_page_numbers'] = TRUE; $config['uri_segment'] = $uri; $config['num_links'] = 3; $config['next_link'] = 'Next'; $config['prev_link'] = 'Previous'; // untuk config class pagination yg lainnya optional (suka2 lu.. :D ) $this->pagination->initialize($config); return $this->pagination->create_links(); } function getTotalRowAllData(){ $query = $this->db->query("SELECT count(*) as row FROM tabel_data")->row_array(); return $query['row']; }
Tips : jika hanya untuk mendapatkan informasi jumlah baris data, lebih baik gunakan
SELECT COUNT (*) FROM tablepada query, jangan menggunakan
SELECT * FROM tableterus pakai
$query->num_rows()pada sintaks PHP. Hal ini cukup boros dalam pemrosesan data. Jadi sayangkan, kalau hanya ingin tau jumlah suatu data, harus diambil semua datanya dari database baru dihitung baris satu persatu pada proses PHP nya. XD
Selanjutnya untuk CONTROLLER nya
function show_alldata($no_page = 1){ $data['page'] = $this->model->data_pagination("data/show_alldata", $this->model->getTotalRowAllData(), 3); $data['data'] = $this->model->getAllData($no_page); $data['no_page'] = $no_page; $this->load->view('template', $data); }
untuk VIEW nya bisa ditampilkan secara suka-suka lu, yang penting untuk menampilkan data-nya ada di variabel $data dan untuk menampilkan halaman paginasi bisa di variabel $page.
<div class="info">Menampilkan halaman <?php echo $no_page; ?> </div> <table> <tr> <th>Data 1</th> <th>Data 2</th> <th>Data 3</th> </tr> <?php foreach($data as $row){ echo '<tr><td>'.$row['data 1'].'</td><td>'.$row['data 1'].'</td><td>'.$row['data 1'].'</td></tr>'; } ?> </table> <div class="pagination"><?php echo $page; ?></div>
Cukup sekian tips nya... :D
Alhamdulillah bisa berbagi tips lagi... :D
Keyword : SQL Server pagination , SQL Server paginasi, Codeigniter SQL Server paginasi
Untuk menghargai HKI(Hak Kekayaan Intelektual), sumber referensi yang saya pakai dan saya pelajari akan ditampilkan.
Referensi : msdn.microsoft.com, sqlserverplanet.com
Author : Moch. Zawaruddin Abdullah, www.zawaruddin.blogspot.com
viewnya kgk sekalian aja bang, bagi yangb kurang ngerti kayaknya artikelnya tanggung mw share ilmu gitu bang :(
BalasHapusthanks atas sarannya, boleh juga untuk d tambahin... :)
Hapusmas, kl boleh minta contoh model controller view yg simpel untuk sql server y. :)
BalasHapuswah maaf baru bls....
Hapushm... klo menurutku itu dah simpel gan, sql servernya pake CTE buat ambil beberapa data, cos sql server tidak mengenal perintah limit seperti yg ada d mysql...
mau tanya dong, gimana cara menampilkan mengganti sintak select * menjadi select (variabel/$)?
BalasHapusjadi saya mau menampilkan sesuai dengan variabel misal
$batas=5;
select $batas from tabel bla bla bla.. kenapa ga bisa ya? coba pake declare juga ga bisa.. bisa share ilmunya?
Bisa seperti ini
Hapusreturn $this->db->query("WITH CTE AS (
SELECT a.atr1, a.atr2, a.atr3
ROW_NUMBER() OVER (ORDER BY a.id_tabel desc) as RowNumber
FROM tabel_data a
WHERE a.batas = ?
)
SELECT * FROM CTE WHERE RowNumber BETWEEN $first AND $last", array($batas))->result_array();
mau nanya kang. saaya baru belajar CI jg pake sql server. kalo mau pake stored procedure bisa ga kira2? makasih kang tutorialnya sangat bermanfaat :)
BalasHapusmau nanya kang. kalo pake store procedure bisa ga ya saya pake CI dan Sql server 2008?
BalasHapustutorialnya sangat bermanfaat terimakasih :)
bisa.... bikin strore procedure, contoh
HapusCREATE PROCEDURE dbo.ANG_Web_Login
@userid VARCHAR(20),
@pass VARCHAR(32)
AS.....
trus cara panggilnya d CI bisa gini
$this->db->query('dbo.ANG_Web_Login ?, ?', array($username, $password));
gan mau nanya kalo pagingnya di uri segment 4 bagaimana yaa ?? mohon bantuan nya thx
BalasHapusya ganti aja dari nilai 3 ke 4 untuk parameter ke-3 pada fungsi data_pagination di modelnya...
Hapusmas saya gagal utk membuka halaman selanjutnya
BalasHapusurlnya seperti localhost:8080/dashboard/claimrs/2
pesan error not found, bagaimana supaya bisa muncul datanya utk halaman selanjutnya
assalamualaikum mas zawaruddin, saya baru nyoba koneksi ci dengan sql server 2000. saya mencoba menampilka data sederhana akan tetapi muncul error ( [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid object name 'satu'.) satu adalah nama tabelnya.. error seperti ini solusinya seperti apa mas. terima kasih
BalasHapus