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 🙂