Learn the Rules, Break The Rules, and Create the New Ones...

Hi... My name is Rizky Prihanto. You can call me RQ, or Rizky either. I am currently living on Bandung, Indonesia. Had a lot of works and research about Enterprise Information Systems (majoring on education and e-governments). I have bunch of interests (some friends call it 'freakz') about MySQL Opensource Database and now I am one of the administrator of MySQL Indonesia User Group - the opensource community initialized by Sun Microsystems Indonesia.

My Company PT Cinox Media Insani, Bandung, Indonesia. I work here since 2008 and I take responsibility as Chief of Software Architect. My job is about planning, imaginating, fantasy-ing, concepting, and build the infrastructure of the new information systems (or app engines) which going to be implemented.

This blog This is my blog that represent my current opinion, research and experiences about anything in Software Engineering. Written since 2007 (actually) and has been vaccum for a lot of while. And now I wanna ressurrect this blog (optimistically) from the long-long-hibernation with something fresh and new ideas -- still about MySQL, software engineering, development, and may be something managerial here.

About the tagline I've learned the statement above from some paper written by Kent Beck about Extreme Programming (XP) methodology -- some sort of practical software development methods which have no boundaries. That's very inspiring me a lot. I have written some article on this blog that tell my interpretation about that statement here.

My Another Blogs I have classifying my blogs into some sort of genre. The blog that you read here right now is my primary blog that tell you (majoring) about IT stuff. But if you wanna look another side of me, you can visit here, here, here,or here. Hope it'll be interesting for some of you.

Credits I would thanks to Blogger for this great blog platform. Skinpress who designed this Wordpress template (which is bloggerized by Free Blogger Templates). My appreciate is also going to you who give your generously time for visiting my blog.

10
Stored Function Terbilang di MySQL

Lagi iseng mode = on.

Karena bete gara2 ga bs nge-YouTube, barusan aku bikin stored function di MySQL yang akan mengconvert bilangan ke dalam 'terbilang' (entah siapa yg memulai mengistilahkan ini dengan nama 'terbilang' -- mgkn terinispirasi dari tulisan di kuitansi-kuitansi itu kali ye?). Dengan stored function utk mekanisme pembuat 'terbilang' ini, keuntungan2nya :

1. bisa di embedd di query kita tanpa perlu memprocessing ulang di front-end (sisi aplikasi).
2. ...sebenarnya cuman itu aja sih.., kan klo proses pengconvertan dilakukan di sisi
engine MySQL nya, artinya :

  • client ngga perlu sok-sok-an ngitung. klo develop di web sih ngga masalah, tp klo u bikin desktop,kan komputasi nya di sisi client. *walo ngga ngefek jg sih hare gene mana ada client yg mau makae kompie "bosok" berdaya komputasi rendah.
  • dengan di-embedd nya ke dalam query, manfaat nya, *tentu* mempermudah pengambilan data. mempermudah display ke grid, ato mungkin ke crystal report (seperti ulasan mas madhi dalam blog nya dulu). pokoke, mudah lah..

begini function nya : (silakan co-pas dan execute di konsole-konsole MySQL kesayangan anda)


CREATE DEFINER=`root`@`localhost` FUNCTION `xf_terbilang`(angka bigint) RETURNS varchar(5000) CHARSET utf8
BEGIN
DECLARE sString varchar(30);
DECLARE Bil1 varchar(255);
DECLARE Bil2 varchar(255);
DECLARE STot varchar(255);
DECLARE X int;
DECLARE Y int;
DECLARE Z int;
DECLARE Urai varchar(5000);
SET sString = CAST(angka as char);
SET Urai = '';
SET X = 0;
SET Y = 0;
WHILE X <>
SET X = X + 1;
SET sTot = MID(sString, X, 1);
SET Y = Y + CAST(sTot as UNSIGNED);
SET Z = LENGTH(sString) - X + 1;
CASE CAST(sTot as UNSIGNED)
WHEN 1 THEN
BEGIN
IF (Z = 1 OR Z = 7 OR Z = 10 OR Z = 13) THEN
SET Bil1 = 'SATU ';
ELSEIF (z = 4) THEN
IF (x = 1) THEN
SET Bil1 = 'SE';
ELSE
SET Bil1 = 'SATU';
END IF;
ELSEIF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN
SET X = X + 1;
SET sTot = MID(sString, X, 1);
SET Z = LENGTH(sString) - X + 1;
SET Bil2 = '';
CASE CAST(sTot AS UNSIGNED)
WHEN 0 THEN SET Bil1 = 'SEPULUH ';
WHEN 1 THEN SET Bil1 = 'SEBELAS ';
WHEN 2 THEN SET Bil1 = 'DUA BELAS ';
WHEN 3 THEN SET Bil1 = 'TIGA BELAS ';
WHEN 4 THEN SET Bil1 = 'EMPAT BELAS ';
WHEN 5 THEN SET Bil1 = 'LIMA BELAS ';
WHEN 6 THEN SET Bil1 = 'ENAM BELAS ';
WHEN 7 THEN SET Bil1 = 'TUJUH BELAS ';
WHEN 8 THEN SET Bil1 = 'DELAPAN BELAS ';
WHEN 9 THEN SET Bil1 = 'SEMBILAN BELAS ';
ELSE BEGIN END;
END CASE;
ELSE
SET Bil1 = 'SE';
END IF;
END;
WHEN 2 THEN SET Bil1 = 'DUA ';
WHEN 3 THEN SET Bil1 = 'TIGA ';
WHEN 4 THEN SET Bil1 = 'EMPAT ';
WHEN 5 THEN SET Bil1 = 'LIMA ';
WHEN 6 THEN SET Bil1 = 'ENAM ';
WHEN 7 THEN SET Bil1 = 'TUJUH ';
WHEN 8 THEN SET Bil1 = 'DELAPAN ';
WHEN 9 THEN SET Bil1 = 'SEMBILAN ';
ELSE SET Bil1 = '';
END CASE;
IF CAST(sTot as UNSIGNED) > 0 THEN
IF (Z = 2 OR Z = 5 OR Z = 8 OR Z = 11 OR Z = 14) THEN
SET Bil2 = 'PULUH ';
ELSEIF (Z = 3 OR Z = 6 OR Z = 9 OR Z = 12 OR Z = 15) THEN
SET Bil2 = 'RATUS ';
ELSE
SET Bil2 = '';
END IF;
ELSE
SET Bil2 = '';
END IF;
IF Y > 0 THEN
CASE Z
WHEN 4 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'RIBU '); SET Y = 0; END;
WHEN 7 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'JUTA '); SET Y = 0; END;
WHEN 10 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'MILYAR '); SET Y = 0; END;
WHEN 13 THEN BEGIN SET Bil2 = CONCAT(Bil2, 'TRILYUN '); SET Y = 0; END;
ELSE BEGIN END;
END CASE;
END IF;
SET Urai = CONCAT(Urai, Bil1, Bil2);
END WHILE;
RETURN Urai;
END;


nah cara pemanggilannya, coba gini :

mysql> select xf_terbilang(512250300) as urai;
+-----------------------------------------------------------------+
| Urai |
+-----------------------------------------------------------------+
| LIMA RATUS DUA BELAS JUTA DUA RATUS LIMA PULUH RIBU TIGA RATUS |
+-----------------------------------------------------------------+
1 row in set

Query OK, 0 rows affected

Asyeek...
sukses!

eh bentar dulu...

setelah nyoba2, ternyata ada "limitasi" nya nie function. *mencoba berfikir obyektif nih. ndak selamanya kita musti narcis* hihihi...

ternyata : ini maksimal nilai yang VALID utk di-convert.

mysql> select xf_terbilang(999999999999999);
SEMBILAN RATUS SEMBILAN PULUH SEMBILAN TRILYUN blablablabla.

kalo kita execute

mysql> select xf_terbilang(999999999999999+1);

yang muncul malah :

+---------------------------------+
| xf_terbilang(999999999999999+1) |
+---------------------------------+
| SETRILYUN |
+---------------------------------+

dan utk angka2 di atas itu, yang muncul tetep sama : SETRILYUN.

hiks..

tp biarlah...
males ngobok2 lebih lanjut. *ntar lah klo ada case yang emang memerlukan "LEBIH" dari limitasi ini.

lagian siapa sih yang mo beli barang dengan nota tertulis di kuitansi sebesar 999 Trilyun?
hihihi.. Pemerintah mungkin. Wong 11 Trilyun aja tanpa pikir panjang berani 'dibuang' percuma utk nge-blokir akses situs-situs yang dianggap subversif.. Ups.., maap. Ini cuman intermezzo. Suer, saya bukan hacker. Belum. Dan saya ngga ada niat nge-post barang2 saru/porno di blog saya ini. *kecuali klo paragraf di atas sama pihak yang berwenang dianggap porno, yaa, meneketehe...

Utk solusi function terbilang di SQL Server 2000, mas Madhi pernah mempostingnya di sini. Silakan meluncur ke sana jika membutuhkan. Algoritma nya rada beda dengan punya saya, dan saya nggak mau mbandingin mana yang bagus mana yang jelek. Itu sama dengan perdebatan tiada ujung mengenai MS SQL Server vs MySQL. Ato blogger vs hacker (??) hehehe...

dan skrg. narcis mode = on.

Emang, abang eRQee emang CAKEP !!!

5
Menghitung Waktu Sholat

rencananya sih, *awalnya* mo usulin fitur jadwal sholat online utk di-embedd di aplikasi
*aslinya* sih mo cari RSS Feed google gadget yg udah nyedia-in itu jadi pengennya sih tinggal ambil doank...
*eh ketemunya* dokumen ttg algoritma waktu sholat (donlot di sini)
*penasaran mode = on*
*iseng mode = on*
*suntuk mode = on* - habis debat ama "mamanya anak2" (hiks...)

rancang2 tabel dulu :
+----+------+----------+-----------+----------+------------+
| ID | kota | Latitude | Longitude | timezone | ketinggian |
+----+------+----------+-----------+----------+------------+

DDL nya :

CREATE TABLE `tbl_city_coordinate` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`kota` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`latitude` float NOT NULL,
`longitude` float NOT NULL,
`timezone` float NOT NULL,
`ketinggian` float NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

*googling tentang koordinat astronomis kota jakarta*
*isi-isi data dulu*

INSERT INTO `tbl_city_coordinate` VALUES ('1', 'JAKARTA', '-6.21522', '106.818', '7', '100');


trus bikin stored function nya, ngikutin pedoman algoritma :


CREATE DEFINER=`root`@`localhost` FUNCTION `sf_waktusholat`(vKodeCity int, vTanggal date, idxwaktusholat tinyint) RETURNS varchar(20) CHARSET utf8
BEGIN
declare B float;
declare L float;
declare R float;
declare H float;
declare J int;
declare beta float;
declare D float;
declare T float;
declare Gd float;
declare Gn float;
declare Z float;
declare U float;
declare Vd float;
declare Vn float;
declare W float;
declare hasil float;
declare jam varchar(20);

set j = dayofyear(vTanggal);
set Gd = 19;
set Gn = 19;

SELECT 2 * pi() * J / dayofyear(CONCAT(year(now()),'-12-31')) INTO beta;
SELECT (180/pi()) * (0.006918 - (0.399912 * cos(beta))+(0.070257 * sin(beta))-(0.006758 * cos(2*beta))+(0.000907*sin(2*beta))-(0.002697*cos(3*beta))+(0.001480*sin(3*beta))) INTO D;

SELECT 229.18*(0.000075+(0.001868*cos(beta))-(0.032077*sin(beta))-(0.014615*cos(2*beta))-(0.040849*sin(2*beta))) INTO T;

SELECT latitude, longitude, (timezone) * 15, ketinggian
INTO B,L,R,H
FROM tbl_city_coordinate
WHERE id = vKodeCity;

SET Z = 12 + ((R-L)/15) - (T/60);
SET U = (180/(15*pi())) * ACOS((SIN((-0.8333-(0.0347 * SIGN(H) * SQRT(ABS(H))))*pi()/180)- SIN(D * pi() / 180) * SIN(B * pi() / 180) )/(COS(D * pi()/180) * COS(B * pi()/180)));
SET Vd = (180/(15*pi())) * ACOS((-1 * SIN(Gd * pi()/180) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));
SET Vn = (180/(15*pi())) * ACOS((-1 * SIN(Gn * pi()/180) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));
SET W = (180/(15*pi())) * ACOS((SIN(ATAN(1/(1 + TAN(ABS(B-D) * pi()/180)))) - SIN(D * pi()/180) * SIN(B * pi()/180))/(COS(D * pi()/180) * COS(B * pi()/180)));

case idxwaktusholat
when 0 then SET hasil = (z - Vd) - 0.134; /*imsyak*/
when 1 then SET hasil = Z - Vd - 0.033 ; /*subuh*/
when 2 then SET hasil = Z - U; /*matahari terbit*/
when 3 then SET hasil = Z + 0.05; /*zuhur*/
when 4 then SET hasil = Z + W + 0.033; /*ashar*/
when 5 then SET hasil = Z + U + 0.033; /*maghrib*/
when 6 then SET hasil = Z + Vn - 0.0167; /*isya*/
end case;

SET Jam = SEC_TO_TIME(hasil*3600);
RETURN jam;
END;


coba bikin stored procedure utk nampilin waktu sholat :

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_waktusholat_tampil`(vIDKota int, tanggal date)
BEGIN
IF vIDKota <= 0 THEN
SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,
sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,
sf_waktusholat(id, date(tanggal), 4) as `Ashar`,
sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,
sf_waktusholat(id, date(tanggal), 6) as `Isya`
FROM tbl_city_coordinate
ORDER BY Kota ASC;
ELSE
SELECT Kota, sf_waktusholat(id, date(tanggal), 1) as `Subuh`,
sf_waktusholat(id, date(tanggal), 3) as `Dhuhur`,
sf_waktusholat(id, date(tanggal), 4) as `Ashar`,
sf_waktusholat(id, date(tanggal), 5) as `Maghrib`,
sf_waktusholat(id, date(tanggal), 6) as `Isya`
FROM tbl_city_coordinate
WHERE id = vIDKota;
END IF;
END;

*coba dieksekusi tu SP :
call sp_waktusholat_tampil(1,'2008-04-01');

*hasilnya :
+---------+----------+----------+----------+----------+----------+
| Kota | Subuh | Dhuhur | Ashar | Maghrib | Isya |
+---------+----------+----------+----------+----------+----------+
| JAKARTA | 04:40:05 | 11:59:33 | 15:14:20 | 18:01:09 | 19:10:03 |
+---------+----------+----------+----------+----------+----------+

... cukup memuaskan ...
*kurang lebih lah dengan jadwal sholat utk wilayah Jakarta yg sekarang nampang di republika-online

script lengkap bisa didonlot di sini...

TIDUR AAAH...



27
Cara Belajar Menjadi Programmer

Hari ini hari pertama ku aktif kerja lagi stlh nyaris 10 hari berpetualang di Jatim-Kaltim. Pagi-pagi cek imel (udah beberapa hari ini aku offline), eh ada imel dari seseorang tak dikenal dengan ID "no kus" (mgkn namanya Kusno ato Soekarno hehehe *sok tau bangedd sih*) nanya gini :

"Aku pingin jadi programmer. tapi belajarnya mulai dari mana dulu? oh ya aku ingin belajar delphi dan databasenya sql server 2000. Terima Kasih"


Hmm..., udah lama aku ngga "mewaluh" nieh. Kebetulan... Aku merenung sebentar, kupikirkan pertanyaan dia.. Dulu waktu masih lugu-lugunya aku juga sempat menanyakan hal yang serupa soalnya. Gimana caranya *memulai* belajar untuk jadi programmer?

Singkat kata, uneg-uneg udah penuh, akhirnya aku jawab begini :


klo aku ngajarin temen2ku,
1. belajar bikin GUI
2. belajar database (bikin tabel, jalin koneksi, syntax2 SQL)
3. belajar simple CRUD (create, retreive, update, delete) via database langsung n via aplikasi
4. belajar bikin report
5. ulangi poin 1-4 tapi tambahin fasilitas macam2. upgrade aplikasi pelan2, coba imple semua tips n trik.

cara belajar (pemrograman) yang efektif, sebenarnya perlu kmu *sesuaikan* dgn gaya belajar alami kamu.
Ada 3 gaya belajar :
1. VISUAL
2. AUDITORIAL
3. KINESTETIS

konsepnya sama kya kmu maen LEGO (pasang-pasangan) waktu masih TK dulu ^_^. dari potongan2 kubus/object yang ada, misal kmu disuru gurumu bikin menara eiffel, apakah kamu :

1. liat buku panduan-nya trus tiru dan ikuti semua step-by-step nya yang ada di panduan itu, MAKA gaya belajar alami kamu tergolong AUDITORIAL

2. liat orang (temenmu/tetanggamu/gurumu) bikin menara eiffel, trus tiru cara dia mbikin tu menara eiffel, MAKA gaya belajar alami kamu tergolong VISUAL
3. kmu ga comfort niru step-by-step yg ada di buku panduan, ato kmu pusing ngliat n ngikutin cara kerja orang, kmu LEBIH suka nyoba-nyoba sendiri, improvisasi, trial-error... MAKA gaya belajar alami kamu tergolong KINESTETIS.

nah,


sekarang, kecenderungan mu belajar dengan gaya apa? terapkan juga itu dalam cara belajar pemrograman.

1. kalo u dominan AUDITORIAL, u bisa baca2 buku pemrograman, ikutin semua step-by-step nya
2. kalo u dominan VISUAL, u bisa belajar dengan *memperhatikan* programmer laen bekerja trus tiru cara kerjanya
3. kalo u dominan KINESTETIS, tiada cara lain bagimu utk belajar selain dengan IMPROVISASI. coba-coba, gagal, coba lagi, gagal, coba lagi...

*kebanyakan programmer dan inventor (researcher, penemu, ilmuwan) itu orang-orang kinestetis.. tapi ngga menutup kemungkinan orang dengan gaya belajar alami AUDITORIAL dan VISUAL juga bisa jadi KINESTETIS suatu hari.. ini cuman masalah kebiasaan aja..


untuk permulaan, u bisa belajar pemrograman dengan tema sederhana misal bikin aplikasi buku telepon.
bikin GUI nya dulu,
struktur database,
CRUD,
report
trus ulangi semuanya sampe u ngrasa u udah cukup mahir...

algoritma? pelajarin sambil jalan..
InsyaAllah bisa.
yang penting tekun aja..

klo u memilih "menjerumuskan diri" ke Delphi, ikut milis/forum.
http://www.delphi-id.com
http://www.diskusiweb.com
delphindo@yahoogroups.com
ato
ke blog ini : http://ekoindri.wordpress.com
orangnya pinter delphi, baek, suka ngasi tips-n-trik, rajin ngupdate blog nya, penulis buku jg, sabar (spesifikasi wajib yg harus dimiliki seorang guru)

oke?

selamat mencoba!

NB :
oia, satu lagi :

jangan merasa malu untuk MENCONTEK dan MENIRU.
sebenarnya NYONTEK itu juga salah satu proses belajar
(kesalahan utama guru2 kita waktu SD-SMA selalu *mengharamkan* nyontek)
.. mereka ga sadar, klo sebenarnya Bill Gates bisa bikin Microsoft Windows jadi sebesar saat ini juga dari modal MENCONTEK.

ada filosofi bagus yang dianut ama Bill Gates ama Steve Jobbs (pendiri Apple Inc.) :

"...seniman yang PANDAI, dia MENIRU. seniman yang HEBAT, dia MENCURI..."

silakan interpretasikan sendiri maksud kata2 mereka itu...

--
wassalam,


Rizky Prihanto
http://www.software-arsitek.web.id
+62 856 496 00 496
+62 22 3018 3328

7
Business Intelligence "murah" makae VB6+Excel

Pernah liat aplikasi Business Intelligence? Ngerti apa itu Business Intelligence? Artikel terdahulu di blog ini sempat menjelaskan definisi "business intelligence", silakan baca klo masih blom mudeng apa itu BI (singkatan umum utk Business Intelligence). Nah, dalam artikel ku kali ini, aku akan bicara secara teknis (yippie... coding-coding...) tentang gimana mbikin aplikasi BI sederhana dan murah makae Visual Basic n Microsoft Excel. Murah? Yupz! Nyaris semua aplikasi BI di pasaran harganya mahal-mahal loo... Karena informasi yang disediakan dari aplikasi ini emang muahall bangedd. Berharga. Lha terus kenapa yg mo ta' tulis ini kulabelin "murah"? Hehehe, biar terkesan kontroversial ajah... - alasan utamanya sih, bcoz mbikin aplikasi BI pake VB6 + Excel ini GUAMPANGG bangedd n harga produksi nya ngga sampe ngabisin 2 batang rokok seharga @ Rp 600,00 - harga aplikasi development nya jg *murah* koq. xixixi (u know what I meant laah..). Berapa sih harga VB6 dan Microsoft Office 2003 ?!?!


Jadi begini, sebelum kulanjutin - aku mau cerita dikit dulu tentang apa sih komponen2 yang akan kita dalam aplikasi BI murah kita... Yaa, nggak semua komponen BI seperti dalam artikel yang ku post sebelumnya bakal kita coba implementasikan di sini sih. Namanya jg BI "murah" -- wajar donk? xixixi. Yang jelas, murah disini bukan berarti murahan! Ntar liat aja hasilnya, loe pasti terpana bolak-balik - "begini simpel seperti ini kah tuk bikin BI itu?"

Oke, cukup nge-gombalnya. Jadi begini, bahan2 yang kita butuhkan utk bikin nie aplikasi :

1. Data Source
Aplikasi business inteligence itu termasuk kategori OLAP (Online Analytical Processing). Proses ini merupakan kelanjutan dari proses data-mining (penambangan data). Nah, supaya aplikasi BI bisa jalan, tentunya sebelumnya musti ada donk data yg mo di-proses utk di-analisis...
Sebagai contoh dalam artikel-ku ini aku bikinin deh 1 tabel dalam 1 schema utk simulasi penambangan data.

DDL nya sebagai berikut (owya, aku makae MySQL. Lagi males makae access, ngga praktis utk coding pake script):


CREATE DATABASE db_contohdatamining;
USE db_contohdatamining;
CREATE TABLE tbldatamining (
kode int(10) NOT NULL auto_increment,
NamaSiswa varchar(50) NOT NULL,
Semester tinyint NOT NULL,
MataPelajaran varchar(50) NOT NULL,
Nilai tinyint NOT NULL,
PRIMARY KEY(kode)
)ENGINE=MyISAM;


tu tabel adalah contoh doank. Ntar sumber data mu ya ngambil dari tabel itu. Bisa aja sih u me-mining data dari query select yang multi tabel, atau kmu pre-definisi-kan pake VIEW. Sama aja itu.. Di sini aku asumsikan, ya itu lah kira2 struktur sumber data nya. Dalam struktur relasional database, lebih sehat sih klo ada TblMataPelajaran sendiri, n TblSiswa sendiri. Yah, ini kan cuman contoh. Suka-suka gue donk... Gue kan udah cukup baek (cakep lagi) utk ngasih contoh ini ke loe-loe pade... (cape loo blogging hal2 yg berbau tutorial itu). hihihi...

Oke, trus ini jg kusertakan beberapa contoh value data. Eksekusi aja :

INSERT INTO tblDataMining
(NamaSiswa,Semester,MataPelajaran,Nilai)
VALUES

('eRQee',1,'PPKn',7), ('eRQee',1,'Agama',8),
('eRQee',1,'B.Ind',8),('eRQee',1,'B.Ing',8),
('eRQee',2,'PPKn',6), ('eRQee',2,'Agama',6),
('eRQee',2,'B.Ind',7),('eRQee',2,'B.Ing',9),
('Neeah',1,'PPKn',9), ('Neeah',1,'Agama',8),
('Neeah',1,'B.Ind',6),('Neeah',1,'B.Ing',6),
('Neeah',2,'PPKn',8), ('Neeah',2,'Agama',7),
('Neeah',2,'B.Ind',7),('Neeah',2,'B.Ing',7),
('GNuKa',1,'PPKn',7), ('GNuKa',1,'Agama',9),
('GNuKa',1,'B.Ind',8),('GNuKa',1,'B.Ing',7),
('GNuKa',2,'PPKn',7), ('GNuKa',2,'Agama',9),
('GNuKa',2,'B.Ind',7),('GNuKa',2,'B.Ing',7),
('Tomb',1,'PPKn',6), ('Tomb',1,'Agama',7),
('Tomb',1,'B.Ind',6),('Tomb',1,'B.Ing',9),
('Tomb',2,'PPKn',6), ('Tomb',2,'Agama',6),
('Tomb',2,'B.Ind',7),('Tomb',2,'B.Ing',8);


2. cExcelReport.bas
Ini class-module bikinanku. Jujur, ini class module pertama yg kubikin beberapa tahun yg lalu. Udah beberapa kali sih mengalami penyempurnaan, tp aku cukup puas dengan nie class. Mengenkapsulasi beberapa kebutuhan utk reporting ato manipulating Excel Spreadsheet secara remote dari VB. :cool: Ntar kubedah deh arsitektur class-ku ini di postingan-ku yg laen...

Untuk mbikin PivotTable secara ostosmastis dari VB, pakae method ini :

Public Sub CreatePivotTable(sSourceRange As String, _
sDestinationRange As String, _
sRowFields As String, _
sColumnFields As String, _
sDataFields As String, _
sTitleDataFields As String)
Dim pt As Object

On Error GoTo Hell
Set pt = oSheet.PivotTableWizard _
( _
SourceType:=1, _
SourceData:=oSheet.Range(sSourceRange), _
TableDestination:=oSheet.Range(sDestinationRange) _
)

pt.AddFields RowFields:=sRowFields, _
ColumnFields:=sColumnFields
pt.AddDataField pt.PivotFields(sDataFields), sTitleDataFields
Exit Sub

Hell:
debug.print "[" & err.number & "] " & err.description
End Sub


Owya, cExcelReport.bas ini bisa you donlot di sini. Monggo dipake, gpp... aku ikhlas koq. But keep my credits on the top of ur code, please... Utk menghormati Creative Common Licenses... hehehe. Banyak programmer yg ngga gila harta, tp nyaris semua programmer gila hormat loo... (tonton/baca aja Takedown, bintangnya Kevin Mitnick ama Tsutsomu Shimomura...).

3. Sedikit code di salah satu form VB.
Kmu codingin ini di salah satu form mu. Jangan lupa juga, include-kan reference ke Microsoft ActiveX Data Objects Library 2.8 (versi sebelumnya nggak apa2 sieh, asal jangan 2.5 ke bawah aja)... Juga masukin component Microsoft Windows Common Controls 6.0 (soalnya di cExcelReport-ku ada kebutuhan utk export dari Listview). Reference utk Microsoft Excel xx Object Library *amat sangat* tidak dibutuhkan. Dengan cExcelReport.bas ku -- versi Excel yg dibutuhkan nggak ditentukan. BEBAS! Cuman harus ada aja... Klo u jalanin nie aplikasi di kompie yg ngga ada Excel-nya, InsyaAllah nggak jalan... hehehe, suer disambar geledek..

'--declaration
Private xls as cExcelReport
Private db as ADODB.Connection

Private Const CONST_HOST = "localhost"
Private Const CONST_PORT = "3306"
Private Const CONST_SCHEMA = "db_contohdatamining"
Private Const CONST_USERNAME = "root"
Private Const CONST_PASSWORD = "123456"

'--routine to open database connection
Private Sub OpenDB(ByRef db as ADODB.Connection)
db.CursorLocation = adUseClient
db.ConnectionString = "DRIVER={MySQL ODBC 3.51 Driver};" _
& "SERVER=" & CONST_HOST & ";" _
& "PORT=" & CONST_PORT & ";" _
& "DATABASE=" & CONST_SCHEMA & ";" _
& "UID=" & CONST_USERNAME & ";" _
& "PWD=" & CONST_PASSWORD & ";" _
& "OPTION=" & 1 + 2 + 8 + 16 + 2048
db.open
DoEvents
If Err.Number <> 0 And db.state <> adStateOpen Then
GoTo Hell
End If
Exit Sub
Hell:
msgbox "[" & err.number & "] " & err.description
End Sub

'--form load
Private Sub Form_Load()
Set db = New ADODB.Connection
db.mode = adModeReadWrite
db.CursorLocation = adUseClient
OpenDB
End Sub

'--tombol klik
Private Sub Command1_Click()
screen.mousepointer = vbHourglass
Dim sRangeSourceAwal As String, sRangeSourceAkhir As String
Dim sRangeDest As String
'tahap 1 : persiapkan object excel dan bikin dokumen baru
Set xls = New cExcelReport
xls.init

Dim iI As Integer, rs As ADODB.Recordset, sSQL As String
sSQL = "SELECT NamaSiswa,Semester,MataPelajaran,Nilai " & _
"FROM TblDataMining"
Set rs = db.execute(sSQL)
if rs.recordcount > 0 then
'tahap 2 : data-mining
xls.TulisCell 9, 1, "NamaSiswa", vbWhite
xls.TulisCell 9, 2, "Semester", vbWhite
xls.TulisCell 9, 3, "MataPelajaran", vbWhite
xls.TulisCell 9, 4, "Nilai", vbWhite
sRangeSourceAwal = "$A$9"
For iI = 1 To rs.RecordCount
xls.TulisCell 9 + iI, 1, rs(0).Value, vbWhite 'Nama Siswa
xls.TulisCell 9 + iI, 2, rs(1).Value, vbWhite 'Semester
xls.TulisCell 9 + iI, 3, rs(2).Value, vbWhite 'Mata Pelajaran
xls.TulisCell 9 + iI, 4, rs(3).Value, vbWhite, , , , , , , True 'nilai
rs.MoveNext
Next iI
sRangeSourceAkhir = "$D$" & CStr(9 + CLng(rs.RecordCount))
sRangeDest = "$F$10"
'tahap 3 : bikin pivot table
xls.CreatePivotTable sRangeSourceAwal & ":" & sRangeSourceAkhir, _
sRangeDest, _
"MataPelajaran", _
"NamaSiswa;Semester", _
"Nilai", _
"Sum of Nilai"
xls.ChangeWidth 0, 1, 4
'tahap 4 : tampilkan file excel
xls.tampil
else
Msgbox "Tidak ada data yang dapat di-analisis, bro...", _
vbInformation + vbOkOnly, "Maaf"

end if
rs.close
Set rs = nothing
Screen.mousepointer = vbDefault
End Sub

'--form unload
Private Sub Form_Unload()
on error resume next
set db = nothing
set xls = nothing
End Sub

n mau tau hasilnya kya apa? Lihatlah capturan berikut ini :


Lho? Kosong?

Hehehe, emang... tp coba aja klik tombolnya. Ntar bakal muncul dokumen Excel seperti ginian deh :



Yup, PivotTable Excel udah siap utk dipake untuk analisis. Coba drag Field-field di dock-window "Pivot Fields" ke dalam kotak biru dalam grid, Taroh field nilai di tengah, yg lainnya terserah u... ntar bakal menghasilkan tabel yang kira-kira seperti ini penampakannya :



Mau lebih representatif utk menganalisis? Klik kanan tu PivotTable , klik popup PivotChart... Otomatis, tanpa keluarin keringat apa2 (ato batang rokok tambahan utk disulut) -- udah jadi deh chart mu... Keren kan?



N mau di-kustomisasi ? monggo silahkan... uthex-uthex aja combo2 di field utk custom grouping or custom sorting tanpa pusing-pusing bikin/ngirim query lagi ke database... Mo ngganti "skin" chart utk analisis data multidimensional jg bisa... tinggal pilih field-nya, drag, pilih tipe chart (coba-coba aja ndiri), n bisa deh jadi kya seperti gambar berikut :


Pegimane? Mudah bukan? Keren bukan? Cakep bukan? Seperti inilah kira-kira aplikasi BI sederhana itu... seperti yg muncul dalam diskusi di milis, BI kurang lebih aja sama kya Pivot Excel...

Utk buat yg kesulitan nyoba, u bisa donlot source demo project nya di sini (tp u musti pake MySQL n eksekusi script SQL seperti yg udah kujelasin di atas).. mo sesuai-in dengan db favoritmu ndiri, silakan.. ganti ndiri yak? hehehe....