Senin, 03 Desember 2012

Codeigniter - SQL Server : Pagination

Codeigniter Paginasi (pagination) untuk SQL Server .

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 table
pada query, jangan menggunakan
SELECT * FROM table
terus 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

12 komentar:

  1. viewnya kgk sekalian aja bang, bagi yangb kurang ngerti kayaknya artikelnya tanggung mw share ilmu gitu bang :(

    BalasHapus
    Balasan
    1. thanks atas sarannya, boleh juga untuk d tambahin... :)

      Hapus
  2. mas, kl boleh minta contoh model controller view yg simpel untuk sql server y. :)

    BalasHapus
    Balasan
    1. wah maaf baru bls....

      hm... 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...

      Hapus
  3. mau tanya dong, gimana cara menampilkan mengganti sintak select * menjadi select (variabel/$)?
    jadi 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?

    BalasHapus
    Balasan
    1. Bisa seperti ini

      return $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();

      Hapus
  4. mau nanya kang. saaya baru belajar CI jg pake sql server. kalo mau pake stored procedure bisa ga kira2? makasih kang tutorialnya sangat bermanfaat :)

    BalasHapus
  5. mau nanya kang. kalo pake store procedure bisa ga ya saya pake CI dan Sql server 2008?
    tutorialnya sangat bermanfaat terimakasih :)

    BalasHapus
    Balasan
    1. bisa.... bikin strore procedure, contoh
      CREATE 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));

      Hapus
  6. gan mau nanya kalo pagingnya di uri segment 4 bagaimana yaa ?? mohon bantuan nya thx

    BalasHapus
    Balasan
    1. ya ganti aja dari nilai 3 ke 4 untuk parameter ke-3 pada fungsi data_pagination di modelnya...

      Hapus
  7. mas saya gagal utk membuka halaman selanjutnya
    urlnya seperti localhost:8080/dashboard/claimrs/2
    pesan error not found, bagaimana supaya bisa muncul datanya utk halaman selanjutnya

    BalasHapus