DELPHI - Mengurangi stok secara otomatis menggunakan Trigger MySQL
berhubung kemaren ada yang request jadi saya tempel di blog ini
oke langsung aja,
jadi trigger itu fungsinya untuk jadi pemicu, misalnya :
pas kita jual barang, stok harus berkurang....
pas kita beli barang, stok harus bertambah...
pas kita update penjualan, stok harus dikurangi yang lama dan ditambah yang baru...
nah itu lah yang gunanya trigger, kalo ga pake trigger juga bisa, tapi lambat dan codingnya ribet.
misalnya saya punya tabel penjualan (master & detail) seperti ini
//Master
CREATE TABLE `mjual` (
`NOMOR_JUAL` char(10) NOT NULL,
`TANGGAL` date NOT NULL,
`NOPLAT` varchar(10) default NULL,
`MOTOR` varchar(20) default NULL,
`BIAYA_PASANG` double default '0',
`JENIS_BAYAR` varchar(20) default 'TUNAI',
`STATUS` varchar(50) default 'LUNAS',
PRIMARY KEY (`NOMOR_JUAL`),
UNIQUE KEY `IDJual` (`NOMOR_JUAL`)
)
//detail
CREATE TABLE `djual` (
`NOMOR_JUAL` char(10) NOT NULL,
`ID_BARANG` varchar(20) NOT NULL,
`JUMLAH` int(11) default '0',
`HARGA_JUAL` double default '0',
`DISKON` double default '0',
KEY `IDJual` (`NOMOR_JUAL`),
KEY `IDBarang` (`ID_BARANG`),
CONSTRAINT `djual_fk` FOREIGN KEY (`NOMOR_JUAL`) REFERENCES `mjual` (`NOMOR_JUAL`) ON UPDATE CASCADE,
CONSTRAINT `djual_fk1` FOREIGN KEY (`ID_BARANG`) REFERENCES `barang` (`ID_BARANG`) ON UPDATE CASCADE
)
//tabel barang
CREATE TABLE `barang` (
`ID_BARANG` varchar(20) NOT NULL,
`NAMA_BARANG` varchar(75) default NULL,
`SATUAN` varchar(10) default NULL,
`HARGA_BELI` double default '0',
`HARGA_BARANG` double default '0',
`STOK` int(11) default '0',
`NAMA_SUPPLIER` varchar(30) default NULL,
PRIMARY KEY (`ID_BARANG`),
UNIQUE KEY `IDGuru` (`ID_BARANG`),
KEY `IDSupplier` (`NAMA_SUPPLIER`),
CONSTRAINT `barang_fk` FOREIGN KEY (`NAMA_SUPPLIER`) REFERENCES `supplier` (`NAMA_SUPPLIER`) ON UPDATE CASCADE
)
//tabel supplier
CREATE TABLE `supplier` (
`NAMA_SUPPLIER` varchar(30) NOT NULL,
`ALAMAT` varchar(100) default NULL,
`TELEPON` varchar(30) default NULL,
`EMAIL` varchar(50) default NULL,
`NAMA_SALESMAN` varchar(30) default NULL,
`TELEPON_SALESMAN` varchar(30) default NULL,
`SISA_HUTANG` double default '0',
)
misalnya saya punya data tabel barang seperti ini
ID_BARANG | NAMA_BARANG | STOK | HARGA_BARANG
00000000001 | sabun colek | 100 | 3000
00000000002 | sabun mandi | 100 | 1500
nah nanti di tabel penjualan (detail) ketika kita masukin
kode 00000000001
jumlah penjualan 15,
maka stok 00000000001 harus menjadi 85. (inilah yang dimaksud trigger AFTER INSERT)
stok hanya akan berkurang, JIKA barang terjual (sesuai kodebarang yang diinput)
CREATE TRIGGER `djual_after_ins_tr` AFTER INSERT ON `djual`
FOR EACH ROW
BEGIN
UPDATE barang SET stok = stok - NEW.jumlah
WHERE ID_Barang = NEW.ID_Barang;
END;
nah gimana kalo ternyata salah input? trus jumlahnya bukan 15, tapi 20, kita tinggal update aja detail penjualannya, ganti si 15 jadi 20
kode 00000000001
jumlah penjualan 20,
maka stok 00000000001 harus menjadi 80. (inilah yang dimaksud trigger AFTER UPDATE)
CREATE TRIGGER `djual_after_upd_tr` AFTER UPDATE ON `djual`
FOR EACH ROW
BEGIN
UPDATE barang SET stok = stok - NEW.jumlah + OLD.jumlah
WHERE ID_Barang = OLD.ID_Barang;
END;
nah gimana kalo salah? dan datanya harus dihapus?
contoh kode 00000000001 uda dimasukkin jumlah jualnya 15, trus mau
dihapus karena salah, tentu stoknya harus kembali lagi kan jadi 100,
(inilah yang dimaksud trigger BEFORE DELETE)
jadi sebelum datanya dihapus, sistem otomatis kembalikan stok yang lama.
CREATE TRIGGER `djual_before_del_tr` BEFORE DELETE ON `djual`
FOR EACH ROW
BEGIN
UPDATE barang SET stok = stok + OLD.jumlah
WHERE ID_Barang = OLD.ID_Barang;
END;
yah silahkan anda coba di db engine masing2, sesuaikan sintaksnya dengan versi SQL yang dipakai :D
Semoga membantu,
thanks.
gan untuk penulisan syntax insert, update, deletenya dalam 1 query di gabung bukan ? ni saya gabung malah timbul error begini gan,
ReplyDeleteMsg 156, Level 15, State 1, Procedure Insert_Data_Transaksi, Line 9
Incorrect syntax near the keyword 'trigger'.
gimana ya logikanya misalnya :: namabrg(1).id = 30, namabrg.id(1).id = 40
ReplyDeleteterus saya mau jual barang = 50 nah... yang terjadi namabrg(1).id = -10 namabrg(1) = tetap 40
catatan :: namabrg(1).id --> barang yang sama
gimana yang Sobat ... perintah agar pada saat saya jual (50) akan otomatis mengambil Stok yang ada pada namabrg(1).id = 40 ini, artinya namabrg(1).id = 40 akan otomatis berkurang...
mohon bantuan nya
ReplyDeletegimana coding validasi apabila input stok keluar lebih banyak daripada stok yang ada