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);
wah baru baca blog yang ini hehe worked mas :D
ReplyDeleteoiya 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?
Kok kadang looping gak ada hentinya, eror dimana ya?
ReplyDeleteMantap pak thanks!!!
ReplyDeleteKalau data pada tabel BARANGKELUAR dihapus,
ReplyDeleteBagaimana cara mengembalikan lagi ke jumlah persediaan semua...
Lieur hulu urang....
itu gak kurang di bagian
ReplyDeleteIF(@SISA=JKELUAR) THEN ?
harusnya ada
SET JKELUAR=JKELUAR-@SISA;
Mohon bantuannya...
ReplyDeletesaya 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...
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,
ReplyDeleteCEK LAGI DI LISTING INI BOSS,.. DI KONDISI JIKA SISA-JKELUAR BISA DITAMBAHI SET JKELUAR=0...
DeleteIF(@SISA=JKELUAR) THEN
UPDATE BARANGMASUK SET SISA=0,KELUAR=KELUAR+JKELUAR WHERE KODE_TRANSAKSI=@ID;
SET JKELUAR=0;
END IF;
SUWUN BOSSSSKU,.. ALHAMDULILLAH SUKSES....
ReplyDeleteKalau data barangmasuk atau barang keluar di edit atau di hapus bagaimana?
ReplyDeleteiyaa nih , kalo di delete / update trigger nya bagaimana ya ?
Deletekalau ada 2 jenis barang keluar sekaligus, looping lama dan update barang ke dua tidak berhasil
ReplyDeletebang.... saya masukkin trigger nya kok error ya? makasih
ReplyDeleteente cuman kopas kali gan, disesuaikan sama db dan tabel ente gan (tulis ulang aja trigernya)
Deletetengs gan. tulisan ente 28 August 2014 masih bermanfaat sampe sekarang (28 september 2020) hehehe.. semoga Allah ngasih banyak pahala buat ente gan...
ReplyDeleteMas apa sudah bisa...
Deletesedikit koreksi, pada SET @ID, lengkapnya seperti di bawah ini ::
ReplyDeleteSET @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