Sabtu, 27 Februari 2010

Manajemen Stock Dengan Trigger Database

Tulisan ini mengulas tentang manajemen stock atau inventory dan tidak membahas bagaimana menghitung Total ataupun subtotal. Untuk manajemen stock dibuat menggunakan trigger database. Privilege yang dibutuhkan CREATE TRIGGER Ada lima tabel yang digunakan yaitu MASTER_BARANG, ORD, ORD_DETAIL, SALES dan SALES_DETAIL. Rancangan tabel seperti pada gambar.

  • Ketentuan :
  • Barang yang akan dibeli atau dijual harus ada di tabel MASTER_BARANG
  • Pembelian akan menambah stock barang
  • Penjualan akan mengurangi stock barang
  • Quantity (QTY) penjualan dan pembelian boleh diupdate dan otomatis akan mempengaruhi jumlah stock di MASTER_BARANG
1. Buat tabel dan mendefinisikan constraint
SQL> CREATE TABLE MASTER_BARANG
2  (KODE_BRG NUMBER(4) PRIMARY KEY,
3  NAMA_BRG VARCHAR2(20) NOT NULL,
4  HARGA NUMBER(10),
5  STOCK NUMBER(4));
Table created.

SQL> CREATE TABLE ORD
2  (NO_ORDER NUMBER(4) PRIMARY KEY,
3  ID_SUPPLIER NUMBER(4) NOT NULL,
4  TGL_ORDER DATE,
5  RP_TOTAL NUMBER(12));
Table created.

SQL> CREATE TABLE ORDER_DETAIL
2  (NO_ORDER NUMBER(4) REFERENCES ORD(NO_ORDER),
3  NO_URUT NUMBER(3),
4  KODE_BRG NUMBER(4) REFERENCES MASTER_BARANG(KODE_BRG),
5  HARGA NUMBER(10),
6  QTY NUMBER(4),
7  SUBTOTAL NUMBER(10));
Table created.

SQL> CREATE TABLE SALES
2  (NO_SALES NUMBER(4) PRIMARY KEY,
3  ID_CUST NUMBER(4) NOT NULL,
4  TGL_SALES DATE,
5  RP_TOTAL NUMBER(12));
Table created.

SQL> CREATE TABLE SALES_DETAIL
2  (NO_SALES NUMBER(4) REFERENCES SALES(NO_SALES),
3  NO_URUT NUMBER(3),
4  KODE_BRG NUMBER(4) REFERENCES MASTER_BARANG(KODE_BRG),
5  HARGA NUMBER(10),
6  QTY NUMBER(4),
7  SUBTOTAL NUMBER(10));
Table created. 

2. Membuat Trigger Database
Trigger UPDATE_STOCK_BRG_ORD
Buat trigger update_stock_brg_ord di tabel order_detail Yang berfungsi untuk mengupdate stock di tabel master_barang jika ada pembelian barang atau perubahan qty di tabel order_detail.
SQL> CREATE OR REPLACE TRIGGER update_STOCK_brg_ord
2  BEFORE INSERT OR UPDATE OF QTY ON order_detail
3  FOR EACH ROW
4  BEGIN
5    IF NVL(:OLD.QTY,0) < NVL(:NEW.QTY,0) THEN
6       UPDATE MASTER_BARANG
7       SET STOCK = STOCK + (NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))
8       WHERE KODE_BRG = :NEW.KODE_BRG;
9    ELSE
10      UPDATE MASTER_BARANG
11      SET STOCK = STOCK - (NVL(:OLD.QTY,0)-NVL(:NEW.QTY,0))
12      WHERE KODE_BRG = :NEW.KODE_BRG;
13    END IF;
14  END;
15  /
Trigger created.
Trigger UPDATE_STOCK_BRG_SALES
Buat trigger update_stock_brg_sales di tabel sales_detail yang berfungsi untuk mengupdate stock di tabel master_barang jika ada penjualan barang atau perubahan qty di tabel sales_detail.
SQL> CREATE OR REPLACE TRIGGER update_STOCK_brg_sales
2  BEFORE INSERT OR UPDATE OF QTY ON sales_detail
3  FOR EACH ROW
4  BEGIN
5    IF NVL(:OLD.QTY,0) < NVL(:NEW.QTY,0) THEN
6       UPDATE MASTER_BARANG
7       SET STOCK = STOCK - (NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))
8       WHERE KODE_BRG = :NEW.KODE_BRG;
9    ELSE
10      UPDATE MASTER_BARANG
11      SET STOCK = STOCK + (NVL(:OLD.QTY,0)-NVL(:NEW.QTY,0))
12      WHERE KODE_BRG = :NEW.KODE_BRG;
13   END IF;
4  END;
15  /
Trigger created.
3. Isi Data ke tabel
Isi master_barang dengan beberapa barang dengan kolom stock di set 0 sebagai data awal.
SQL> INSERT INTO MASTER_BARANG VALUES(100,’PERMEN’,1000,0);
SQL> INSERT INTO MASTER_BARANG VALUES(200,’BUKU’,2500,0);
SQL> INSERT INTO MASTER_BARANG VALUES(300,’ROTI’,1500,0);
Lihat isi tabel MASTER_BARANG
SQL> select * from MASTER_BARANG;
KODE_BRG NAMA_BRG   HARGA   STOCK
---------- ---------- ------ -------
       100 PERMEN       1000       0
       200 BUKU         2500       0
       300 ROTI         1500       0
4. Pembelian, Penjualan dan Update
Lakukan pembelian untuk semua barang permen 200, buku 100, roti 100
Proses pembelian disini berarti Anda mengisi data ke tabel ORD dan ORDER_DETAIL
Isi dulu tabel ORD

SQL> INSERT INTO ORD VALUES(1,100,SYSDATE,600000);
1 row created.
Isi tabel ORD_DETAIL
SQL> INSERT INTO ORDER_DETAIL VALUES(1,2,200,2500,100,250000);
SQL> INSERT INTO ORDER_DETAIL VALUES(1,3,300,1500,100,150000);
SQL> INSERT INTO ORDER_DETAIL VALUES(1,1,100,1000,200,200000);
Lihat data di ORD_DETAIL
SQL> SELECT * FROM ORDER_DETAIL;
NO_ORDER NO_URUT   KODE_BRG HARGA  QTY   SUBTOTAL
-------- ------- ---------- ------ --- ----------
       1       2        200   2500 100     250000
       1       3        300   1500 100     150000
       1       1        100   1000 200     200000


Periksa stock pada tabel master_barang

SQL> select * from MASTER_BARANG;
KODE_BRG NAMA_BRG   HARGA   STOCK
---------- ---------- ------ -------
       100 PERMEN       1000     200
       200 BUKU         2500     100
       300 ROTI         1500     100

Semua stock barang sudah bertambah sesuai jumlah order.

Lakukan penjualan barang permen 20, buku 10, roti 50
Proses penjualan disini berarti Anda mengisi data ke tabel SALES dan SALES_DETAIL


Isi tabel SALES

SQL> INSERT INTO SALES VALUES (1,222,SYSDATE,120000);  1 row created.

Isi tabel SALES_DETAIL

SQL> INSERT INTO SALES_DETAIL VALUES(1,1,100,1000,20,20000);
SQL> INSERT INTO SALES_DETAIL VALUES(1,2,200,2500,10,25000);
SQL> INSERT INTO SALES_DETAIL VALUES(1,3,300,1500,50,75000);

Lihat isi tabel SALES_DETAIL
SQL> select * from SALES_DETAIL;
NO_SALES NO_URUT KODE_BRG  HARGA QTY   SUBTOTAL
-------- ------- -------- ------ ----- --------
       1       1      100   1000  20      20000
       1       2      200   2500  10      25000
       1       3      300   1500  50      75000


Lihat stock di tabel MASTER_BARANG

SQL> select * from MASTER_BARANG;
KODE_BRG NAMA_BRG   HARGA   STOCK
---------- ---------- ------ ------
       100 PERMEN       1000     180
       200 BUKU         2500      90
       300 ROTI         1500      50

Stock berkurang sesuai dengan jumlah penjualan.

Demikian pembahasan sederhana tentang manajemen stock (inventory) dengan menggunakan trigger database.

Silahkan dikembangkan sesuai dengan keperluan Anda.