Oracle Magazine May 2012

oracle magazine free download dunia database programmer

oracle magazine free download dunia database programmerEach issue of Oracle Magazinecollects different editorial content in familiar sections and a particular order. And just as every editorial piece is designed to have an interesting beginning, a constructive middle, and a conclusive end, the various sections of the magazine are arranged for a similar flow. From Up Front, At Oracle, and Community to Features, Technology, and Comment, the idea is to give the magazine a beginning that makes you want to pick it up (in print), click it (for digital), or tap it open (for mobile distributions); a middle that provides infor-mation and awareness about Oracle and the Oracle community; and an end that makes you look forward to the next issue.

The beginning of each issue, the very first section and page, is key to getting readers to pick up or open the magazine. And that beginning is the cover. The discussion about what story to put on the cover of this particular issue of the magazine was a brief one. How to put that story—featuring Marvel’s The Avengers—on the cover was a much longer conversation. The solution: this issue of Oracle Magazinehas been published with six different covers, each highlighting one of the Marvel super heroes. Each cover version is numbered—1 through 6—in the “Special Collector’s Issue” logo.

Download magazine here

Oracle Magazine on Pojok Programmer

Oracle Magazine March 2012

oracle magazine free download dunia database programmer

oracle magazine free download dunia database programmerMy search for clarity on big data began a couple of years ago, and the initial challenges were many. First, as an editor, I often query or delete the word bigin descriptions of technology problems and solutions, because bigas a descriptor in enterprise technology doesn’t usually add much value. (In Oracle Magazine’s coverage of enterprise-class Oracle platforms, frameworks, and tools that manage the ever-growing volumes and types of structured and unstructured data in today’s information explosion, the word big may also be redundant.)

Second, in my initial search for definitions and descriptions of big data, I found what seemed to be different definitions from dif-ferent companies. And although I also found some comfort in editorial content substan-tiating my opinion that the definitions of big data at the time were variable, that same content didn’t help with my understanding of big data as a technology.

Finally, the examples of information included in big data stores and the tech-nologies that used them were as variable as big data’s definitions. And most examples seemed to be presented as new data silos for specific industries, making the applica-tion of an example to another industry a challenging task.

Download magazine here

Oracle Magazine on Pojok Programmer

Aplikasi Inventory Sederhana – Analisa dan Desain Database

Aplikasi Inventory Sederhana - Analisa dan Desain Database

Design Database adalah salah satu hal penting yang perlu diperhatikan dalam membuat aplikasi perkantoran. Dalam membuat design database, ikutilah kaidah-kaidah yang pernah kita dapatkan semasa kuliah, terutama Normalisasi, minimal sampai dengan bentuk 3NF. Kesalahan dalam membuat design database dapat berakibat fatal, misalnya sulit membuat coding dan men-generate report yang kita inginkan. Dan jika sampai harus mengubah design database maka akan banyak waktu terbuang karena kita harus menyesuaikan kembali coding yang sudah dibuat sebelumnya. Oleh karena itu sediakanlah waktu dan pikiran yang cukup dalam men-design database ini.

Artikel ini adalah bagian dari artikel berseri tentang Tutorial Membuat Aplikasi Inventory Sederhana Menggunakan VB.net dan Database MySQL

Dalam membuat design database Aplikasi Inventory atau Aplikasi Stok Barang ini, kami juga menyengajakan diri untuk membuat design database menggunakan bahasa inggris, tujuannya selain melatih skill bahasa inggris kita, juga untuk melatih diri kita, siapa tahu aplikasi ini akan di-publish menjadi open source, atau kita berkesempatan berkontribusi dalam project open source lain.

Berdasarkan analisa dan design aplikasi yang tertuang dalam artikel sebelumnya, maka kita memerlukan sejumlah table untuk menyimpan data-data Barang dan Transaksi Keluar Masuk Barang. Untuk itu, sejumlah table yang diperlukan antara lain:

Tabel Barang

Table untuk menampung data master barang ini akan kita beri nama items. Data dictionary lengkapnya adalah sebagai berikut:

No. Nama Field Tipe Data Keterangan
1. id integer Primary Key, Auto Increment
2. code varchar(20) Kode barang berupa text bebas maksimal 20 karakter, bisa digunakan sebagai barcode
3. name varchar(100) Nama barang maksimal 100 karakter
4. quantity_on_hand decimal(10,2) Quantity barang terakhir yang saat ini ada di gudang
5. remarks text Keterangan lebih lengkap tentang barang bersangkutan

Tabel Jenis Transaksi

Tabel ini akan berisi kode untuk menentukan jenis transaksi dan kita beri nama transaction_types. Untuk aplikasi ini akan ada 2 (dua) jenis transaksi yaitu Transaksi Barang Masuk (kita beri kode BM) dan Transaksi Barang Keluar (kita beri kode BK). Data dictionary lengkapnya adalah sebagai berikut:

No. Nama Field Tipe Data Keterangan
1. id integer Primary Key, Auto Increment
2. code varchar(20) Kode jenis transaksi berupa text bebas maksimal 20 karakter
3. name varchar(100) Nama panjang yang lebih deskriptif, maksimal 100 karakter

Tabel Transaksi

Tabel ini akan berisi seluruh transaksi inventory dari aplikasi yang akan kita buat. Untuk membedakan Transaksi Barang Masuk dengan Transaksi Barang Keluar kita sediakan field type_id yang merupakan Foreign Key yang me-refer ke . Data dictionary lengkapnya adalah sebagai berikut:

No. Nama Field Tipe Data Keterangan
1. id integer Primary Key, Auto Increment
2. type_id integer Foreign Key refer ke tabel transaction_types, untuk membedakan Transaksi Barang Masuk atau Keluar
3. trans_code varchar(100) Nama panjang yang lebih deskriptif, maksimal 100 karakter
4. trans_date date Tanggal transaksi
5. remarks text Teks bebas untuk keterangan, silakan mengarang di field ini juga boleh

Tabel Detil Transaksi

Tabel ini akan berisi seluruh transaksi inventory dari aplikasi yang akan kita buat. Untuk membedakan Transaksi Barang Masuk dengan Transaksi Barang Keluar kita sediakan field type_id yang merupakan Foreign Key yang me-refer ke . Data dictionary lengkapnya adalah sebagai berikut:

No. Nama Field Tipe Data Keterangan
1. id integer Primary Key, Auto Increment
2. trans_id integer Foreign Key refer ke tabel transactions, untuk record detil transaksi ini milik transaksi yang mana
3. item_id integer Foreign Key refer ke tabel items, untuk menentukan barang mana yang harus diubah status stock-nya
4. quantity decimal(10,2) Jumlah barang yang masuk atau keluar
5. remarks text Teks bebas untuk keterangan, silakan mengarang di field ini juga boleh

Diagram ER

Diagram ER menggunakan notasi IDEF1X dari desain database untuk aplikasi inventory sederhana ini adalah sebagai berikut.

Design Database Aplikasi Inventiry Sederhana Menggunakan VB.net

Script Database

Sedangkan script sql create table-nya adalah sebagai berikut.

create table items (
  id int auto_increment primary key,
  code varchar(20) not null,
  name varchar(100) not null,
  quantity_on_hand decimal(10,2) not null default 0,
  remarks text null
) ;

create table transaction_types (
  id int auto_increment primary key,
  code varchar(20) not null,
  name varchar(100) not null
) ;

create table transactions (
  id int auto_increment primary key,
  type_id int not null,
  trans_code varchar(20) not null,
  trans_date varchar(100) not null,
  remarks text null,
  foreign key(type_id) references transaction_types(id)
) ;

create table transaction_details (
  id int auto_increment primary key,
  trans_id int not null,
  item_id int not null,
  quantity decimal(10,2) not null default 0,
  remarks text null, 
  foreign key (trans_id) references transactions(id), 
  foreign key (item_id) references items(id) 
) ;

Simpulan

Dengan demikian selesailah sudah proses analisa dan desain kita. Dengan tersedianya Design Aplikasi dan Design Database, maka langkah selanjutnya kita bisa membuat Aplikasi-nya dengan lebih mudah dan terarah.

^_^

Aplikasi Inventory Sederhana – Analisa dan Desain Aplikasi

Aplikasi Inventory Sederhana - Analisa dan Desain Aplikasi

Analisa dan Desain biasanya merupakan salah satu langkah yang kadang disepelekan kebanyakan programmer, terutama programmer pemula dan single fighter, karena dianggap menghabiskan waktu saja, Kebanyakan programmer lebih memilih untuk langsung duduk di depan komputer dan melakukan coding, hasilnya biasanya adalah kebingungan yang sangat tentang apa yang harus mereka lakukan pertama kali. Padahal analisa dan desain sesungguhnya akan membantu kita mengarahkan dan mengetahui fitur apa saja yang harus dibuat dalam aplikasi yang sedang dikembangkan ini. Dalam membuat Aplikasi Inventory Sederhana atau Aplikasi Stok Barang ini, kita akan memanfaatkan software StarUML untuk membuat Use Case Diagram aplikasi ini. Use Case Diagram menggambarkan “apa” saja, atau fitur yang harus ada dalam aplikasi yang sedang kita buat ini. Dan untuk memudahkan, kita akan membatasi lingkup tutorial ini sesuai dengan apa yang tercantum dalam Use Case Diagram yang kita buat sekarang.

Artikel ini adalah lanjutan dari artikel berseri tentang Tutorial Membuat Aplikasi Inventory Sederhana Menggunakan VB.net dan Database MySQL

analisa dan desain use case aplikasi inventory vbnet vb.net mysql sederhana

Aplikasi ini akan kita bagi menjadi beberapa module meliputi

  • Modul Master Barang
  • Modul Transaksi Inventory
  • Modul Laporan

 

Pembagian modul ini nantinya juga harus tercermin dalam code vb.net yang kita buat. Jika kita perhatikan dalam gambar, terlihat bahwa Modul Transaksi dan Modul Laporan bergantung pada Modul Master, pada saat yang sama Modul Laporan juga bergantu pada Modul Transaksi. Hal ini sangatlah wajar karena Transaksi  tidak bisa dilakukan tanpa adanya data Master, dan Laporan tidak bisa dibuat tanpa tersedianya data dari Modul Master dan Modul Transaksi. Setelah kita tahu module apa saja yang perlu dibuat, maka kita harus mendetilkan masing-masing modul dengan diagram use case-nya.

Modul Master Barang

Modul Master Barang akan berisikan use-case berikut ini dengan fungsinya masing-masing antara lain,

  • Mengelola Data Master Barang. Use Case ini menggambarkan proses pengelolaan data Master Barang, skenario utama use case ini adalah melihat list barang yang tersimpan dalam database, pengguna kemudian dapat melakukan filtering untuk mencari data barang yang diinginkan. Extension, atau skenario alternatif, dari use case ini meliputi,
    • Menambah Barang Baru. Pengguna akan menekan tombol tertentu yang akan menampilkan form entri data barang agar pengguna bisa mengisikan data barang yang akan dibuatnya
    • Mengubah Data Barang. Pengguna akan memilih data barang yang akan diubah datanya kemudian menekan tombol tertentu, atau melakukan klik ganda pada data bersangkutan dan sistem akan menampilkan form berisikan data barang yang ingin diubah.
    • Menghapus Data Barang. Pengguna akan memilih data barang yang akan dihapus, kemudian menekan tombol tertentu. Sistem kemudian akan memberikan konfirmasi apakah pengguna benar-benar akan melakukan penghapusan data.

analisa dan desain use case modul master aplikasi inventory vbnet vb.net mysql sederhana

Modul Transaksi

Modul Transaksi akan berisikan use-case berikut ini dengan fungsinya masing-masing antara lain,

  • Mengelola Transaksi Barang Masuk. Use Case ini menggambarkan proses pengelolaan data Transaksi Barang Masuk, skenario utama use case ini adalah melihat list transaksi yang tersimpan dalam database, pengguna kemudian dapat melakukan filtering untuk mencari data transaksi yang diinginkan. Extension, atau skenario alternatif, dari use case ini meliputi,
    • Menambah Transaksi Barang Masuk Baru. Pengguna akan menekan tombol tertentu yang akan menampilkan form entri data transaksi agar pengguna bisa mengisikan transaksi yang akan dibuatnya
    • Mengubah Data Transaksi Barang Masuk. Pengguna akan memilih data transaksi yang akan diubah datanya kemudian menekan tombol tertentu, atau melakukan klik ganda pada data bersangkutan dan sistem akan menampilkan form berisikan data transaksi yang ingin diubah.
    • Menghapus Data Transaksi Barang Masuk. Pengguna akan memilih data transaksi yang akan dihapus, kemudian menekan tombol tertentu. Sistem kemudian akan memberikan konfirmasi apakah pengguna benar-benar akan melakukan penghapusan data.

analisa dan desain use case modul transaksi aplikasi inventory vbnet vb.net mysql sederhana

  • Mengelola Transaksi Barang Keluar. Use Case ini menggambarkan proses pengelolaan data Transaksi Barang Keluar, skenario utama use case ini adalah melihat list transaksi yang tersimpan dalam database, pengguna kemudian dapat melakukan filtering untuk mencari data transaksi yang diinginkan. Extension, atau skenario alternatif, dari use case ini meliputi,
    • Menambah Transaksi Barang Keluar Baru. Pengguna akan menekan tombol tertentu yang akan menampilkan form entri data transaksi agar pengguna bisa mengisikan transaksi yang akan dibuatnya
    • Mengubah Data Transaksi Barang Keluar. Pengguna akan memilih data transaksi yang akan diubah datanya kemudian menekan tombol tertentu, atau melakukan klik ganda pada data bersangkutan dan sistem akan menampilkan form berisikan data transaksi yang ingin diubah.
    • Menghapus Data Transaksi Barang Keluar. Pengguna akan memilih data transaksi yang akan dihapus, kemudian menekan tombol tertentu. Sistem kemudian akan memberikan konfirmasi apakah pengguna benar-benar akan melakukan penghapusan data.

analisa dan desain use case modul transaksi aplikasi inventory vbnet vb.net mysql sederhana

Modul Laporan

Modul Laporan akan berisikan use-case berikut ini dengan fungsinya masing-masing antara lain,

  • Melihat Laporan Kartu Stok. Sederhana saja, aplikasi akan menampilkan kronolagi keluar masuk barang sesuai dengan kriteria kode barang yang diberikan oleh pengguna.
  • Melihat Laporan Mutasi Stok. Berdasarkan periode tertentu sesuai input dari pengguna, Aplikasi akan menampilkan summary dari total keluar dan masuk dari masing-masing barang.

analisa dan desain use case modul laporan aplikasi inventory vbnet vb.net mysql sederhana

Simpulan

Selesailah kita mendefinisikan semua fitur dari Aplikasi yang akan kita bangun. Teman-teman mungkin bertanya-tanya, “Kenapa tidak ada modul Security? Apakah pengguna dapat menggunakan Aplikasi ini tanpa Login terlebih dahulu?” Jawabannya adalah, kita dengaja membatasi lingkup tutorial ini. Mengenai Modul security yang mengatur hak akses pengguna silakan dikembangkan sendiri, atau…. jika ada kesempatan, mungkin akan kita buatkan tutorialnya tersendiri.

Tetap Semangat!

Aplikasi Inventory Sederhana

Aplikasi Inventory Sederhana menggunakan VB VBnet MySQL

Membuat Aplikasi Inventory Sederhana atau Aplikasi Stok Barang adalah salah satu topik yang sangat umum, dan sering dijadikan sebagai salah satu topik skripsi, atau sekedar untuk mempelajari bahasa pemrograman tertentu. Aplikasi inventory juga menjadi topik yang cukup digemari karena kemungkinan pengguna yang sangat banyak, mulai dari warung-warung pinggir jalan sampai dengan hipermarket akan memerlukan aplikasi inventory untuk mengontrol status barang yang mereka jual. Bagi seorang programmer pemula, membuat aplikasi inventory juga bisa menjadi batu loncatan untuk membangun aplikasi perkantoran yang jauh lebih rumit.

Untuk itu saya akan mencoba membuat sebuah Tutorial Membuat Aplikasi Inventory Sederhana Menggunakan VB.net dan Database MySQL. VB.net dipilih karena merupakan salah satu bahasa yang sangat populer di Indonesia, dan sama halnya dengan database MySQL. Tutorial ini akan dibuat berseri menjadi artikel-artikel kecil untuk memudahkan teman-teman mempelajari konsep yang ada di dalamnya.

Struktur dari tutorial ini akn dibagi-bagi menjadi subtopik kecil adalah sebagai berikut:

  1. Analisa dan Desain Aplikasi. Menjabarkan hasil analisa dan desain untuk aplikasi yang akan dibuat. Untuk memudahkan, Diagram UML Use Case akan digunakan untuk menggambarkan fitur-fitur yang akan tersedia dalam Aplikasi Inventory Sederhana ini.
  2. Analisa dan Desain Database. Menjabarkan hasil analisa dan desain database yang akan digunakan untuk menyimpan data barang dan transaksinya. Notasi IDEF1X akan digunakan untuk diagram desain database-nya
  3. Penggunaan Trigger untuk Update Stok Barang. Menjabarkan desain database trigger untuk melakukan proses update saldo stok barang setiap kali ada transaksi barang masuk dan transaksi barang keluar. Artikel ini dilengkapi dengan test langkah-demi-langkah untuk mempermudah pemahaman materi.
  4. Desain User Interface. Menjabarkan desain umum user interface dan pemanfaatan visual inheritance untuk mendapatkan tampilan yang konsisten untuk semua form dalam aplikasi ini.
  5. Desain Data Access Layer. Menjabarkan desain lapisan data akses untuk mempermudah kita membuat aplikasi ini. Untuk Data Access Layer ini akan kita gunakan ADO.net 2.0 terlebih dahulu untuk mempermudah teman-teman dalam migrasi dari VB6 ke VB.net. Kalau ada kesempatan nanti kita bisa buat menggunakan Entity Framework.
  6. Membuat Form Master Barang. Menjabarkan detil langkah demi langkah membuat form master barang, mencakup keseluruhan fungsi CRUD (Created Read Update Delete) untuk data barang.
  7. Membuat Form Transaksi Barang Masuk. Menjabarkan detil langkah demi langkah membuat form transaksi barang masuk, mencakup keseluruhan fungsi CRUD (Created Read Update Delete) untuk data transaksi barang masuk.
  8. Membuat Form Transaksi Barang Keluar. Menjabarkan detil langkah demi langkah membuat form transaksi barang keluar, mencakup keseluruhan fungsi CRUD (Created Read Update Delete) untuk transaksi barang keluar.
  9. Membuat Form Laporan Kartu Stok, Menjabarkan pembuatan form yang menampilkan data kartu stok masing-masing barang, meliputi kronologis keluar masuknya barang.
  10. Membuat Form Laporan Mutasi Stok, Menjabarkan pembuatan form yang menampilkan data kartu stok keseluruhan barang, berupa summary barang masuk dan keluar serta saldo terakhir barang tercatat di gudang.

 

Jadi….. Bookmark segera artikel ini, karena artikel-artikel lanjutan akan diterbitkan secara periodik. Dan mudah-mudahan tutorial ini dapat membantu teman-teman mempelajari VB.net.

Semangat Belajar!

^_^

Belajar SQL: CASE Clause – Logika Percabangan

Belajar SQL Logika Percabangan Case clause

Belajar SQL Logika Percabangan Case clauseSalah satu fungsi atau clause yang kurang begitu populer di SQL adalah CASE clause. Salah satu sebabnya adalah umunya SQL lebih dikenal hanya untuk proses SELECT, INSERT, UPDATE dan DELETE saja, dan karena CASE clause punya fungsi yang sama dengan IF di semua bahasa pemrograman yang ada, misalkan PHP, Java, dan sebagainya. Untuk itu saya akan berikan contoh sederhana penggunaan SQL untuk melakukan perhitungan dengan sedikit logika IF sederhana.

Misalkan kita mempunya contoh data seperti berikut ini

mysql> select * from penggunaan;
+----------+-------+--------+-------+-------+-------+-------+--------+
| kegiatan | senin | selasa | rabu  | kamis | jumat | sabtu | minggu |
+----------+-------+--------+-------+-------+-------+-------+--------+
| olahraga | ya    | tidak  | ya    | tidak | ya    | tidak | tidak  |
| diskusi  | tidak | ya     | tidak | tidak | tidak | ya    | tidak  |
| rapat    | ya    | tidak  | tidak | tidak | tidak | tidak | tidak  |
| ulangan  | tidak | ya     | ya    | ya    | tidak | tidak | tidak  |
+----------+-------+--------+-------+-------+-------+-------+--------+
4 rows in set (0.00 sec)

ketika kita ingin tahu berapa banyak dalam seminggu kegiatan-kegiatan tersebut di atas dilakukan atau tidak. Sebagai contoh untuk kegiatan OLAHRAGA dalam satu minggu dilakukan sebanyak 3 kali dan tidak dilakukan sebanyak 4 kali. jika kita bisa dengan mudah menggunakan PHP dan looping untuk menghitungnya menggunakan logika percabangan IF, misalkan.

if ($row['senin']=='ya')
    $dilakukan += 1;
else
    $tidak_dilakukan += 1;

Kalau menggunakan SQL caranya adalah seperti ini

mysql> select penggunaan.*
    -> , case when senin='ya' then 1 else 0 end
    -> + case when selasa='ya' then 1 else 0 end
    -> + case when rabu='ya' then 1 else 0 end
    -> + case when kamis='ya' then 1 else 0 end
    -> + case when jumat='ya' then 1 else 0 end
    -> + case when sabtu='ya' then 1 else 0 end
    -> + case when minggu='ya' then 1 else 0 end as dilakukan
    -> , case when senin='tidak' then 1 else 0 end
    -> + case when selasa='tidak' then 1 else 0 end
    -> + case when rabu='tidak' then 1 else 0 end
    -> + case when kamis='tidak' then 1 else 0 end
    -> + case when jumat='tidak' then 1 else 0 end
    -> + case when sabtu='tidak' then 1 else 0 end
    -> + case when minggu='tidak' then 1 else 0 end as tidak_dilakukan
    -> from penggunaan ;

Saat menghitung jumlah "dilakukan" kita berikan nilai 1 jika field berisikan 'ya', selain itu beli nilai 0. Dan saat menghitung jumlah "tidak_dilakukan" kita berikan nilai 1 jika field berisikan 'tidak', selain itu beli nilai 0. Setelah itu jumlahkan semua CASE clause tersebut sehingga kita dapatkan hasil seperti ini

+----------+-------+--------+-------+-------+-------+-------+--------+-----------+-----------------+
| kegiatan | senin | selasa | rabu  | kamis | jumat | sabtu | minggu | dilakukan | tidak_dilakukan |
+----------+-------+--------+-------+-------+-------+-------+--------+-----------+-----------------+
| olahraga | ya    | tidak  | ya    | tidak | ya    | tidak | tidak  |         3 |               4 |
| diskusi  | tidak | ya     | tidak | tidak | tidak | ya    | tidak  |         2 |               5 |
| rapat    | ya    | tidak  | tidak | tidak | tidak | tidak | tidak  |         1 |               6 |
| ulangan  | tidak | ya     | ya    | ya    | tidak | tidak | tidak  |         3 |               4 |
+----------+-------+--------+-------+-------+-------+-------+--------+-----------+-----------------+
4 rows in set (0.00 sec)

Tadaaaa….. Bagaimana? Luar biasa, bukan?

Dengan satu perintah SQL, kita bisa mendapatkan data yang matang dan ketika membuat program PHP-nya kita cukup menmpilkannya saja dalam bertuk <table></table> dan tidak perlu menghitung-hitung lagi. Mudah dan Cepat (y)

The Magic of Trigger

database trigger after insert mysql

database trigger after insert mysqlSalah satu business rule yang banyak dijumpai dalam aplikasi perkantoran adalah penyimpana data menggunakan skema table master-detail seperti data Purchase Order, Invoice dan sebagainya. Tantangannya adalah membuat sebuah field yang berisi summary nilai pembelian yang ada di dalam table detail. Misalkan ada data Purchase Order dengan 5 item masing-masing bernilai 1.000.000 rupiah maka akan ada field summary di table master yang berisikan nilai 5.000.000.

Business Rule seperti di atas dapat di-enforce di level aplikasi menggunakan code PHP, Java, atau .net. Namun dapat juga dilakukan di level database dengan menggunakan trigger. Untuk mencapainya silakan ikuti langkah-langkah berikut ini,

Pertama-tama kita buat table master dan table detail.

mysql> -----------------------------
mysql> -- buat table header
mysql> -----------------------------
mysql> create table header (
    ->   id int auto_increment primary key,
    ->   amount int default 0
    -> ) ;
Query OK, 0 rows affected (0.04 sec)
 
mysql> -----------------------------
mysql> -- buat table detail
mysql> -----------------------------
mysql> create table detail (
    ->   id int auto_increment primary key,
    ->   header_id int not null,
    ->   quantity int default 0,
    ->   unit_price int default 0,
    ->   foreign key (header_id) references header (id)
    -> ) ;
Query OK, 0 rows affected (0.03 sec)

Kemudian coba kita buatkan trigger untuk meng-handle aktifitas insert ke table detail. Logikanya adalah, setiap kali ada penginputan row baru ke table detail maka field amount di table master harus diubah.

mysql> -----------------------------
mysql> -- buat insert trigger untu tabel detail
mysql> -- amount di table header dihitung
mysql> -- berdasarkan perkalian quantity*unit_price
mysql> -----------------------------
mysql> delimiter |
mysql> create trigger trg_detail_insert
    -> after insert on detail
    -> for each row
    -> begin
    ->   update header
    ->   set amount = (
    ->     select sum(quantity*unit_price)
    ->     from detail where header_id = new.header_id )
    ->   where id = new.header_id ;
    -> end;
    -> |
Query OK, 0 rows affected (0.01 sec)
 
mysql> delimiter ; 

Untuk keperluan ujicoba, maka kita masukkan beberapa row record ke table master dan coba tampilkan untuk mengetahui isinya. Dan dapat terlihat bahwa amount masih bernilai 0 (nol)

mysql> -----------------------------
mysql> -- insert sampel data ke header
mysql> -- kemudian tampilkan
mysql> -----------------------------
mysql> insert into header(amount)
    -> values (0), (0), (0) ;
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
mysql> select * from header ;
+----+--------+
| id | amount |
+----+--------+
|  1 |      0 |
|  2 |      0 |
|  3 |      0 |
+----+--------+
3 rows in set (0.00 sec)
Kemudian coba kita masukkan beberapa row record data ke table detail dan coba tampilkan isinya.
mysql> -----------------------------
mysql> -- insert sampel data ke detail
mysql> -- kemudian tampilkan
mysql> -----------------------------
mysql> insert into detail (header_id, quantity, unit_price)
    -> values (1, 10, 100), (1, 2, 300),
    ->        (2, 1, 500), (2, 5, 300) ;
Query OK, 4 rows affected (0.04 sec)
Records: 4  Duplicates: 0  Warnings: 0
 
mysql> select * from detail;
+----+-----------+----------+------------+
| id | header_id | quantity | unit_price |
+----+-----------+----------+------------+
|  3 |         1 |       10 |        100 |
|  4 |         1 |        2 |        300 |
|  5 |         2 |        1 |        500 |
|  6 |         2 |        5 |        300 |
+----+-----------+----------+------------+
4 rows in set (0.00 sec)

Setelah kita lihat data yang ada di table detail di atas, maka seharusnya trigger akan mengubah field amount yang ada di table master. jadi sekarang kita coba tampilkan isi table master seperti di bawah ini.

mysql> -----------------------------
mysql> -- coba tampilkan isi table header
mysql> -- seharusnya amount sudah berubah
mysql> -----------------------------
mysql> select * from header;
+----+--------+
| id | amount |
+----+--------+
|  1 |   1600 |
|  2 |   2000 |
|  3 |      0 |
+----+--------+
3 rows in set (0.00 sec)

Tadaaa……. Sukses…. BERHASIL !!!!

mysql> -----------------------------
mysql> -- YESS....... !!!
mysql> -- it works
mysql> -----------------------------
mysql>

Setelah ini masih ada beberapa hal yang dapat dikembangkan lagi, yaitu trigger untuk proses UPDATE detail, karena proses update di table detail seharusnya juga mengubah nilai amount yang ada di table master. Selain itu contoh di atas menggunakan database MySQL, sehingga teman-teman yang ingin menerapkannya di sistem RDBMS lain harus menyesuaikan kembali sintaks-nya.

Semoga tutorial ini bisa bermanfaat.

Representasi SQL JOIN Secara Visual

Mempelajari SQL bagi beberapa orang adalah sebuah tantangan tersendiri, terlebih lagi paradigma yang dibawa SQL, yaitu paradigma set atau himpunan sangat jauh berbeda dengan paradigma programming yang umunya imperatif atau prosedural. Ketika kita belajar himpunan dahulu pasti pernah dikenalkan dengan Diagram Venn. Dengan menggambarkan SQL JOIN menggunakan Diagram Venn mudah mudahan bisa mempermudah kita memahaminya. Saya akan membahas tujuh cara yang berbeda menggabungkan dua tabel relasional yang berbeda menggunakan SQL JOIN.

(more…)

Iterasi pada record data dengan menggunakan LOOP dan CURSOR pada Stored Procedure.

Terkadang untuk beberapa kasus, kita sangat membutuhkan untuk melakukan iterasi dan mengevaluasi terhadap kumpulan data dalam tabel. Setelah melakukan evaluasi, kemudian kita mengembalikannya dalam sebuah tabel, sehingga menjadi sebuah representasi data yang kita butuhkan sesuai kondisi yang diinginkan. Pada sampel sebelumnya di artikel Dasar-dasar Stored Procedure, saya telah memberikan contoh stored procedure dengan nama sp_laporanglobal. Pada contoh ini, saya melakukan pemanggilan berulang terhadap sp_laporan sesuai dengan kriteria kategori barang. Pada prinsipnya, tabel kategori sudah ada di database ini (Northwind), sehingga untuk efektifitas pengkodingan, seharusnya saya melakukan iterasi terhadap tabel kategori/Categories.

Saya bisa melakukan iterasi dengan dua cara, yaitu dengan WHILE LOOP dan CURSOR. Saya akan mencoba cara pertama, yaitu WHILE LOOP. Untuk melakukan iterasi dengan WHILE LOOP, saya membutuhkan sebuah tabel sementara yang datanya diambil dari tabel Categories. Saya juga membutuhkan pengkondisian agar WHILE LOOP ini bisa berjalan satu demi satu pada row yang ada di tabel sementara. Disini saya mencoba untuk melakukan SELECT dan DELETE terhadap tabel sementara.

WHILE LOOP

Kode perubahan Stored Procedure:

ALTER PROCEDURE [dbo].[sp_laporanglobal]
	AS
	BEGIN
	CREATE TABLE #laporanglobal
	
	Nmr INT IDENTITY(1,1),
	no_urut INT,
	ProductName VARCHAR(50),
	UnitPrice MONEY
	)
	
	--lakukan iterasi dengan menggunakan WHILE LOOP
	DECLARE @categoryID INT
	
	--Ambil data dari tabel Categories, masukkan ke tabel sementara
	SET ROWCOUNT 0
	SELECT CategoryID INTO #tempCategories FROM Categories
	SET ROWCOUNT 1
	select @categoryID = CategoryID from #tempCategories
	
	WHILE @@rowcount <> 0
	begin
	SET ROWCOUNT 0
	INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan @CategoryID
	DELETE #tempCategories WHERE CategoryID = @CategoryID
	SET ROWCOUNT 1
	select @categoryID = CategoryID from #tempCategories
	end
	
	SET ROWCOUNT 0
	SELECT * FROM #laporanglobal
	DROP TABLE #laporanglobal
END

Perubahan yang saya lakukan pada script di atas adalah sebagai berikut:

  • Memasukkan data CategoryID ke dalam #tempCategories.
  • Ada perintah SET ROWCOUNT, perintah ini sama dengan perintah TOP. Saya membuat SET ROWCOUNT 1 untuk memastikan bahwa row yang diambil adalah satu baris saja.
  • Kemudian saya assign variabel @categoryID agar mempunyai nilai yang sama dengan CategoryID pada sebuah row di #tempCategories
  • Saya lakukan WHILE LOOP, kondisi WHILE LOOP adalah mengevaluasi @@rowcount. Nilai dari @@rowcount ini adalah nilai yang diambil dari sebuah statement akhir. Persis di atas WHILE, ada sebuah statement: “select @categoryID = CategoryID from #tempCategories”, ini akan mengembalikan nilai 1 jika record di #tempCategories masih ada.
  • Didalam body WHILE LOOP, saya lakukan INSERT statement ke dalam tabel #laporanglobal. Setelah melakukan INSERT, kemudian saya DELETE baris ini, sehingga pada pengulangan selanjutnya baris di bawahnya akan dievaluasi. Jika sudah tidak ada row/baris lagi, maka nilai @@rowcount akan 0 dan iterasi akan berhenti.

 

CURSOR

Pada CURSOR, kita bisa melakukan fetching data satu per satu terhadap kumpulan data yang kita punya. Dengan kemampuan fetching data dari CURSOR, kita tidak membutuhkan sebuah tabel temporary. Pada saat fetching, cursor menyimpan data hasil fetch ke dalam sebuah variable.

Lebih jelas nya kita lihat saja perubahan script di bawah ini:

CREATE PROCEDURE [dbo].[sp_laporanglobal2]
AS
BEGIN
      SET NOCOUNT ON;
      CREATE TABLE #laporanglobal
      (
            Nmr INT IDENTITY(1,1),
            no_urut INT,
            ProductName VARCHAR(50),
            UnitPrice MONEY
      )

      --membuat CURSOR
      DECLARE @categoryID INT
      DECLARE myCursor CURSOR
      FOR SELECT CategoryID FROM Categories
      OPEN myCursor
      FETCH NEXT FROM myCursor
      INTO @categoryID
      WHILE @@FETCH_STATUS = 0
      BEGIN
            INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan @CategoryID
            FETCH NEXT FROM myCursor
            INTO @categoryID
      END

      SELECT * FROM #laporanglobal
      DROP TABLE #laporanglobal
END

Hal pertama untuk operasi CURSOR adalah mendeklarasikan cursor itu sendiri. DECLARE myCursor CURSOR, adalah pendeklarasian sebuah Cursor dengan ID myCursor. Kemudian ada keyword FOR, disini adalah SELECT statement yang kita inginkan untuk FETCH data. Apapun SELECT statement bisa dibuat disini.  Selanjutnya kita buka Cursor tersebut dengan keyword OPEN. Setelah itu barulah kita bisa melakukan FETCH data. Pada saat melakukan WHILE, kondisi yang kita evaluasi adalah @@FETCH_STATUS. Nilai 0 dari @@FETCH_STATUS mengindikasikan statemen FETCH sukses/berhasil. Jika selain dari 0, maka kondisi WHILE sudah tidak memenuhi persyaratan dan FETCH selesai.

SOLVED CASE

Berikut beberapa case yang bisa diselesaikan dengan CURSOR/WHILE LOOP.

Case 1:

Pada database Northwind, terdapat tabel Order Details, yang mana pada tabel ini terdapat Quantity dan ProductID. Untuk membuat pelaporan yang baik, diminta untuk membuatkan saldo penjualan per transaksi. Jika pada hari ini terjadi 10 order dan kemarin ada 5 order, maka saldo jual hari ini adalah 15. Demikian seterusnya.

Pemecahan masalah:

Hasil yang diharapkan:

Sampel di atas bisa juga diselesaikan dengan keyword OVER pada SQL Server, tapi karena kita lagi berbicara masalah CURSOR, saya coba menyelesaikan dengan CURSOR.

Case 2:

Pada sebuah bisnis proses, jika terjadi sebuah transaksi yang dilakukan oleh seorang member, maka upline dari member tersebut mendapatkan rebate hasil dari transaksi si member. Demikian juga upline dari si upline, sampai posisi upline paling atas. Nilai rebate anggap saja seragam pada semua tingkatan upline. Bagaimana solusi dari permasalahan ini?

Solusi:

 

Daftar member di tblMember:

Dari gambar di atas, jika member 8 melakukan transaksi, maka member 8 akan bertambah saldo rebate untuk diri sendiri, kemudian saldo rebate juga akan bertambah untuk member 7, 6, 5, 4 dan 1. Jika member 1 melakukan transfer, maka rebate bertambah untuk diri sendiri, dikarenakan tidak ada upline dari member tersebut.

Saya membutuhkan bantuan trigger pada tabel tblTransaksi. Trigger ini akan memicu pemanggilan Stored Procedure di atas, berikut script untuk trigger nya:

Ketika saya memasukkan data pada tblTransaksi, maka trigger akan aktif, memanggil SP, kemudian SP akan menyimpan rebate dari si member dan upline2 nya. Berikut hasil pada tabel saldo, jika saya memasukkan transaksi untuk member id 8:

Dari gambar di atas, bisa dilihat jika SP kita sudah sesuai dan bisa menjadi solusi untuk permasalahan ini. Biasanya case seperti ini terdapat pada bisnis Multi Level Marketing.

Demikianlah tutorial dengan contoh kasus kali ini. Semoga bermanfaat.

Dasar-dasar Stored Procedure Pada SQL SERVER 2005 ke atas

Dasar-dasar Stored Procedure Pada SQL SERVER 2005 ke atas

A stored procedure is a subroutine available to applications that access a relational database system. A stored procedure (sometimes called a proc, sproc, StoPro, StoredProc, sp or SP) is actually stored in the database data dictionary. (From Wikipedia)

Fungsi/subrutin yang tersimpan dalam database. Di Microsoft SQL Server 2005, kita bisa memanggil semua listing stored procedure dalam database kita dengan menggunakan perintah query berikut:

select *

from information_schema.routines

where routine_type = ‘PROCEDURE’

 

Perintah di atas akan menampilkan semua informasi mengenai SP yang ada di database. Termasuk tanggal buat, tanggal di ubah dan lain-lain. Tetapi perintah di atas hanya berlaku untuk login sysadmin.

Membuat Stored Procedure.

Query di atas adalah langkah sederhana untuk membuat sebuah stored procedure. Kita bisa membuat sebuah SP tanpa parameter dan dengan parameter. Kata kunci untuk mengingat nya adalah Create…As…Begin. Untuk melakukan modifikasi terhadap SP, gantilah kata kunci CREATE menjadi ALTER. Di bagian BEGIN… END inilah kita menulis sintaks programming logic. Bisa hanya memanggil sebuah query terhadap tabel, view, memanggil sp lainnya, membuat cursor dan lain-lain. Menulis sintaks stored procedure tidak semudah menulis di visual studio sebuah program. Disini tidak ada intellisense maupun debug. Murni dengan berlatih, maka kita akan membuatnya menjadi lebih baik.

Jika tidak hafal perintah creat SP atau takut terjadi kesalahan, maka dari sql server management studio, kita bisa membuat SP dari object explorer. Perhatikan gambar di bawah. Ini adalah sebuah contoh membuat sebuah SP baru dari Object Explorer.

 

Sample 1, Stored Procedure untuk memanggil tabel.

Untuk sample ini, saya menggunakan database Northwind. Di atas adalah query sederhana untuk membuat sebuah SP. Diharapkan SP ini dapat memanggil semua data dari tabel Products. Eksekusilah perintah query di atas, jika berhasil maka dari Object Explorer akan bertambah sebuah Stored Procedure seperti gambar di bawah:

 

Lihatlah gambar di atas, telah terbentuk sebuah Stored Procedure dengan nama sp_getproducts. Sampai dengan tahapan ini, dari sisi sintaks query, apa yang kita tulis sudah benar.  Jika tidak benar, maka akan muncul exception dari sql server, misalnya kesalahan deklarasi variabel, query yang salah dan lain-lain.

Selanjutnya adalah memanggil SP tersebut. Gunakan keyword EXEC  diikuti dengan nama Stored Procedure untuk melakukan pemanggilan atau eksekusi terhadap SP yang kita buat. Perhatikan gambar di bawah:

 

Ketika kita melakukan eksekusi sp_getproducts, maka SP tersebut akan mengembalikan data dari tabel Products. Hal ini cocok dengan logic kita di bagian body dari SP, yaitu SELECT * FROM Products. Jika anda memiliki sebuah View, maka anda dapat memanggil View tersebut dengan mengubah query menjadi SELECT * FROM <NamaView>.

Kita juga bisa memfilter data dengan kata kunci WHERE dengan memodifikasi query menjadi SELECT * FROM Products WHERE CategoryID = 1. Tetapi cara ini sangat statis, tidak dinamis. Sangat tidak baik untuk membuat 1 buah SP untuk 1 buah Category. Jika menginginkan SP yang dinamis dan reusable, gunakanlah parameter pada SP anda.

Sample 2, Stored Procedure dengan Parameter.

Hal yang paling penting disini adalah pendeklarasian variabel pada sql server. Gunakan keyword DECLARE untuk mendeklarasikan variabel, misalnya kita ingin membuat variabel dengan tipe data Int:

DECLARE @angka INT

Berbeda dengan tipe data int, tipe data yang bersifat string seperti char, varchar dll, harus dibuatkan panjang karakternya, misal:

DECLARE @kalimat VARCHAR(20)

Nah, sekarang kita akan melakukan modifikasi terhadap SP yang kita buat sebelumnya. Melakukan modifikasi bisa dari object explorer, klik kanan pada nama SP, kemudian klik Modify.

Selanjutnya lakukan seperti pada gambar:

Setelah nama SP, yaitu sp_getproducts, sisipkan sebuah variabel atau argument @categoryID dengan tipe data INT. Langkah selanjutnya adalah melakukan passing variabel @categoryID tersebut ke dalam body Stored Procedure kita. Jika telah selesai, eksekusi query tersebut, jika tidak ada exception, maka langkah yang kita buat sudah benar.

Selanjutnya adalah cara memanggil stored procedure tersebut. Panggil SP seperti biasa dengan keyword EXEC, kemudian tambahkan argumen di belakang nama SP sesuai tipe data:

EXEC sp_getproducts 1

Perintah di atas akan memfilter products dengan category ID = 1. Jika kita mengganti angka 1 dengan angka lain, maka SP akan memfilter data dari Products sesuai dengan angka Category yang di passing ke argumen.

Biar lebih clear lagi, saya akan ubah sampel kita menjadi lebih kompleks. Misal saya ingin melakukan join terhadap tabel Categories dan kemudian membuat SP yang mempassing nama kategori, jadi bukan ID dari kategori. Perhatikan query di bawah:

ALTER PROCEDURE [dbo].[sp_getproducts]
@categoryName VARCHAR(50)
AS
BEGIN
    SELECT P.ProductName, C.CategoryName, P.UnitPrice  FROM Products P
    INNER JOIN Categories C ON P.CategoryID = C.CategoryID
    WHERE C.CategoryName = @categoryName
END

Untuk memanggilnya lakukan perintah seperti ini:

EXEC sp_getproducts ’Beverages’

Jika ingin menggunakan keyword LIKE, modifikasi SP kita menjadi:

 

ALTER PROCEDURE [dbo].[sp_getproducts]
@categoryName VARCHAR(50)
AS
BEGIN
    SELECT P.ProductName, C.CategoryName, P.UnitPrice  FROM Products P
    INNER JOIN Categories C ON P.CategoryID = C.CategoryID
    WHERE C.CategoryName LIKE '%'+@categoryName+'%'
END

Menggunakan Temporary Tabel.

Sebenarnya dari beberapa BLOG (yang ane dah lupa blog nya), tidak disarankan untuk menggunakan temp table. Tapi tidak ada salahnya kita mencoba, toh teknologi ini telah disertakan di berbagai macam vendor database. Temp tabel tidak bisa terdeteksi pada object explorer. Temp tabel akan terhapus secara otomatis.

Nama dari temporary tabel biasanya dimulai dengan tanda ‘#’. Berikut adalah sintaks untuk membuat temp table:

    CREATE TABLE #tabelku     
     ( id int,         
       Kolom1 varchar(20),   
       Kolom2 varchar(20),
       Kolom3 datetime,        
       Kolom4 char(1))

Oke, langsung saja kita ke sampel, ceritanya saya akan mengurutkan data pada tabel products. Pengurutan data saya lakukan dengan cara mengelompokkan berdasarkan CategoryID. Jika CategoryID berubah, maka nomor urut akan di reset kembali menjadi 1.

Ada banyak pendekatan untuk menyelesaikan masalah ini. Pilihan saya adalah menggunakan temp tabel. Saya akan melakukan query dengan filter berdasarkan CategoryID, kemudian saya akan memasukkan ke dalam temp tabel dengan menggunakan keyword SELECT * INTO. Sekedar catatan, jika menggunakan SELECT * INTO, kita tidak perlu membuat temp tabel dengan keyword CREATE lagi.

Sintax SQL:

CREATE PROCEDURE sp_laporan
@categoryid INT
AS
BEGIN
      SET NOCOUNT ON;
      SELECT ProductName, UnitPrice INTO #laporan FROM Products
      WHERE CategoryID = @categoryid
      ORDER BY ProductName ASC
      ALTER TABLE #laporan
      ADD no_urut INT IDENTITY(1,1)
      SELECT no_urut, ProductName, UnitPrice FROM #laporan
END

Jalan cerita dari sintaks di atas:

  • membuat SP dengan nama sp_laporan
  • mempassing parameter @categoryid, parameter ini nanti dibutuhkan untuk filter data pada SELECT query.
  • Query dengan keyword SELECT … INTO, disini kita memasukkan data langsung ke dalam temp tabel #laporan. Pada case ini belum dibutuhkan looping terhadap data.
  • Kita lakukan ALTER terhadap tabel #laporan, menambahkan field no_urut dengan tipe data INT dan bersifat IDENTITY, sehingga menghasilkan auto number.
  • Ketika saya melakukan pemanggilan terhadap SP, maka akan dihasilkan bentuk data seperti gambar di bawah.

Pengurutan data bisa terjadi juga pada field UnitPrice. Jika dikehendaki pengurutan data dari UnitPrice dari harga paling murah ke harga paling mahal dan menambahkan nomor urut, maka modifikasi saja SP tersebut, jika sebelumnya pada keyword ORDER BY kita urutkan berdasarkan ProductName, maka gantilah ProductName menjadi UnitPrice. Maka akan menghasilkan seperti gambar di bawah ini:

Menggabungkan hasil dari beberapa SP

Kita bisa juga menggabungkan hasil dari beberapa SP kedalam sebuah temp tabel. Masih dengan contoh sebelumnya dimana kita concern terhadap no_urut. Coba perhatikan query di bawah ini:

CREATE PROCEDURE sp_laporanglobal
AS
BEGIN
      SET NOCOUNT ON;
      CREATE TABLE #laporanglobal
      (
            Nmr INT IDENTITY(1,1),
            no_urut INT,
            ProductName VARCHAR(50),
            UnitPrice MONEY
      )
      INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan 1
      INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan 2
      INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan 3
      INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan 4
      INSERT INTO #laporanglobal (no_urut, ProductName, UnitPrice) EXEC sp_laporan 5
      SELECT * FROM #laporanglobal
      DROP TABLE #laporanglobal
END
GO

 

Jalan ceritanya:

  • Saya membuat temp tabel bernama #laporanglobal, dengan 4 buah field. Field Nmr adalah identity, sementara field lainnya adalah field yang kita ambil dari Stored Procedure sp_laporan.
  • Selanjutnya saya lakukan INSERT ke dalam temp tabel, sambil melakukan eksekusi terhadap SP. Teknik yang cukup akrobatik sebenarnya hehehe. Untuk sementara saya kasi contoh yang seperti ini, karena kita belum membicarakan looping.

Sepertinya pembicaraan kita mengenai dasar-dasar SP, cukup sampai disini. Mungkin ke depan kita bicarakan masalah CURSOR dan LOOPING. Apa yang anda pelajari sampai di topik ini saya rasa sudah cukup banyak. Jika masih belum puas, saya akan berikan beberapa keyword untuk googling:

  • JOIN multiple Stored Procedure
  • Temp Table on Stored Procedure
  • ALTER and CREATE Table.

Percayalah, saya hanya googling keyword di atas untuk membuat artikel ini.