Thursday, 28 August 2014

METODE FIFO, MYSQL



METODE FIFO DENGAN MYSQL.

METODE FIFO SERING DIGUNAKAN PADA SISTEM INVENTORI BARANG, PRINSIPNYA ADALAH BARANG YANG PERTAMA DIBELI AKAN DIJUAL LEBIH DULU. BOSO INGGRISE SENG MLEBU SIKEK METU SIKEK.
SECARA TIDAK LANGSUNG HAL TERSEBUT CUKUP GAMPANG TAPI BAGAIMANA IMPLEMENTASINYA TERUTAMA DALAM SYSTEM DATABASE.
SEARCHING KE INTERNET  BANYAK SEKALI CARA YANG LUMAYAN , MAKSUDNYA LUMANYAN MEMBUAT PUSING.
SAYA MENCOBA MENERAPKAN METODE FIFO TERSEBUT DENGAN KONSEP MENGUPDATE DATA BARANG MASUK. PRINSIPNYA ADALAH BARANG MASUK MEMILIKI  FIELD JUMLAH,KELUAR, SISA. SISA ADALAH JUMLAH DIKURANGI KELUAR. SISA AKAN MENJADI STOK. SISA AKAN  DIUPDATE APABILA ADA BARANG YANG KELUAR.
WES MUMETTT.
LANGSUNG BUAT DATABASE “FIFO”.
BUAT TABEL BARANGKELUAR
CREATE TABLE `barangkeluar` (
  `KODE_TRANSAKSI` int(11) NOT NULL auto_increment,
  `TANGAL` date default NULL,
  `KODE_BRG` char(2) default NULL,
  `JUMLAH` int(11) default NULL,
  PRIMARY KEY  (`KODE_TRANSAKSI`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
BUAT TABLE BARANGMASUK
CREATE TABLE `barangmasuk` (
  `KODE_TRANSAKSI` int(11) NOT NULL auto_increment,
  `TANGGAL` date default NULL,
  `KODE_BRG` char(2) NOT NULL,
  `JUMLAH` int(11) NOT NULL,
  `HARGA` int(11) default NULL,
  `KELUAR` int(11) NOT NULL,
  `SISA` int(11) NOT NULL,
  PRIMARY KEY  (`KODE_TRANSAKSI`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
ISIKAN DATA PADA TABEL BARANGMASUK
INSERT INTO `barangmasuk` VALUES (1, '2014-01-01', '01', 5, 0, 5);
INSERT INTO `barangmasuk` VALUES (2, '2014-01-02', '01', 12, 0, 12);
INSERT INTO `barangmasuk` VALUES (3, '2014-01-05', '01', 13, 0, 13);
BUAT TRIGGER PADA PADA  TABLE BARANGKELUAR SEPERTI BERIKUT
DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `fifo`.`FIFO`$$
create trigger `fifo`.`FIFO` BEFORE INSERT on `fifo`.`barangkeluar`
for each row BEGIN
DECLARE JKELUAR INT;
DECLARE KODE CHAR(2);
SET JKELUAR=NEW.JUMLAH;
SET @ID=(SELECT KODE_TRANSAKSI FROM BARANGMASUK WHERE KODE_BRG=NEW.KODE_BRG AND TANGGAL=(SELECT TANGGAL FROM BARANGMASUK WHERE SISA>0 LIMIT 1) AND SISA>0 LIMIT 1);
SET @SISA=(SELECT SISA FROM BARANGMASUK WHERE KODE_TRANSAKSI=@ID);
SET @KODE=NEW.KODE_BRG;
REPEAT
IF(@SISA>JKELUAR) THEN
UPDATE BARANGMASUK SET SISA=@SISA-JKELUAR , KELUAR=KELUAR+JKELUAR WHERE KODE_TRANSAKSI=@ID;
SET JKELUAR=0;
END IF;
IF (@SISA<JKELUAR) THEN
UPDATE BARANGMASUK SET SISA=0,KELUAR=KELUAR+@SISA WHERE KODE_TRANSAKSI=@ID;
SET JKELUAR=JKELUAR-@SISA;
SET @ID=(SELECT KODE_TRANSAKSI FROM BARANGMASUK WHERE KODE_BRG=NEW.KODE_BRG AND TANGGAL=(SELECT TANGGAL FROM BARANGMASUK WHERE SISA>0 LIMIT 1) AND SISA>0 LIMIT 1);
SET @SISA=(SELECT SISA FROM BARANGMASUK WHERE KODE_TRANSAKSI=@ID);
END IF;
IF(@SISA=JKELUAR) THEN
UPDATE BARANGMASUK SET SISA=0,KELUAR=KELUAR+JKELUAR WHERE KODE_TRANSAKSI=@ID;
END IF;
UNTIL JKELUAR=0
END REPEAT;
END;
$$
DELIMITER ;
COBA TAMPILKAN DATA PADA TABEL BARANGMASUK.
mysql> SELECT*FROM BARANGMASUK;
+----------------+------------+----------+--------+-------+--------+------+
| KODE_TRANSAKSI | TANGGAL    | KODE_BRG | JUMLAH | HARGA | KELUAR | SISA |
+----------------+------------+----------+--------+-------+--------+------+
|              1 | 2014-01-01 | 01       |      5 |  5000 |      0 |    5 |
|              2 | 2014-01-02 | 01       |     12 |  6000 |      0 |   12 |
|              3 | 2014-01-05 | 01       |     13 |  6500 |      0 |   13 |
+----------------+------------+----------+--------+-------+--------+------+
3 rows in set (0.00 sec)
mysql> SELECT KODE_BRG,SUM(SISA) FROM BARANGMASUK GROUP BY KODE_BRG;
+----------+-----------+
| KODE_BRG | SUM(SISA) |
+----------+-----------+
| 01       |        30 |
+----------+-----------+
1 row in set (0.06 sec)
JIKA DIKELUARKAN 20 BARANG MAKA LOGIKANYA ADALAH 10 BARANG TANGGAL 1,12 BARANG TANGGAL 2 DAN 3 BARANG YANG DIBELI PADA TANGGAL 5.
SEHINGGA HARGANYA HARUS.
2014-01-01 | 01       |      5 |  5000 |     keluar= 5*5000    
     2014-01-02 | 01       |     12 |  6000 |     keluar=12*6000
     2014-01-05 | 01       |     13 |  6500 |     keluar 3*6500 sisa 10*6500
TOTAL ADALAH :20= 116500.

IMPEMENTASI
MASUKAN DATA PADA TABLE BARANGKELUAR
mysql> INSERT INTO BARANGKELUAR VALUES('','14/1/9','01',20);
Query OK, 1 row affected, 1 warning (0.23 sec)
mysql> SELECT*FROM BARANGKELUAR;
+----------------+------------+----------+--------+
| KODE_TRANSAKSI | TANGAL     | KODE_BRG | JUMLAH |
+----------------+------------+----------+--------+
|              3 | 2014-01-09 | 01       |     20 |
+----------------+------------+----------+--------+
1 row in set (0.00 sec).
COBA CHECK APAKAH SESUAI DENGAN METODE FIFO PADA TABLE BARANGMASUK.
mysql> SELECT*FROM BARANGMASUK;
+----------------+------------+----------+--------+-------+--------+------+
| KODE_TRANSAKSI | TANGGAL    | KODE_BRG | JUMLAH | HARGA | KELUAR | SISA |
+----------------+------------+----------+--------+-------+--------+------+
|              1 | 2014-01-01 | 01       |      5 |  5000 |      5 |    0 |
|              2 | 2014-01-02 | 01       |     12 |  6000 |     12 |    0 |
|              3 | 2014-01-05 | 01       |     13 |  6500 |      3 |   10 |
+----------------+------------+----------+--------+-------+--------+------+
3 rows in set (0.00 sec)
CARA HITUNG HARGA ADALAH DARI BARANG MASUK YAITU KELUAR * HARGA.
mysql> SELECT KODE_BRG,HARGA,KELUAR,HARGA*KELUAR FROM BARANGMASUK;
+----------+-------+--------+--------------+
| KODE_BRG | HARGA | KELUAR | HARGA*KELUAR |
+----------+-------+--------+--------------+
| 01       |  5000 |      5 |        25000 |
| 01       |  6000 |     12 |        72000 |
| 01       |  6500 |      3 |        19500 |
+----------+-------+--------+--------------+
3 rows in set (0.03 sec)
JIKA DITOTAL MAKA
mysql> SELECT SUM(HARGA*KELUAR) FROM BARANGMASUK GROUP BY KODE_BRG;
+-------------------+
| SUM(HARGA*KELUAR) |
+-------------------+
|            116500 |
+-------------------+
1 row in set (0.09 sec)
MENGETAHUI SISA BARANG
mysql> SELECT KODE_BRG,SISA ,HARGA,SISA*HARGA FROM BARANGMASUK WHERE KODE_BRG='01' AND SISA>0;
+----------+------+-------+------------+
| KODE_BRG | SISA | HARGA | SISA*HARGA |
+----------+------+-------+------------+
| 01       |   10 |  6500 |      65000 |
+----------+------+-------+------------+
1 row in set (0.00 sec)
SEKIAN TUTORIAL TENTANG METODE FIFO. TUTORIAL TERSEBUT MASIH PERLU BANYAK PENGEMBANGAN KARENA KETIKA BARANG KELUAR DIUPDATE ATAU DI DELETE BELUM DIBUAT TRIGGER YANG MENANGANI HAL TERSEBUT.




KODE LENGKAP DATABASE DAN TRINGGER
-- phpMyAdmin SQL Dump
-- version 2.10.2
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Aug 28, 2014 at 08:21 PM
-- Server version: 5.0.45
-- PHP Version: 5.2.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `fifo`
--

-- --------------------------------------------------------

--
-- Table structure for table `barangkeluar`
--

CREATE TABLE `barangkeluar` (
  `KODE_TRANSAKSI` int(11) NOT NULL auto_increment,
  `TANGAL` date default NULL,
  `KODE_BRG` char(2) default NULL,
  `JUMLAH` int(11) default NULL,
  PRIMARY KEY  (`KODE_TRANSAKSI`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `barangkeluar`
--

INSERT INTO `barangkeluar` VALUES (3, '2014-01-09', '01', 20);

-- --------------------------------------------------------

--
-- Table structure for table `barangmasuk`
--

CREATE TABLE `barangmasuk` (
  `KODE_TRANSAKSI` int(11) NOT NULL auto_increment,
  `TANGGAL` date default NULL,
  `KODE_BRG` char(2) NOT NULL,
  `JUMLAH` int(11) NOT NULL,
  `HARGA` int(11) default NULL,
  `KELUAR` int(11) NOT NULL,
  `SISA` int(11) NOT NULL,
  PRIMARY KEY  (`KODE_TRANSAKSI`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `barangmasuk`
--

INSERT INTO `barangmasuk` VALUES (1, '2014-01-01', '01', 5, 5000, 5, 0);
INSERT INTO `barangmasuk` VALUES (2, '2014-01-02', '01', 12, 6000, 12, 0);
INSERT INTO `barangmasuk` VALUES (3, '2014-01-05', '01', 13, 6500, 3, 10);

17 comments:

  1. wah baru baca blog yang ini hehe worked mas :D
    oiya mas kalo ada kondisi seperti ini
    contoh kasus : pembuatan peer
    1peer = 30cm dgn pesanan sebanyak 50peer / 1500cm
    kemudian dalam tabel_barangmasuk :
    jumlah/sisa :
    2014-01-01 sebanyak 1000cm
    2014-01-02 sebanyak 1000cm
    yang logikanya nanti kan 2014-01-01 mempunyai sisa 10cm dari(1000cm/30cm) yang menghasilkan 33peer kemudian,
    2014-01-02 1000cm - (50-33)peer
    1000cm - (17peer x 30cm)
    1000cm - 510cm
    sisa = 490cm
    apa tetap bisa mas? maaf sy masih newbie. boleh minta idline/pin/dll mas bila tdk berkeberatan?

    ReplyDelete
  2. Kok kadang looping gak ada hentinya, eror dimana ya?

    ReplyDelete
  3. Kalau data pada tabel BARANGKELUAR dihapus,
    Bagaimana cara mengembalikan lagi ke jumlah persediaan semua...
    Lieur hulu urang....

    ReplyDelete
  4. itu gak kurang di bagian
    IF(@SISA=JKELUAR) THEN ?

    harusnya ada
    SET JKELUAR=JKELUAR-@SISA;

    ReplyDelete
  5. Mohon bantuannya...
    saya sudah coba menggunakan prinsip FIFO di mysql...
    jika ada insert ke tabel penjualan, otomatis akan melakukan "trigger after insert" yang melakukan update ke tabel "pembelian" dan juga melakukan insert ke tabel "moving"...

    tabel "moving" isinya : adalah data penjualan yang ada harga belinya diambil dari tabel pembelian...

    FIFO sudah berjalan jika recordnya hanya puluhan...
    tapi eksekusi query berjalan sangat lama (beberapa jam) saat diaplikasikan pada data sekitar 200 ribuan... hal tersebut jadi tidak optimal...

    mungkin ada solusi lain...?
    Terimakasih...

    ReplyDelete
  6. mas cara input barang klo sdah beda barang kemudian kita inputkan lagi dan kita input barang keluar kok eror ya?? loading lama dan g jalan lagi,

    ReplyDelete
    Replies
    1. CEK LAGI DI LISTING INI BOSS,.. DI KONDISI JIKA SISA-JKELUAR BISA DITAMBAHI SET JKELUAR=0...

      IF(@SISA=JKELUAR) THEN
      UPDATE BARANGMASUK SET SISA=0,KELUAR=KELUAR+JKELUAR WHERE KODE_TRANSAKSI=@ID;
      SET JKELUAR=0;
      END IF;

      Delete
  7. SUWUN BOSSSSKU,.. ALHAMDULILLAH SUKSES....

    ReplyDelete
  8. Kalau data barangmasuk atau barang keluar di edit atau di hapus bagaimana?

    ReplyDelete
    Replies
    1. iyaa nih , kalo di delete / update trigger nya bagaimana ya ?

      Delete
  9. kalau ada 2 jenis barang keluar sekaligus, looping lama dan update barang ke dua tidak berhasil

    ReplyDelete
  10. bang.... saya masukkin trigger nya kok error ya? makasih

    ReplyDelete
    Replies
    1. ente cuman kopas kali gan, disesuaikan sama db dan tabel ente gan (tulis ulang aja trigernya)

      Delete
  11. tengs gan. tulisan ente 28 August 2014 masih bermanfaat sampe sekarang (28 september 2020) hehehe.. semoga Allah ngasih banyak pahala buat ente gan...

    ReplyDelete
  12. sedikit koreksi, pada SET @ID, lengkapnya seperti di bawah ini ::

    SET @ID=(
    SELECT
    KODE_TRANSAKSI
    FROM
    BARANGMASUK
    WHERE
    KODE_BRG = NEW.KODE_BRG
    AND TANGGAL = (SELECT TANGGAL FROM BARANGMASUK WHERE KODE_BRG = NEW.KODE_BRG AND SISA>0 LIMIT 1)
    AND SISA>0 LIMIT 1
    );

    koreksi ini untuk mengatasi penginputan barangkeluar yang lebih dari 1 record dengan kode barang yang berbeda

    ReplyDelete