Total COUNT/SUM(COUNT) beserta COUNT dalam satu tampilan Query MySQL untuk menghitung prosentase

Setelah sekian lama tidak update dikarenakan banyak hal, kali ini saya akan membagikan pengalaman mengenai penggunaan operasi COUNT dan TOTAL COUNT dalam satu tampilan query.Dari beberapa referensi yang saya dapatkan di internet, sangat sedikit yang melibatkan penjumlahan dari hasil COUNT untuk ditampilkan didalam tabel hasil Query, sebagai contoh untuk menghitung proporsi hasil COUNT per-item terhadap TOTAL COUNT. Masih bingung maksudnya?

Kasus yang saya gunakan adalah saya memiliki beberapa data nama sales yang menyetor ke beberapa toko dengan menyetor beberapa jenis buah. Saya ingin mengetahui berapa frekuensi dari masing masing sales dan proporsi masing-masing sales terhadap total sales. Ok langsung saja ini adalah tabel yang sudah saya buat

tabeltoko

Saya ingin membuat laporan dengan tampilan seperti ini

hasil

Untuk menampilkan dua kolom pertama, yaitu nama_sales dan frekuensi_sales kita bisa menggunakan perintah COUNT dan dibantu perintah GROUP

SELECT nama_sales, COUNT(nama_sales) AS frekuensi_sales
FROM namatabel
GROUP BY nama_sales

Untuk menampilkan kolom ketiga diperoleh dari frekuensi_sales dibagi total frekuensi sales. Artinya kita haruslah menjumlahkan/SUM hasil dari perintah COUNT dengan tetap mempertahankan grouping nama_sales. Blok querynya mirip yang pertama yaitu

SELECT nama_sales, COUNT(nama_sales), [query] AS Prosentase
FROM namatabel
GROUP BY nama_sales

Sekarang tinggal menyelesaikan blok [query]-nya. Kita akan menggunakan perintah untuk menghitung semua frekuensi, artinya tidak menggunakan SUM, tetapi kita melakukan pendekatan dengan menghitung total semua frekuensi. Query-nya adalah

SELECT COUNT(*) FROM namatabel

Query ini akan menghasilkan output 10

Langkah berikutnya untuk rumus menghitung prosentase adalah (frekuensi/total frekuensi)*100. Frekuensi per sales kita ambil dari

COUNT(nama_sales)

sehingga query-nya menjadi

(COUNT(nama_sales) / SELECT COUNT(*) FROM namatabel)*100

Apabila inging hasilnya dibulatkan tanpa angka dibelakang koma, kita bisa menggunakan ROUND( ) sehingga query-nya menjadi

ROUND((COUNT(nama_sales)/(SELECT COUNT(*) FROM toko))*100, 0)

kalo kita menginginkan ada 2 angka setelah koma tinggal diganti saja menjadi

ROUND((COUNT(nama_sales)/(SELECT COUNT(*) FROM toko))*100, 2)

Tahapan terakhir adalah menggabungkan Query terakhir kita dengan Query pertama dengan mengganti blok [query]-nya sehingga menjadi

SELECT nama_sales, COUNT(nama_sales) AS frekuensi_sales,
ROUND((COUNT(nama_sales)/(SELECT COUNT(*) FROM toko))*100,0) AS Prosentase
FROM namatabel
GROUP BY nama_sales

Demikian query yang bisa saya bagikan, anda bisa memodifikasi dengan kalkulasi perhitungan yang lain. Semoga bermanfaat.

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 🙂