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. 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),
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.
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
Kali ini saya akan memperkenalkan apa itu Trigger, kalo diartikan dala B.Indonesia trigger yaitu pemicu. Trigger (pemicu) ini merupakan jenis khusus yang melakukan prosedur yang tersimpan secara otomatis saat pengguna mencoba membuat pernyataan data-modifikasi yang ditentukan pada tabel.
Microsoft ® SQL Server ™ memungkinkan penciptaan beberapa trigger(pemicu) untuk setiap pernyataan yang diberikan INSERT, UPDATE, atau DELETE.
Misalnya saya punya 2 tabel, tabel barang dan tabel pembelian, untuk lebih jelasnya bisa
dilihat pada gambar dibawah ini. Dalam tabel barang tersebut ada nama barang dan jumlah stock ,
IDEnya adalah ketika tabel pembelian ditambahkan, jumlah stock barang akan terupdate secara
otomatis.misalnya ketika barang A dibeli sejumlah 3 buah maka nanti stock barang akan bertambah
3 secara otomatis. proses tersebut bisa dilakukan dgn trigger
=> ini contoh tablenya, nama table bisa diganti sesuai selera
Langsug saja saya contohkan Syntax programnya :
Tapi ini kita buat tabelnya dulu yaa....
create table BARANG (
BAR_ID int not null,
BAR_NAMA varchar(255) not null, BAR_STOCK int null
default 0,
constraint PK_BARANG primary key (BAR_ID) )
go
create table PEMBELIAN (
PEM_ID int not null, BAR_ID int null , PEM_JUMLAH int null ,
constraint PK_PEMBELIAN primary key (PEM_ID) )
go
create index RELATION_FK on PEMBELIAN (BAR_ID) go
alter table PEMBELIAN
add constraint FK_PEMBELIA_RELATION_BARANG foreign key (BAR_ID) references BARANG (BAR_ID)
INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (1,’AQUA’); INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (2,’TOTAL’); INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (3,’AQUADES’);
Setelah anda menjalankan syntax tersebut, maka anda akan mempunyai 2 tabel, yaitu tabel barang dengan isi 3 buah data, dan tabel pembelian dengan data masih kosong. 3 data di tabel barang tersebut secara defaut stocknya adalah 0.
Kemudian saatnya kita buat trigger sehingga ketika kita menambahkan data di tabel pembelian dengan jumlah pembelian barang tertentu, maka stock di tabel barang akan bertambah sesuai dengan barang yg dibeli, syntax trigger tersebut adalah sebagai berikut.
create trigger tambahStockbarang on pembelian for insert
as
update b set b.bar_stock = b.bar_stock + i.pem_jumlah from barang b join inserted i on b.bar_id = i.bar_id
arti dari kode tersebut adalah sebagai berikut
create trigger tambahStockbarang on pembelian
membuat trigger dengan nama tambahStockBarang dimana trigger tersebut akan terpicu jika ada perubahan di tabel pembelian
for insert as
perubahan tersebut adalah penambahan(insert) di tabel pembelian , selain penambahan bisa juga diisi dengan perubahan(update) atau penghapusan(delete)
for disini juga bisa rubah isinya jadi after atau instead of . perbedaanya adalah waktu trigger dikerjakan, biasaya yg sering digunakan adalah for
update b set b.bar_stock = b.bar_stock + i.pem_jumlah from barang b join inserted i on b.bar_id = i.bar_id
ini adalah kode yg dikerjakan ketika kejadian trigger terpicu, kode diatas bertujuan merubah nilai bar_stock pada tabel barang dengan menambahkan nilai bar_stock yg sekarang dengan jumlah barang yg dibeli (pem_jumlah). perhatikan disini ada tabel yang bernama inserted, tabel tersebut merupakan tabel logika yg digunakan untuk menyimpan data yang memicu terjadinya trigger, dalam hal ini nilai data yg dimasukkan(insert) kedalam tabel pembelian, selain inserted, tabel logika lainnya adalah deleted, tabel logika ini digunakan untuk trigger yg terpicu dengan kejadian delete
kita coba masukkan kode berikut
INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (1,1,4); INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (2,3,2); INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (3,1,1); arti kode tersebut
pem_id haruslah beda karena merupakan primary key beli aqua(kode bar_id=1) sebanyak 4
beli aquades (kode bar_id=3) sebanyak 2 beli aqua lagi sebanyak 1
sehingga secara keseluruhan yg dibeli aqua sebanyak 5 dan aquades sebanyak 2
karena default nilai stock barang adalah 0, maka seharusnya nilai aqua 5 dan aquades 2 adalah jumlah stock barang sekarang ini sama seperti gambar di bawah….
Yah memang agag susah, tapi kalo syntax nya sucses...?! bbeee……seneng banget…..
oh ya hati-hati dengan penulisan nama table nya loh, biasanya berpengaruh, kalo gag ati-ati bisa eror lagi nanti.
Trigger adalah salah satu Transact-SQL code yang intinya secara otomatis mengeksekusi suatu task (insert, update dan delete) pada suatu object apabila ada DML(Data Manipulation language) yang dieksekusi pada object tertentu...
supaya lebih mudah kita asumsikan ada 2 tabel yaitu table stock dan table transaksi penjualan. pada tabel stok terdapat nama barang dan stoknya. kemudian terjadi penjualan barang pada table transaksi penjualan , maka secara otomatis jumlah stock barang pada table barang akan berkurang.
untuk lebih mudah , mari kita coba untuk membahas bagaimana cara membuat trigger.
sebelumnya kita create dulu Database dan beberapa tabel untuk uji coba trigger
(!)
note : Pembuatan database yang akan kita gunakan disini semata-mata untuk mempermudah dalam memahami cinta satu sama lain trigger, sehingga akan dibuat se-ngawurse-simpel mungkin dan tanpa memperhatikan normalisasi. sedangkan untuk normalisasi sendiri akan sama-sama kita bahas di thread lain... heheQuerynya :
Databasenya
CREATE DATABASE TOKO_PINTAR
Tabelnya
CREATE DATABASE TOKO_PINTAR USE TOKO_PINTAR
GO
CREATE TABLE Product (
kode_product INT Identity (20110,1), nama_barang Varchar(100),
stok int )
CREATE TABLE Pembelian (
kode_pembelian INT Identity (11020,1), nama_barang VARCHAR (100),
kode_product INT, jumlah INT
)
CREATE TABLE Penjualan (
kode_penjualan INT Identity (11020400,1), nama_barang VARCHAR (100),
kode_product INT, jumlah INT
)
GO
INSERT INTO Product VALUES ('Flashdisk 16 GB','20'), ('Processor Quad Core','30') , ('Mouse','15')
hasilnya
nah sekarang mari kita coba untuk membuat Trigger pada table Pembelian
USE TOKO_PINTAR GO
Create trigger tr_pembelian on pembelian for insert,update
as
IF EXISTS (Select PD1.nama_barang FROM Product PD1 JOIN inserted i1 on PD1.nama_barang = i1.nama_barang)
update PD set PD.stok = PD.stok + i.jumlah
from Product PD join inserted i on PD.nama_barang= i.nama_barang
ELSE
INSERT Product (nama_barang ,stok)SELECT i3.nama_barang,i3.jumlah
FROM inserted i3
UPDATE pembelian SET kode_product = P.kode_product
FROM Product P JOIN pembelian ON pembelian.nama_barang = P.nama_barang
kita coba untuk Insert Row baru namun dengan nama barang yang sudah ada di tabel Product
mari kita lihat hasilnya
sekarang kita coba untuk insert barang baru lewat tabel pembelian
INSERT INTO PEMBELIAN(nama_barang,jumlah) VALUES('Hardisk Eksternal 1 TB','35')
berikut adalah trigger untuk penjualan
USE TOKO_PINTAR GO
CREATE trigger tr_penjualan on penjualan for insert,update
as
IF EXISTS (Select PD1.nama_barang FROM Product PD1 JOIN inserted i1 on PD1.nama_barang = i1.nama_barang)
update PD set PD.stok = PD.stok - i.jumlah
from Product PD join inserted i on PD.nama_barang= i.nama_barang
ELSE
SELECT 'barang dengan nama '+i2.nama_barang + ' tidak dapat ditemukan dalam database'
FROM inserted i2
UPDATE penjualan SET kode_product = P.kode_product
FROM Product P JOIN penjualan ON penjualan.nama_barang = P.nama_barang
Sekarang mari kita insert penjualan
nah..berikut mari kita lihat hasilnya