Sunday, 7 December 2025

Membuat Kartu Stok Dengan Mysql

 

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

Top of Form

Bottom of Form

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