Minggu, 11 Agustus 2013

DELPHI - Mengurangi stok secara otomatis menggunakan Trigger MySQL

Selamat siang pemirsa, :D
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.



34 komentar:

  1. mas, tempat menuliskan CREATE TRIGGER untuk hapus,update, insert itu di mana?
    saya membuat database di phpmyadmin, di phpmyadmin tersebut tidak ada strigger,
    mohon penjelasannya,.

    BalasHapus
  2. penerapan di delphinya bgmana?mas

    BalasHapus
    Balasan
    1. ga usah coding lagi kok
      ckup buat trigger di MySQL nya,
      udah deh
      masukin datanya aja, nanti dia ngurangin sendiri
      jadi kita ga pusing sama coding di delphinya

      Hapus
  3. edit perintah trigger nya setelah create gimana? apakah di hapus dulu atau cara lihat di database kita ada trigger nya gimana? bisa aja selang waktu lama lupa ada trigger nya...

    BalasHapus
    Balasan
    1. kalo belum terbiasa dengan command line, bisa pakai berbagai UI untuk database.
      saya biasa pakai EMS untuk MySQL, Postgresql, SQLServer
      jadi tinggal buka dan edit..
      ada tabTRIGGER pada setiap Table

      Hapus
    2. EMS nya dapet dari mana ? freeware kah ?

      Hapus
    3. ketik aja di google , download EMS
      yang lite versionnya freeware, tapi udah cukup powerfull

      Hapus
  4. aslkum, pak sy mau nanya nih , sy mau buat kode otomatis tapi yang sy telusuri dar igoogle, smua menggunakan record count .. bgmn kalau seandainya salah satu record dihapus, maka bsa eror .. no urut kodenya akan sama. mohon pencerahannya pliss. VIA Fb : iwanhyvastha24@yahoo.co.id VIA email : iwanhyvastha@gmail.com

    BalasHapus
    Balasan
    1. Halo terimakasih sudah berkunjung di giavano.blogspot.com

      untuk autonumbering yang mudah, reusable,
      silahkan cek disini

      http://giavano.blogspot.com/2013/07/autonumbering-penomoran-otomatis-pada.html

      :)

      Hapus
  5. punya aku ko wktu di dbgrid delphinya ga berubah ya ? padahal kalo saya coba di sqlnya berubah ko. mohon bantuan nya

    BalasHapus
    Balasan
    1. Halo terimakasih sudah berkunjung.
      Mungkin penggunaan adoquery atau tablenya belum di refresh.
      Komponen apa yang anda pakai?

      Hapus
    2. Halo terimakasih sudah berkunjung.
      Mungkin penggunaan adoquery atau tablenya belum di refresh.
      Komponen apa yang anda pakai?

      Hapus
  6. gan klo jumlah pemesanannya 1 kok di ane ga berubah ya stocknya,, tapi kalo lebih dari satu baru bisa berubah....
    kira kira yang salahnya dimana ya..

    BalasHapus
  7. Mantapppppp . . Sangat membantu . . karena sebelumnya saya gunakan pengurangan stok dari coding di programnya . . panjang and ribed . . kalo pake trigger lebih simple . . thanks ilmunya

    BalasHapus
  8. mas bagimana kalau input melebihi stok barang
    (barang tidak bisa di proses)

    BalasHapus
    Balasan
    1. 1. Buat variable

      Declare .....

      2. Isi variabel dengan stok yg ada di tbl barang

      Set (nama var) = select .... from ... where kodebarang=new.kodebarang

      3. Tambahkan if

      If new.jumlah > (variabel stok ) then
      ....
      Else
      ...
      End if

      ... trigger before insert (data tdk disimpan) / after insert (data disimpan tapi diberi keterangan gagal) bergantung pada kebutuhan

      :)

      Hapus
  9. 1. Buat variable

    Declare .....

    2. Isi variabel dengan stok yg ada di tbl barang

    Set (nama var) = select .... from ... where kodebarang=new.kodebarang

    3. Tambahkan if

    If new.jumlah > (variabel stok ) then
    ....
    Else
    ...
    End if

    ... trigger before insert (data tdk disimpan) / after insert (data disimpan tapi diberi keterangan gagal) bergantung pada kebutuhan

    :)

    BalasHapus
    Balasan
    1. mas boleh tanya ini keluar dari topik kalau saya ingin buat perkalian antara harga barang dngan jumlah di tabel transaksi itu gimana ya

      Hapus
    2. makasih sangat membantu saya untuk buat projek

      Hapus
    3. Halo...
      Ada beberapa cara

      1. Buat kolom "biaya"

      -buat trigger after insert
      -update ... set biaya = jumlah*harga

      Tp cara diatas kurang efektif.

      2. Tampilkan data dari database dengan menggunakan "view"
      -create view as
      Select ...., jumlah*harga as biaya
      From ... , ...
      Where ...

      3. Buat kolom "view" di datagridview/dbgrid/stringgrid
      (Ambil kolom jumlah * kolom harga dari grid yg dipakai)

      Semoga bermanfaat :)

      Saran sy pakai cara no.2

      Hapus
  10. bang kalau saya input jumlah*harga = biaya di textbox mengunakan visual c# 2010 baru di tampilkan di dtagridview cara gimna ya koneksi dngan mysql
    kalau saya input langsung bisa di tampilkan
    mohon bantuanya master
    makasih sya udah coba no 2 di mysql jadi tapi di c# jadi juga perklian jadi juga tapi saat saya kilik button tambah dia tidak muncul di datagridview

    BalasHapus
  11. trigger Pengurangan stok support decimal gimana gan
    misalnya (1 + -0.5)

    BalasHapus
    Balasan
    1. Tipe datanya gan, jangan INT tapi decimal / double

      Hapus
  12. udah decimal gan
    kalau saya query hasil nya bener
    tapi kalau trigger gak bener kalau support koma

    BalasHapus
  13. iya memang makai titik gan
    ini contoh salah satu bagian trigger saya gan
    set new.Stock1 = old.Stock1 + new.qtyupdate;

    BalasHapus
    Balasan
    1. eksekusi triggernya lewat Java/c#/delphi/dll atau lsg lewat database gan?
      tipe data buat stock, sama tipe data buat parameter, sama tipe data buat input harus sama gan, termasuk jumlah angka dibelakang komanya..

      Hapus
  14. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  15. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  16. langsung lewat database gan, type datanya sama, jumlah angka di belakang koma juga sama gan

    BalasHapus
  17. mas cara membuat triger memberikan informasi stok tidak menycukupi gimana yah mas

    BalasHapus