Hello temen-temen sekalian , pernah kepikiran membuat kartu stok dengan query pada table? Karena pernah dapat project kecil-kecilan tentang pembuatan aplikasi inventory dan diminta untuk menyedian fitur kartu stok. Kemudian saya cari referensi di google tapi ternyata bagus saya temukan di https://gist.github.com/hidayat365/39257b8cdfb650366cca0c561f062fb0
Namun menurut saya query tersebut sangat advan dan susah dipahami bagi pemula yang sedang belajar database bahkan saya pun agak pusing menerjemahkan query tersebut, heheh jujur saya ..dan kebiasaan saya adalah mencari jalan termudah. Tak sengaja saya menemukan union,eh saya coba-coba ternyata berhasil dan sesimpel itu.
Mulai kita design relasi table sbb:
Ini hasi sql nya.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
CREATE SCHEMA IF NOT EXISTS `Kartu_Stok` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `Kartu_Stok` ;
-- -----------------------------------------------------
-- Table `Kartu_Stok`.`Barang`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Kartu_Stok`.`Barang` ;
CREATE TABLE IF NOT EXISTS `Kartu_Stok`.`Barang` (
`idBarang` INT NOT NULL ,
`Nama_Barang` VARCHAR(45) NULL ,
PRIMARY KEY (`idBarang`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Kartu_Stok`.`Masuk`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Kartu_Stok`.`Masuk` ;
CREATE TABLE IF NOT EXISTS `Kartu_Stok`.`Masuk` (
`idMasuk` INT ZEROFILL NOT NULL AUTO_INCREMENT ,
`Tanggal` DATE NULL ,
`Barang_id` INT NOT NULL ,
`Jumlah` DECIMAL(10,2) NULL ,
PRIMARY KEY (`idMasuk`) ,
INDEX `fk_Masuk_Barang_idx` (`Barang_id` ASC) ,
CONSTRAINT `fk_Masuk_Barang`
FOREIGN KEY (`Barang_id` )
REFERENCES `Kartu_Stok`.`Barang` (`idBarang` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Kartu_Stok`.`Keluar`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Kartu_Stok`.`Keluar` ;
CREATE TABLE IF NOT EXISTS `Kartu_Stok`.`Keluar` (
`idKeluar` INT(5) ZEROFILL NOT NULL AUTO_INCREMENT ,
`Tanggal` DATE NULL ,
`Jumlah` DECIMAL(10,2) NULL ,
`Barang_id` INT NOT NULL ,
PRIMARY KEY (`idKeluar`) ,
INDEX `fk_Keluar_Barang1_idx` (`Barang_id` ASC) ,
CONSTRAINT `fk_Keluar_Barang1`
FOREIGN KEY (`Barang_id` )
REFERENCES `Kartu_Stok`.`Barang` (`idBarang` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
USE `Kartu_Stok` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
-- -----------------------------------------------------
-- Data for table `Kartu_Stok`.`Barang`
-- -----------------------------------------------------
START TRANSACTION;
USE `Kartu_Stok`;
INSERT INTO `Kartu_Stok`.`Barang` (`idBarang`, `Nama_Barang`) VALUES (001, 'Buku Tulis');
INSERT INTO `Kartu_Stok`.`Barang` (`idBarang`, `Nama_Barang`) VALUES (002, 'Pulpen');
COMMIT;
-- -----------------------------------------------------
-- Data for table `Kartu_Stok`.`Masuk`
-- -----------------------------------------------------
START TRANSACTION;
USE `Kartu_Stok`;
INSERT INTO `Kartu_Stok`.`Masuk` (`idMasuk`, `Tanggal`, `Barang_id`, `Jumlah`) VALUES (1, '2025-12-01', 001, 5);
INSERT INTO `Kartu_Stok`.`Masuk` (`idMasuk`, `Tanggal`, `Barang_id`, `Jumlah`) VALUES (2, '2025-12-10', 001, 10);
INSERT INTO `Kartu_Stok`.`Masuk` (`idMasuk`, `Tanggal`, `Barang_id`, `Jumlah`) VALUES (3, '2025-12-20', 001, 15);
COMMIT;
-- -----------------------------------------------------
-- Data for table `Kartu_Stok`.`Keluar`
-- -----------------------------------------------------
START TRANSACTION;
USE `Kartu_Stok`;
INSERT INTO `Kartu_Stok`.`Keluar` (`idKeluar`, `Tanggal`, `Jumlah`, `Barang_id`) VALUES (1, '2025-12-06', 2, 001);
INSERT INTO `Kartu_Stok`.`Keluar` (`idKeluar`, `Tanggal`, `Jumlah`, `Barang_id`) VALUES (2, '2025-12-06', 1, 001);
INSERT INTO `Kartu_Stok`.`Keluar` (`idKeluar`, `Tanggal`, `Jumlah`, `Barang_id`) VALUES (3, '2025-12-07', 2, 001);
INSERT INTO `Kartu_Stok`.`Keluar` (`idKeluar`, `Tanggal`, `Jumlah`, `Barang_id`) VALUES (4, '2025-12-16', 3, 001);
COMMIT;
Sekarang kita mulai buat Query Kartu Stok
Pertama kita coba buat query seperti berikut.
select tanggal,barang_id,jumlah,'Masuk' from masuk union select tanggal,barang_id,-jumlah ,'Keluar' from keluar and barang_id=1 order by tanggal
Dari fungsi union kita dapat menampilkan gabungan dari dua buah table yaitu table masuk dan keluar. Syaratnya hanya memiliki tipe colum yang sama missal 4 kolum di table ke 1 begitu juga 4 kolom juga ditabel yang ke 2 dengan data type yang sama.
Nah dari hasil query sudah bisa dilihat pergerakan data masuk dan keluar diurutkan sesuai tanggal. Kita tinggal menambahkan stok yang berjalan dengan melakukan select dari perintah select.
Contoh
select idbarang from (select *from barang) as t
Kita bisa melakukan select dari perintah query seperti diatas, dengan kasus ini saya buat dinamis variable stok seperti berikut.
set @j=0;
select tanggal,barang_id,Nama_Barang,jumlah,@j:=@j+jumlah as stok,Masuk as Tipe
from(
select tanggal,barang_id,nama_barang,jumlah,'Masuk' from masuk,barang where masuk.barang_id=barang.idbarang union
select tanggal,barang_id,Nama_Barang,-jumlah ,'Keluar' from keluar,barang
where keluar.barang_id=barang.idbarang and barang_id=1 order by tanggal) as t
Kemudian agar lebih mudah bisa dibuat store procedure
DELIMITER $$
DROP PROCEDURE IF EXISTS `kartu_stok`.`kartu_stok`$$
CREATE PROCEDURE `kartu_stok`.`kartu_stok`(id int)
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
set @j=0;
select tanggal,barang_id,Nama_Barang,jumlah,@j:=@j+jumlah as stok,Masuk as Tipe
from(
select tanggal,barang_id,nama_barang,jumlah,'Masuk' from masuk,barang where masuk.barang_id=barang.idbarang union
select tanggal,barang_id,Nama_Barang,-jumlah ,'Keluar' from keluar,barang
where keluar.barang_id=barang.idbarang and barang_id=id order by tanggal) as t ;
END$$
DELIMITER ;
Tinggal panggil procedure dengan mamasukan parameter idbarang
Demikian terimakasih, salam alumni akakom 2013 Angkatan 2009
No comments:
Post a Comment