Trigger bagaikan pisau bermata dua. Salah penggunaan bisa berakibat fatal, dan tidak sedikit developer software antipati dengan trigger karena sering terjadi hal-hal yang tidak disangka-sangka dan bahkan di luar nalar, berhari-hari melakukan debugging, pada akhirnya problem ditemukan karena adanya sebuat trigger yang tidak terdokumentasi dengan baik. Walaupun sebuah pisau bisa membunuh kita, bukan berarti kita harus membuangnya jauh-jauh dan tidak mau menggunakannya lagi, karena penggunaan yang benar tentunya akan sangat membantu mempermudah dan meningkatkan kualitas hidup kita :)
Dalam artikel ini, akan kita mempelajari cara penggunaan trigger yang benar, dalam rangka membantu mempermudah kita membuat sebuah Aplikasi Inventory Sederhana ini. Trigger akan kita gunakan untuk melakukan update status kuantitas stok barang setiap kali terjadi transaksi penambahan dan pengurangan barang, atau transaksi barang masuk atau barang keluar. Jika kita sederhanakan sampai level database, maka akan ada perintah SQL INSERT, UPDATE, dan DELETE di table transaksi yang secara otomatis, mengubah status stok barang bersangkutan.
Desain database sudah kita buat pada langkah analisa dan desain database pada artikel sebelumnya. Maka langkah selanjutnya adalah membuat trigger untuk setiap jenis SQL DML. Trigger akan kita tempelkan ke table transaction_details, karena di table itulah informasi ID dan jumlah kuantitas barang tersedia. Untuk detail sintaks CREATE TRIGGER dapat mengacu ke dokumentasi MySQL CREATE TRIGGER di sini.
Referensi Data
Untuk tutorial ini, diasumsikan sudah tersedia data untuk transaction_typesdan items seperti berikut ini,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| mysql> -- ----------------------------- mysql> -- data jenis transaksi mysql> -- ----------------------------- mysql> select * from transaction_types ; + ----+------+---------------+ | id | code | name | + ----+------+---------------+ | 1 | IN | BARANG MASUK | | 2 | OUT | BARANG KELUAR | + ----+------+---------------+ 2 rows in set (0.00 sec) mysql> -- ----------------------------- mysql> -- data master barang mysql> -- ----------------------------- mysql> select * from items ; + ----+--------+-------------------------+------------------+---------+ | id | code | name | quantity_on_hand | remarks | + ----+--------+-------------------------+------------------+---------+ | 1 | PC.001 | PC Jangkrik Tipe 1 | 0.00 | NULL | | 2 | PC.002 | PC Jangkrik Tipe 2 | 0.00 | NULL | | 3 | SV.001 | Server Rainer Tipe 1 | 0.00 | NULL | | 4 | SV.002 | Server Rainer Rackmount | 0.00 | NULL | + ----+--------+-------------------------+------------------+---------+ 4 rows in set (0.00 sec) |
INSERT Data Transaksi
Untuk proses INSERT ini akan kita set berjalan setiap kali ada sebuah row dimasukkan ke dalam database, diindikasikan dengan keywork FOR EACH ROW, dan setiap row yang baru masuk bisa kita ketahui di variable NEW. Logikanya adalah seperti ini,
- Setiap kali ada transaksi barang masuk, maka field stok barang di table itemsakan kita tambahkan,
- Sebaliknya, setiap kali ada transaksi barang keluar, maka field stok barang di table items akan kita kurangi,
maka trigger INSERT akan seperti ini.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| mysql> delimiter $$ mysql> drop trigger if exists trg_transaction_details_after_insert$$ Query OK, 0 rows affected (0.00 sec) mysql> -- ----------------------------- mysql> -- after insert trigger mysql> -- ----------------------------- mysql> create trigger trg_transaction_details_after_insert -> after insert on transaction_details -> for each row -> begin -> -- ----------------------------- -> -- ambil jenis transaksi -> -- ----------------------------- -> declare tipe varchar (20); -> set tipe = ( -> select tt.code -> from transactions tr -> join transaction_types tt on tr.type_id=tt.id -> where tr.id=new.trans_id -> ) ; -> -- ----------------------------- -> -- update sesuai jenis transaksi -> -- ----------------------------- -> update items -> set quantity_on_hand -> = quantity_on_hand -> + case when tipe= 'IN' then new.quantity -> when tipe= 'OUT' then -new.quantity -> else 0 end -> where items.id=new.item_id ; -> end $$ Query OK, 0 rows affected (0.12 sec) mysql> delimiter ; mysql> |
No comments:
Post a Comment