Jquery datatables : dynamic data, custom column, add link icon, open in facebox from id – part 3

**** Part  -3 : Add custom column ****

Tahapan berikutnya adalah menampilkan kolom kosong. Kolom kosong disini dimaksudkan untuk meletakkan link berupa icon atau tulisan seperti untuk operasi CRUD ataupun link ke eksternal file. Rencananya kolom kosong ini diletakkan di kolom paling kanan setelah kolom email. Dari beberapa referensi di website perubahan ada yang melakukannya di file email_data.php ataupun di file email_datatable.php (mengenai dua file ini silahkan buka part-1 dan part-2). Namun apa yang saya lakukan disini adalah cara yang saya cobakan 100% bisa dan mudah.

1. OK sekarang kita memakai logikanya dulu. kalau kita ingin menambahkan 1 kolom kosong di sebelah kanan, maka yang pertama kali kita sesuaikan adalah jumlah kolom di file email_datatable.php. Silahkan cari baris berikut :

<table cellpadding=”0″ cellspacing=”0″ border=”0″ class=”display” id=”example”>
<thead>
<tr>
<th width=”20%”>id</th>
<th width=”20%”>Jenis</th>
<th width=”30%”>Nama</th>
<th width=”30%”>E-mail</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan=”4″ class=”dataTables_empty”>Loading data from server</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>id</th>
<th>Jenis</th>
<th>Nama</th>
<th>Email</th>
</tr>
</tfoot>
</table>

 

menjadi ………….

<table cellpadding=”0″ cellspacing=”0″ border=”0″ class=”display” id=”example”>
<thead>
<tr>
<th width=”20%”>id</th>
<th width=”20%”>Jenis</th>
<th width=”30%”>Nama</th>
<th width=”30%”>E-mail</th>
<th width=”30%”>Aksi</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan=”4″ class=”dataTables_empty”>Loading data from server</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>id</th>
<th>Jenis</th>
<th>Nama</th>
<th>Email</th>
<th>Aksi</th>
</tr>
</tfoot>
</table>

Tulisan yang berwarna hijau akan menambahkan satu kolom setelah kolom email.

2. Setelah kolom ditambahkan, kita memerintahkan jquery.datatables untuk mengenali kolom yang kita tambahkan. Silahkan cari baris berikut masih di file email_datatable.php

<script type=”text/javascript”>
$(document).ready(function() {
$(‘#example’).dataTable( {
“bProcessing”: true,
“bServerSide”: true,
“bJQueryUI”: true,
“sAjaxSource”: “email_data.php”,
“sPaginationType”: “full_numbers”,
 “aoColumns”: [
            null,
            null,
            null,
            null,
           {    "mData": null,
                "sClass": "center",
            }]
} );
} );
</script>

Tulisan berwarna hijau adalah script yang ditambahkan. Perintah ini adalah mendefinisikan masing-masing kolom dalam datatable. Kolom 1 s/d kolom 4 tidak ada pendefinisian khusus/seperti apaadanya sehingga diberi nilai null, sedangkan kolom 5 didefinisikan tidak ada data/kosong. Sehingga apabila berhasil, maka tampilannya akan seperti berikut ini (klik untuk memperbesar gambar).

19-04-2014 23-16-31

Bila sudah berhasil silahkan lanjut ke Part-4 tentang penambahan icon dan link di kolom yang kosong tadi.

Jquery datatables : dynamic data, custom column, add link icon, open in facebox from id – part 2

**** Part 2 : Call jquery datatables ****

Setelah berhasil memunculkan data array dari mysql, sebelum melanjutkan ke tahapan berikutnya, anda perlu mendownload

1. jquery.datatables. Versi sampai dengan tulisan ini ditulis adalah 1.9.4.

2. Latest jquery

3. Latest jquery-ui untuk tampilan interface-nya

OK setelah semua terdownload dan diasumsikan anda sudah tau lokasi penyimpanan dan cara pemanggilan data relatif terhadap root, kita perlu membuat file php untuk menampilkan data tbl_email kedalam format jquery.datatables. Misalnya kita membikin file dengan nama : email_datatable.php

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″ />
<title>Untitled Document</title>
<link href=”demo_table_jui.css” rel=”stylesheet” type=”text/css” />
<link href=”jquery-ui-1.10.4.css” rel=”stylesheet” type=”text/css” />
<script type=”text/javascript” src=”jquery-1.8.2.min.js”></script>
<script type=”text/javascript” src=”jquery-ui-1.10.4.min.js”></script>
<script type=”text/javascript” src=”jquery.dataTables.js”></script>
<script type=”text/javascript”>
$(document).ready(function() {
$(‘#example’).dataTable( {
“bProcessing”: true,
“bServerSide”: true,
“bJQueryUI”: true,
“sAjaxSource”: “email_data.php”,
“sPaginationType”: “full_numbers”,
} );
} );
</script>

</head>

<body>
<table cellpadding=”0″ cellspacing=”0″ border=”0″ class=”display” id=”example”>
<thead>
<tr>
<th width=”20%”>id</th>
<th width=”20%”>Jenis</th>
<th width=”30%”>Nama</th>
<th width=”30%”>E-mail</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan=”4″ class=”dataTables_empty”>Loading data from server</td>
</tr>
</tbody>
<tfoot>
<tr>
<th>id</th>
<th>Jenis</th>
<th>Nama</th>
<th>Email</th>
</tr>
</tfoot>
</table>
</body>
</html>

untuk lokasi file ini terhadap beberapa file css dan javascript tolong disesuaikan sendiri linknya :p. Bila semuanya lancar, seharusnya tampilannya akan seperti ini (klik untuk memperbesar)

19-04-2014 22-44-04

Jika sudah berhasil melakukan penampilan data seperti diatas, berarti anda sudah siap untuk lanjut ke Part-3

Jquery datatables : dynamic data, custom column, add link icon, open in facebox from id – part 1

**** Part 1 : Adding dynamic data ****

Beberapa hari ini lagi asik utak atik menggunakan jquery datatables (Mengenai jquery datatable silahkan mencari di mbah google). Sengaja judulnya aga aneh namun ini akan menggambarkan runtutan kebutuhan dari penggunaan jquery.datatables. Berbekal modal baca sana sini kemudian saya implementasikan kok berhasil, sehingga ada baiknya saya share disini, tetapi bukan berarti saya expert di bidang ini.

Skenarionya adalah saya ingin menampilkan data yang diambil dari database mysql menggunakan jquery.datatables. diujung kolom, ada kolom kosong yang akan saya isi untuk perintah berdasar id misalnya utuk operasi CRUD atau link ke eksternal data, atau saya bikin popup menggunakan facebox (silahkan googling aja apa facebox itu). Agak susah memang menemukan artikel yang terkait dengan hal ini apalagi yang mudah dipahami apalagi oleh saya yang masih awam ini. Sehingga nanti yang akan saya tampilkan sangatlah simple dan mudah dipahami (semoga hahaha).

1. OK tahapan yang pertama buat tabel di databasenya (saya tidak akan menjelaskan cara bikin tabel, kolom dalam tabel dll). Contohnya seperti ini : tbl_email

19-04-2014 22-07-53

2. Tahapan yang kedua adalah membuat file php berisi  array data dari tabel mysql. Contoh pemanggilan data dapat dilihat di situs resminya jquery.datatables. Kalau dikustomisasi sendiri berdasar tabel contoh menjadi sbb: (nama file email_data.php)


<!--?php
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Easy set variables
*/

/* Array of database columns which should be read and sent back to DataTables. Use a space where
* you want to insert a non-database field (for example a counter or static image)
*/
$aColumns = array( ‘emid’, ‘grup’, ‘nama’, ‘email’ );

/* Indexed column (used for fast and accurate table cardinality) */
$sIndexColumn = “emid”;

/* DB table to use */
$sTable = “tbl_email”;

/* Database connection information */
$gaSql['user'] = “nama_user”;
$gaSql['password'] = “nama_password”;
$gaSql['db'] = “nama_database”;
$gaSql['server'] = “localhost”;

/* REMOVE THIS LINE (it just includes my SQL connection user/pass)
include( $_SERVER['DOCUMENT_ROOT'].”/datatables/mysql.php” );*/

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* If you just want to use the basic configuration for DataTables with PHP server-side, there is
* no need to edit below this line
*/

/*
* Local functions
*/
function fatal_error ( $sErrorMessage = ” )
{
header( $_SERVER['SERVER_PROTOCOL'] .’ 500 Internal Server Error’ );
die( $sErrorMessage );
}

/*
* MySQL connection
*/
if ( ! $gaSql['link'] = mysql_pconnect( $gaSql['server'], $gaSql['user'], $gaSql['password'] ) )
{
fatal_error( ‘Could not open connection to server’ );
}

if ( ! mysql_select_db( $gaSql['db'], $gaSql['link'] ) )
{
fatal_error( ‘Could not select database ‘ );
}

/*
* Paging
*/
$sLimit = “”;
if ( isset( $_GET['iDisplayStart'] ) && $_GET['iDisplayLength'] != ‘-1′ )
{
$sLimit = “LIMIT “.intval( $_GET['iDisplayStart'] ).”, “.
intval( $_GET['iDisplayLength'] );
}

/*
* Ordering
*/
$sOrder = “”;
if ( isset( $_GET['iSortCol_0'] ) )
{
$sOrder = “ORDER BY “;
for ( $i=0 ; $i<intval( $_GET['iSortingCols'] ) ; $i++ )
{
if ( $_GET[ ‘bSortable_’.intval($_GET['iSortCol_'.$i]) ] == “true” )
{
$sOrder .= “`”.$aColumns[ intval( $_GET['iSortCol_'.$i] ) ].”` “.
($_GET['sSortDir_'.$i]===’asc’ ? ‘asc’ : ‘desc’) .”, “;
}
}

$sOrder = substr_replace( $sOrder, “”, -2 );
if ( $sOrder == “ORDER BY” )
{
$sOrder = “”;
}
}

/*
* Filtering
* NOTE this does not match the built-in DataTables filtering which does it
* word by word on any field. It’s possible to do here, but concerned about efficiency
* on very large tables, and MySQL’s regex functionality is very limited
*/
$sWhere = “”;
if ( isset($_GET['sSearch']) && $_GET['sSearch'] != “” )
{
$sWhere = “WHERE (“;
for ( $i=0 ; $i<count($aColumns) ; $i++ )
{
if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == “true” )
{
$sWhere .= “`”.$aColumns[$i].”` LIKE ‘%”.mysql_real_escape_string( $_GET['sSearch'] ).”%’ OR “;
}
}
$sWhere = substr_replace( $sWhere, “”, -3 );
$sWhere .= ‘)';
}

/* Individual column filtering */
for ( $i=0 ; $i<count($aColumns) ; $i++ ) { if ( isset($_GET['bSearchable_'.$i]) && $_GET['bSearchable_'.$i] == “true” && $_GET['sSearch_'.$i] != ” ) { if ( $sWhere == “” ) { $sWhere = “WHERE “; } else { $sWhere .= ” AND “; } $sWhere .= “`”.$aColumns[$i].”` LIKE ‘%”.mysql_real_escape_string($_GET['sSearch_'.$i]).”%’ “; } } /* * SQL queries * Get data to display */ $sQuery = ” SELECT SQL_CALC_FOUND_ROWS `”.str_replace(” , “, ” “, implode(“`, `”, $aColumns)).”` FROM $sTable $sWhere $sOrder $sLimit “; $rResult = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( ‘MySQL Error: ‘ . mysql_errno() ); /* Data set length after filtering */ $sQuery = ” SELECT FOUND_ROWS() “; $rResultFilterTotal = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( ‘MySQL Error: ‘ . mysql_errno() ); $aResultFilterTotal = mysql_fetch_array($rResultFilterTotal); $iFilteredTotal = $aResultFilterTotal[0]; /* Total data set length */ $sQuery = ” SELECT COUNT(`”.$sIndexColumn.”`) FROM $sTable “; $rResultTotal = mysql_query( $sQuery, $gaSql['link'] ) or fatal_error( ‘MySQL Error: ‘ . mysql_errno() ); $aResultTotal = mysql_fetch_array($rResultTotal); $iTotal = $aResultTotal[0]; /* * Output */ $output = array( “sEcho” => intval($_GET['sEcho']),
“iTotalRecords” => $iTotal,
“iTotalDisplayRecords” => $iFilteredTotal,
“aaData” => array()
);

while ( $aRow = mysql_fetch_array( $rResult ) )
{
$row = array();
for ( $i=0 ; $i<count($aColumns) ; $i++ ) { if ( $aColumns[$i] == “version” ) { /* Special output formatting for ‘version’ column */ $row[] = ($aRow[ $aColumns[$i] ]==”0″) ? ‘-‘ : $aRow[ $aColumns[$i] ]; } else if ( $aColumns[$i] != ‘ ‘ ) { /* General output */ $row[] = $aRow[ $aColumns[$i] ]; } } $output['aaData'][] = $row; } echo json_encode( $output ); ?>

Perhatikan sesuaikan dengan informasi server anda pada script yang berwarna hijau. Kemudian coba jalankan file email_data.php di browser. Seharusnya  akan muncul tampilan array data seperti dibawah ini (klik gambar untuk memperbesar)

19-04-2014 22-24-13

Jika berhasil, berarti tahapan 1 sudah berhasil anda lewati. Silahkan melanjutkan ke Part – 2

JOIN multiple table dengan operasi SUM beberapa kolom didalamnya – 2

Berawal dari tulisan saya yang berjudul “JOIN multiple table dengan operasi SUM beberapa kolom didalamnya”, ada pembaca yang menanyakan suatu kasus dengan prinsip yang hampir sama. Kasusnya adalah ingin membuat rekap data karyawan berupa total absensi shift, total lembur, total sakit, total cuti, total ijin. Ilustrasinya laporannya adalah sbb :

nama karyawan | total absen | total lembur | total sakit | total cuti | total ijin |
——————–|—————|—————-|————–|————|————|
karyawan A
karyawan B
dst

Ok sekarang akan saya kupas satu persatu apa yang akan diperlukan untuk membuat laporan tersebut. Harus diingat bahwa tidak setiap karyawan akan terisi semua rekapnya. Misal karyawan A mungkin dalam periode tertentu belum pernah cuti, artinya akan ada data kosong didalam rekapnya. Dengan melihat pola tersebut maka kolom yang cocok untuk dijadikan kunci-nya adalah kolom nama karyawan dan yang bisa menyelesaikan permasalahan tersebut dengan operasi LEFT JOIN dengan tabel nama karyawan sebagai tabel left yang akan dijoinkan dengan tabel yang lain yaitu tabel absen, tabel lembur, tabel sakit, tabel cuti dan tabel ijin. Itu artinya saya akan melakukan LEFT JOIN terhadap total 6 tabel!!! Fiuuhhh…….(untuk dasar-dasar penggunaan LEFT JOIN silahkan lihat tulisan saya yang pertama)

Ok kita mulai….

1. Tabel karyawan : tbl_karyawan

19-04-2014 21-18-16

2. Table lembur : tbl_absen_lembur

19-04-2014 21-21-40

3. Tabel absensi : tbl_absen_shift

19-04-2014 21-23-33

4. Tabel cuti : tbl_cuti

19-04-2014 21-24-38

5. Tabel sakit : tbl_sakit

19-04-2014 21-25-41

6. Tabel ijin : tbl_ijin

19-04-2014 21-26-49

Ok 6 tabel sudah dibuat, kemudian diisi dengan data. Dan tibalah kita pada pembuatan rekap laporan. Rencananya rekap ini bisa dipanggil berdasar periode tertentu. Perintah SQL-nya adalah sbb :

SELECT tbl_karyawan.id_karyawan, tbl_karyawan.nama_karyawan,
SUM(DATEDIFF(tbl_sakit.tgl_selesai,tbl_sakit.tgl_mulaisakit)) AS total_sakit, total_ijin, total_cuti,
total_absen, total_lembur
FROM tbl_karyawan
LEFT JOIN tbl_sakit ON tbl_karyawan.id_karyawan=tbl_sakit.id_karyawan
AND month(tbl_sakit.tgl_mulaisakit)='01' AND year(tbl_sakit.tgl_mulaisakit)='2014'


LEFT JOIN
(SELECT tbl_karyawan.id_karyawan,
SUM(DATEDIFF(tbl_ijin.tgl_selesai,tbl_ijin.tgl_mulaiijin)) AS total_ijin
FROM tbl_karyawan, tbl_ijin
WHERE tbl_karyawan.id_karyawan=tbl_ijin.id_karyawan
GROUP BY tbl_ijin.id_karyawan) AS ijin
ON tbl_karyawan.id_karyawan=ijin.id_karyawan

LEFT JOIN
(SELECT tbl_karyawan.id_karyawan,
SUM(DATEDIFF(tbl_cuti.tgl_selesai,tbl_cuti.tgl_mulaicuti)) AS total_cuti
FROM tbl_karyawan, tbl_cuti
WHERE tbl_karyawan.id_karyawan=tbl_cuti.id_karyawan
GROUP BY tbl_cuti.id_karyawan) AS cuti
ON tbl_karyawan.id_karyawan=cuti.id_karyawan

LEFT JOIN
(SELECT tbl_karyawan.id_karyawan,
SUM(HOUR(TIMEDIFF(tbl_absen_shift.waktu_selesai,tbl_absen_shift.waktu_mulaishift))) AS total_absen
FROM tbl_karyawan, tbl_absen_shift
WHERE tbl_karyawan.id_karyawan=tbl_absen_shift.id_karyawan
AND month(tbl_absen_shift.tgl_shift)='01' AND year(tbl_absen_shift.tgl_shift)='2014'
GROUP BY tbl_absen_shift.id_karyawan) AS absen
ON tbl_karyawan.id_karyawan=absen.id_karyawan


LEFT JOIN
(SELECT tbl_karyawan.id_karyawan,
SUM(HOUR(TIMEDIFF(tbl_absen_lembur.waktu_selesai,tbl_absen_lembur.waktu_mulailembur))) AS total_lembur
FROM tbl_karyawan, tbl_absen_lembur
WHERE tbl_karyawan.id_karyawan=tbl_absen_lembur.id_karyawan
AND month(tbl_absen_lembur.tgl)='01' AND year(tbl_absen_lembur.tgl)='2014'
GROUP BY tbl_absen_lembur.id_karyawan) AS lembur
ON tbl_karyawan.id_karyawan=lembur.id_karyawan

GROUP BY tbl_karyawan.id_karyawan ASC

Perhatikan saya menggunakan DATEDIFF untuk mencari rentang tanggal dan TIMEDIFF untuk mencari rentang waktu. Perhatikan pula huruf yang dicetak warna biru merupakan kunci dari setiap operasi join dengan rootnya.Yang dicetak warna hijau adalah nama kolom yang akan dimunculkan dan kaitannya dengan query join didalamnya. Sedangkan untuk huruf yang berwarna merah dapat anda ganti dengan pemanggilan dari PHP untuk report periodenya dengan metode $_GET['var'].

Apabila SQL diatas dieksekusi, maka data yang bisa saya dapatkan seperti dibawah ini

19-04-2014 21-31-33

Sebelum saya akhiri tulisan ini, untuk penggunaan hour(TIMEDIFF()) hanya akan menampilkan angka jam dengan pembulatan. Namun apabila kita ingin memodifikasi misalnya lama lembur adalah 2 jam 30 menit dengan format 2:30, maka perlu sedikit kita modifikasi. Logikanya jam kita ubah ke detik dicari totalnya dan dikembalikan ke jam. OK langsung saja untuk lebih jelasnya

SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF( waktu_selesai, waktu_mulailembur)))), "%h:%i")
FROM tbl_absen_lembur
WHERE month(waktu_mulailembur)='01'

’01’ adalah untuk bulan januari. Sesuaikan dengan kebutuhan, bisa dengan metode $_GET['var'] atau $_POST['var']

OK saya rasa sekian dulu tulisan saya ini. Mudah-mudahan bermanfaat.

Memperbaiki file video yang rusak

Berawal dari kecerobohan saya mengutak utik handycam teman saya sehingga secara tidak sengaja saya menghapus semua file movie dalam handycam tersebut. Kebetulan media penyimpanan berjenis SD Card sehingga langsung saya amankan SD Card tersebut dan saya coba untuk mengembalikan file yang terhapus tadi.

Beberapa software saya cobakan untuk mengembalikan  file tersebut, akhirnya pilihan saya jatuh pada Wondershare Data Recovery.

ws

Bukan promosi, karena beberapa software yang lain gagal dalam mengembalikan file yang terhapus, pada software ini ada fasilitas untuk merecover dengan mode raw data recovery. Dengan mode ini file movie sukses terdeteksi dan kemudian saya selamatkan.

Namun demikian muncul permasalahan baru yaitu file movie (kebetulan formatnya avi) tidak dapat dijalankan dengan player apapun seperti VLC, Med Player Classic bawaan Codec Pack dsb, padahal besarnya file terbaca normal. Dari beberapa pesan error saya simpulkan bahwa file movie tersebut tidak jelas mana awal dan akhirnya.

Kemudian saya googling, ada beberapa saran dan dari hasil rekomendasi untuk memperbaiki file avi yang rusak menggunakan software DivFix++. Setelah saya download (kebetulan free) saya uji cobakan. Namun hasilnya sama saja!! Software tersebut tidak bisa mengenali mana awal sama akhir file hasil recover tsb.

Pemecahan permasalahan muncul secara tidak sengaja, manakala saya berfikir bagaimana kalo format avi coba saya ubah ke format yang lain dulu. Kebetulan yang saya punya di kompie adalah HD Video Converter Factory.

hd

Saya setting dulu output filenya, ternyata proses convert berjalan lancar. Dan saya putar di beberapa jenis player sukses dan lancar.

Sekian sharing saya  :)

Integrasi dreamweaver dan mysql untuk membuat grafik menggunakan amchart

Bukan promosi amchart lhooo….tapi ini semata-mata hanya karena saya biasa menggunakan dan mudah dimodifikasi menggunakan dreamweaver. Saya asumsikan pembaca sudah familier menggunakan dreamweaver, maksudnya tau cara create site, create recordset dsb.

Ok langsung saja buat page di dreamweaver, dan kita create recordset, dalam kasus ini recordset kita beri nama statkunjungan_rec. Sedangkan amchart dalam kasus ini saya gunakan versi 1.5. Chart yang saya pilih adalah tipe amline untuk menampilkan grafik jumlah kunjungan per-tanggal kedatangan. Contoh perintah dari situs amchart untuk memanggil chart line adalah sbb

  <script type="text/javascript" src="../amline/swfobject.js"></script>
	<div id="flashcontent1">
		<strong>You need to upgrade your Flash Player</strong>
	</div>

	<script type="text/javascript">
		// <![CDATA[		
		var so = new SWFObject("../amline/amline.swf", "amline1", "260", "200", "8", "#FFFFFF");
		so.addVariable("path", "../amline/");
		so.addVariable("settings_file", escape("amline/amline4/amline_settings1.xml"));
		so.addVariable("data_file", escape("amline/amline4/amline_data1.txt"));
//	so.addVariable("chart_data", "");
		so.addVariable("preloader_color", "#000000");
		so.write("flashcontent1");
		// ]]>
	</script>

pada listing script diatas, data yang dipanggil dalam bentuk amline_data1.txt. Setelah dicek ternyata isinya berupa looping data yang dipisahkan tanda titik koma untuk memisahkan antara axis dan ordinat chartnya. Sehingga apabila kita ingin integrasikan dengan recordset bawaan dreamweaver perlu ada sedikit modifikasi. Tahapannya adalah sbb :

1. Ubah dengan benar alamat link lokasi setting, misalnya link ke swfobject.swf, amline_settings1.xml dsb
2. Nonaktifkan pemanggilan “data_file” dengan memberi tanda komentar (//) di sebelah kiri
3. Aktifkan “chart_data” dengan menghilangkan tanda komentar di sebelah kiri
4. Panggil perulangan data dari recordset dreamweaver dengan do….while….. sbb:

<?php do {
echo date(‘d-m-Y’, strtotime($row_statkunjungan_rec['tgl'])); ?>;<?php echo $row_statkunjungan_rec['jml_kunjungan'].’\n';
} while ($row_statkunjungan_rec = mysql_fetch_assoc($statkunjungan_rec)); ?>

Perintah ini akan menghasilkan looping data tgl;jml_kunjungan dan perbaris dipisahkan dengan ‘\n

Sehingga listing lengkapnya adalah sbb :

<script type="text/javascript" src="path_to_file/swfobject.js"></script>
<!-- this id must be unique! -->
<div id="flashcontent_cari" style="position:relative">
</div>

<script type=”text/javascript”>
// <![CDATA[
var so = new SWFObject(“path_to_file/amline.swf”, “amline1″, “650”, “300”, “8”, “#FFFFFF”);
so.addVariable(“path”, “path_to_file/amline/”);
so.addVariable(“settings_file”, encodeURIComponent(“path_to_file/amline_kunjungan.xml”));
//so.addVariable(“data_file”, encodeURIComponent(“amline_data1.txt”));
so.addVariable(“chart_data”,”<?php do {
        echo date(‘d-m-Y’, strtotime($row_statkunjungan_rec['tgl'])); ?>;<?php echo $row_statkunjungan_rec['jml_kunjungan'].’\n';
        } while ($row_statkunjungan_rec = mysql_fetch_assoc($statkunjungan_rec)); ?>”);
so.write(“flashcontent_cari”);  // this id must match the div id above
// ]]>
</script>

Mudah-mudahan membantu :)

Menampilkan semua tanggal pada hasil query mysql

Sebelumnya saya bingung mau memberi judul apa yang pas untuk tulisan saya berikut ini. Penjelasan kasusnya misalnya kita ingin membuat statistik kunjungan sebuah puskesmas. Puskesmas biasanya hanya buka pada jam kerja dari Senin sampai Jum’at belum termasuk libur Nasional. Artinya tidak setiap hari data kunjungan pasien ada. Ilustrasinya tabel kunjungan adalah sebagai berikut

id : integer, tgl_periksa : datetime

Kasusnya, kita ingin menampilkan semua tanggal yang tidak tercantum didalam kolom tgl_periksa dan menjumlah berapa pasien yang berkunjung dalam hari tersebut,contohnya pada tanggal 30-03-2012 seharusnya berjumlah 2 kunjungan, dan pada tanggal 27-03-2012 seharusnya baris tersebut muncul (walau tidak ada input data pada tanggal tersebut) dengan jml kunjungan 0.

Setelah ber-googling ria beberapa solusi didapatkan. Diantaranya ada yang membuat stored procedure untuk membuat tabel baru berisikan data tanggal antara tahun yang telah ditentukan. Namun bagi saya hal ini aga menyusahkan, yang pertama saya kurang memahami stored procedure dan yang kedua tabel yag dibuat tadi mempunyai rentang. Apabila rentang habis harus dibuat manual atau kalau rentangnya terlalu besar akan membebani tabel (CMIIW).

Solusi yang saya rasa cocok untuk kasus ini saya dapatkan dari stackoverflow.com dengan title masalah : “wanted to get all dates in mysql result”. Ini yang akan saya kupas di topik ini.

Hasil output query yang kita inginkan adalah seperti ini
result

Seperti hasil yang dilihat, maka pada tanggal tidak ada kunjungan akan otomatis di generate dengan jml = 0. Querynya adalah sbb :

SELECT tgl, COUNT(psid) AS jmlpasien FROM ( SELECT adddate((select min(date(tgl_periksa)) from tb_periksa), row-1) as tgl FROM ( SELECT @row := @row + 1 as row FROM (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t, (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, (SELECT @row:=0) r ) n WHERE n.row <= (select datediff(max(date(tgl_periksa)), min(date(tgl_periksa))) from tb_periksa) + 1 ) dr LEFT JOIN tb_periksa u ON dr.tgl = date(u.tgl_periksa) GROUP BY dr.tgl

Untuk penjelasan querynya bisa anda rujuk dari sumbernya di stackoverflow.com. Kemudian pertanyaanya bagaimana bila kita hanya ingin menampilkan data bulan atau tahun tertentu saja. Maka kita perlu sedikit melakukan modifikasi pada querynya. Misal kita hanya ingin menampilkan data pada bulan Maret 2012, maka querynya kita modifikasi sbb :

SELECT tgl, COUNT(psid) AS jmlpasien
FROM ( SELECT adddate((select min(date(tgl_periksa)) from tb_periksa WHERE month(tgl_periksa)=3 AND year(tgl_periksa)=2012), row-1) as tgl
FROM ( SELECT @row := @row + 1 as row
FROM (select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2, (SELECT @row:=0) r ) n
WHERE n.row <= (select datediff(max(date(tgl_periksa)), min(date(tgl_periksa)))
from tb_periksa WHERE month(tgl_periksa)=3 AND year(tgl_periksa)=2012) + 1 ) dr LEFT JOIN tb_periksa u ON dr.tgl = date(u.tgl_periksa)
GROUP BY dr.tgl

Hasilnya adalah sebagai berikut

result2

Anda juga bisa bereksperimen dengan elemen GET untuk perintah mamanggil data dari form, atau memakai operasi BETWEEN untuk memanggil rentang data pada perintah SQL.

Selamat mencoba :)