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.

Tabel contoh manajemen stock

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. MEMBUAT TABEL DAN CONSTRAINT

CREATE TABLE MASTER_BARANG (
KODE_BRG 	NUMBER(4) PRIMARY KEY,
NAMA_BRG 	VARCHAR2(20) NOT NULL,
HARGA 		NUMBER(10),
STOCK 		NUMBER(4));
CREATE TABLE ORD(
NO_ORDER 	NUMBER(4) PRIMARY KEY,
ID_SUPPLIER 	NUMBER(4) NOT NULL,
TGL_ORDER 	DATE,
RP_TOTAL 	NUMBER(12));

CREATE TABLE ORDER_DETAIL(
NO_ORDER 	NUMBER(4) REFERENCES ORD(NO_ORDER),
NO_URUT 	NUMBER(3),
KODE_BRG 	NUMBER(4) REFERENCES MASTER_BARANG(KODE_BRG),
HARGA 		NUMBER(10),
QTY 		NUMBER(4),
SUBTOTAL 	NUMBER(10));

CREATE TABLE SALES(
NO_SALES 	NUMBER(4) PRIMARY KEY,
ID_CUST 	NUMBER(4) NOT NULL,
TGL_SALES 	DATE,
RP_TOTAL 	NUMBER(12));

CREATE TABLE SALES_DETAIL(
NO_SALES 	NUMBER(4) REFERENCES SALES(NO_SALES),
NO_URUT 	NUMBER(3),
KODE_BRG 	NUMBER(4) REFERENCES MASTER_BARANG(KODE_BRG),
HARGA 		NUMBER(10),
QTY 		NUMBER(4),
SUBTOTAL 	NUMBER(10));

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.

CREATE OR REPLACE TRIGGER update_STOCK_brg_ord
BEFORE INSERT OR UPDATE OF QTY ON order_detail
FOR EACH ROW
BEGIN
   IF NVL(:OLD.QTY,0) < NVL(:NEW.QTY,0) THEN
      UPDATE MASTER_BARANG
      SET STOCK = STOCK + (NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))
      WHERE KODE_BRG = :NEW.KODE_BRG;
   ELSE
      UPDATE MASTER_BARANG
      SET STOCK = STOCK - (NVL(:OLD.QTY,0)-NVL(:NEW.QTY,0))
      WHERE KODE_BRG = :NEW.KODE_BRG;
   END IF;
END;
/

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.

CREATE OR REPLACE TRIGGER update_STOCK_brg_sales
BEFORE INSERT OR UPDATE OF QTY ON sales_detail
 FOR EACH ROW
 BEGIN
   IF NVL(:OLD.QTY,0) < NVL(:NEW.QTY,0) THEN
      UPDATE MASTER_BARANG
      SET STOCK = STOCK - (NVL(:NEW.QTY,0)-NVL(:OLD.QTY,0))
      WHERE KODE_BRG = :NEW.KODE_BRG;
   ELSE
      UPDATE MASTER_BARANG
      SET STOCK = STOCK + (NVL(:OLD.QTY,0)-NVL(:NEW.QTY,0))
      WHERE KODE_BRG = :NEW.KODE_BRG;
   END IF;
END;
/

3. ISI DATA KE TABEL
Isi master_barang dengan beberapa barang dengan kolom stock di set 0 sebagai data awal.

INSERT INTO MASTER_BARANG VALUES(100,’PERMEN’,1000,0);
INSERT INTO MASTER_BARANG VALUES(200,’BUKU’,2500,0);
INSERT INTO MASTER_BARANG VALUES(300,’ROTI’,1500,0);
-- Lihat isi data BARANG
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
INSERT INTO ORD VALUES(1,100,SYSDATE,600000);

--Isi tabel ORD_DETAIL
INSERT INTO ORDER_DETAIL VALUES(1,2,200,2500,100,250000);
INSERT INTO ORDER_DETAIL VALUES(1,3,300,1500,100,150000);
INSERT INTO ORDER_DETAIL VALUES(1,1,100,1000,200,200000);

--Lihat data di ORD_DETAIL
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
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
INSERT INTO SALES VALUES (1,222,SYSDATE,120000);  1 row created.

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

--Lihat isi tabel SALES_DETAIL
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
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.

Salam
Bambang Sutejo

Tags: , , ,

This entry was posted on Saturday, February 21st, 2009 at 12:13 pm and is filed under 3. PL/SQL. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

9 Responses to “Manajemen Stock Dengan Trigger Database”

usyamah February 28th, 2009 at 9:06 am

thanks for all

Andrie May 7th, 2009 at 8:02 am

Makasih. Sangat membantu..

boleh minta tentang hash join ???

Kelly Brown June 13th, 2009 at 6:48 am

The best information i have found exactly here. Keep going Thank you

riswanto john August 15th, 2009 at 1:57 pm

terimakasih mas Bambang Sutejo. Tutorialnya sangat bagus langsung dapat di coba.
saya tunggu tutorialnya lagi mas.

terimakasih.
terimakasih…

firman November 10th, 2009 at 2:06 pm

terimakasih atas tutornya, bila berkenan boleh kirimin contoh filenya donk agar bisa langsung dipraktekkin…trims ya..

anantarm November 23rd, 2009 at 8:24 pm

Terima kasih penulis, sangat membantu tugas saya…. :-)

Martha November 25th, 2009 at 9:47 am

Selamat pagi Pak,

Saya mau nanya tentang modul inventory.
Kebetulan perusahaan mempunyai inventory barang yang banyak dan yang mau saya tanyakan adalah untuk pengkodean inventory.
Di dalam Oracle, untuk pengkodean inventory bisa menggunakan maksimal berapa digit?.Atas perhatiaannya saya ucapkan terima kasih.

download March 18th, 2010 at 1:33 am

Perfect site, i like it!

Dedi Juwaini July 2nd, 2010 at 1:08 pm

Saya hanya orang awam dalam masalah pemrograman, saya cuma mau tanya trigger database itu adanya pada sofware apa, yah?

Terima kasih

Leave a Reply