Hello,
Ini saya bagikan aplikasi stok barang yang saya buat tahun 2017 lalu kalau saja ada yang perlu dan mau didevelop lagi juga boleh , bebas..
silahkan download Klik
Hello,
Ini saya bagikan aplikasi stok barang yang saya buat tahun 2017 lalu kalau saja ada yang perlu dan mau didevelop lagi juga boleh , bebas..
silahkan download Klik
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
Dasar Permasalahan
Mysql sudah menyedian auto number dengan auto_increment nya, namun nomor otomatis yang disediakan mysql ini sangat sederhana terkadang tidak sesuai dengan kebutuhan yang kita inginkan.
suatu saat kita membutuhkan nomor otomatis berdasarkan bulan misal
PO-202008-001
PO-202008-002
PO-202008-003
PO-202009-001
PO-202009-002
dst
Dengan fitur yang disediakan mysql tentu tidak akan tergenerate nomor otomatis seperti demikian, oleh karena itu perlu adanya modifikasi dari auto increment pada table mysl.
Solusi.
Buat tabel dengan nama Nomor yang digunakan untuk menanmpung nomor otomatis pada setiap table .
CREATE TABLE IF NOT EXISTS `Nomor` (
`tabel` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
`bulan` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`tabel`,bulan,`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Tabel Nomor memiliki kombinasi key dari beberapa field yaitu tabel,id,dan bulan. kemudian buat table Orders seperti berikut.
CREATE TABLE `orders` (
`id` char(20) NOT NULL,
`tanggal` date DEFAULT NULL,
`suplier` char(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Kemudian yang perlu kita lakukan adalah membuat trigger pada table orders tersebut untuk set nilai id dari query pada tabel nomor.
DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `post`.`set_No`$$
create trigger `post`.`set_No` BEFORE INSERT on `post`.`orders`
for each row BEGIN
insert into nomor (tabel,bulan) values('PO',EXTRACT(YEAR_MONTH FROM NEW.TANGGAL));
SET NEW.ID=(SELECT CONCAT(TABEL,'-',EXTRACT(YEAR_MONTH FROM NEW.TANGGAL),'-',LPAD(ID,3,'0'))
FROM NOMOR WHERE TABEL='PO' AND
ID=(SELECT MAX(ID)FROM NOMOR where bulan=EXTRACT(YEAR_MONTH FROM NEW.TANGGAL)) and
bulan=EXTRACT(YEAR_MONTH FROM NEW.TANGGAL) );
END;
$$
DELIMITER ;
Id pada tabel orders merupakan kombinasi dari dengan fungsi penggabungan concat pada mysql yaitu id tabel orders dengan nomor PO dikombinasikan dengan bulan sesuai dengan bulan yang diambil dari tanggal yang diinnpukan dikombinasikan lagi dengan auto increment pada tabel nomor.
Testing .......
INSERT INTO `orders` (`id`, `tanggal`, `suplier`) VALUES ('', '2023-02-01', NULL), ('', '2023-02-01', NULL);
INSERT INTO `orders` (`id`, `tanggal`, `suplier`) VALUES ('', '2023-02-02', 'agus'), ('', '2023-02-02', 'jono');
INSERT INTO `orders` (`id`, `tanggal`, `suplier`) VALUES ('', '2023-03-09', 'baran'), ('', '2023-03-10', 'yono');
hasilnya seperti berikut.
mysql> select*from orders order by tanggal;
+---------------+------------+---------+
| id | tanggal | suplier |
+---------------+------------+---------+
| PO-202302-001 | 2023-02-01 | NULL |
| PO-202302-002 | 2023-02-01 | NULL |
| PO-202302-003 | 2023-02-02 | agus |
| PO-202302-004 | 2023-02-02 | jono |
| PO-202303-001 | 2023-03-09 | baran |
| PO-202303-002 | 2023-03-10 | yono |
+---------------+------------+---------+
6 rows in set (0.00 sec)
Semoga bermanfaat dan menjadi amal jariyah
Salam Query execute
Bertemu lagi dengan blog yang sudah lama tidak ada postingan, mungkin semua pengunjung blog saya mengira blog ini sudah mati, tidak demikian kawan-kawanku hanya saja tidak ada waktu untuk menulis alias sibuk bekerja dan momong anak yang sudah mulai lucu-lucunya.
Pada kesemptan kali ini saya posting tentang dunia kerja diperkebunan tentang proporsi basis panen yang terlihat sederhana perhitungannya namun akan sedikit rumit jika menggunakan atau diimplementasikan dalam basis data.
Kenapa harus diimplementasikan dalam basis data, karena sesungguhnya perhitungan itu dilakukan oleh system basis data entah apapun itu softwarenya. Dengan basis data akan mempermudah untuk melakukan query dalam melakukan perhitungan global secara cepat. Padahal hal ini juga dapat dilakukan perhitungan manual dengan softare ms excel namun akan rumit jika data yang akan dikalkulasi terdapat beberapa pemanen dan tanggal yang akan diproporsi.
Berikut adalah gambaran proporsi basis banen.
Pertama mari desain secara sederhana ERD untuk sistem basis data yang akan kita rancang untuk implementasi Proporsi Basis panen tersebut.
Berikut gambarnya.
Selanjutnya lihat isi dari masing-masing tabel yang sudah dibuat sebelumnya.
Setting environment for using XAMPP for Windows.
ProgrammerAmatir@DESKTOP-EF1HF32 c:\xampp
# mysql -uroot
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 335
Server version: 10.4.17-MariaDB mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use premipanen
Database changed
MariaDB [premipanen]> select*from basis;
+-----------+-------+
| Topografi | Basis |
+-----------+-------+
| Bukit | 1280 |
| Datar | 1600 |
+-----------+-------+
2 rows in set (0.001 sec)
MariaDB [premipanen]> select*from blok;
+--------+-------+-------------+-----------+
| idBlok | Luas | JumlahPokok | Topografi |
+--------+-------+-------------+-----------+
| G0007 | 20.76 | 2500 | Bukit |
| H0006 | 27.70 | 3006 | Bukit |
| H0007 | 28.98 | 4000 | Datar |
| J0005 | 30.10 | 4200 | Datar |
+--------+-------+-------------+-----------+
4 rows in set (0.001 sec)
MariaDB [premipanen]> select*from pemanen;
+-----------+-------------------+
| idPemanen | NamaPemanen |
+-----------+-------------------+
| 1 | Paijo Kusumo |
| 2 | Harianto Ardi |
| 3 | Andika Perkusu |
| 4 | Wagiman King Kong |
+-----------+-------------------+
4 rows in set (0.001 sec)
MariaDB [premipanen]> select*from panen;
+---------+------------+-----------+--------+---------+
| idPanen | Tanggal | idPemanen | idBlok | KgPanen |
+---------+------------+-----------+--------+---------+
| 1 | 2022-06-11 | 3 | G0007 | 700 |
| 2 | 2022-06-11 | 3 | H0007 | 900 |
| 3 | 2022-06-12 | 4 | G0007 | 350 |
| 4 | 2022-06-12 | 4 | H0006 | 400 |
| 5 | 2022-06-12 | 4 | H0007 | 250 |
| 6 | 2022-06-12 | 4 | J0005 | 450 |
+---------+------------+-----------+--------+---------+
6 rows in set (0.001 sec)
MariaDB [premipanen]>
Semua tabel telah terisi dengan data yang akan digunakan untuk simulasi proporsi basis panen.
Beberapa yang harus dipahami untuk dapat melakukan proporsi ini adalah,
1. Fungsi Agregate
2. Mysql Over dan partition (fungi yang ada pada mysql/mariadb)
3. Bahasa query (SQL)
4. Nalar Berpikir (wajib)
Pertama, mari coba cari basis panen perblok terlebih dahulu dengan perintah sql seperti berikut ini.
MariaDB [premipanen]> SELECT PANEN.TANGGAL,pemanen.NamaPemanen,BLOK.IDBLOK,Blok.topografi
-> ,panen.kgpanen,basis.basis
-> FROM
-> PANEN,BASIS,BLOK,PEMANEN
-> WHERE BLOK.Topografi=BASIS.TOPOGRAFI
-> AND PANEN.IDBLOK=BLOK.IDBLOK
-> AND PANEN.IDPEMANEN=PEMANEN.IDPEMANEN group by panen.tanggal,panen.idpemanen,blok.idblok
-> ;
+------------+-------------------+--------+-----------+---------+-------+
| TANGGAL | NamaPemanen | IDBLOK | topografi | kgpanen | basis |
+------------+-------------------+--------+-----------+---------+-------+
| 2022-06-11 | Andika Perkusu | G0007 | Bukit | 700 | 1280 |
| 2022-06-11 | Andika Perkusu | H0007 | Datar | 900 | 1600 |
| 2022-06-12 | Wagiman King Kong | G0007 | Bukit | 350 | 1280 |
| 2022-06-12 | Wagiman King Kong | H0006 | Bukit | 400 | 1280 |
| 2022-06-12 | Wagiman King Kong | H0007 | Datar | 250 | 1600 |
| 2022-06-12 | Wagiman King Kong | J0005 | Datar | 450 | 1600 |
+------------+-------------------+--------+-----------+---------+-------+
6 rows in set (0.001 sec)
MariaDB [premipanen]>
Dari query diatas terlihat basis panen pada setiap blok yang dipanen oleh masing-masing pemanen pada tanggl 11 dan 12 juni 2022.
Sekarang lihat perhitungan proprosi basis panen dengan menggunakan perintah SQL sesuai dengan kebutuhan yang harus dipahami diatas (point 1-4).
MariaDB [premipanen]> SELECT PANEN.TANGGAL,pemanen.NamaPemanen,BLOK.IDBLOK,Blok.topografi
-> ,panen.kgpanen,basis.basis,sum(kgPanen) over(partition by tanggal,idpemanen)Kgtotalt,panen.kgpanen/basis.basis as PersenProporsi,
-> (panen.kgpanen/basis.basis)/sum(panen.kgpanen/basis.basis)over(partition by tanggal,idpemanen) persentcapai,
-> (panen.kgpanen/basis.basis)/sum(panen.kgpanen/basis.basis)over(partition by tanggal,idpemanen)*basis.basis as basispanen,
-> panen.kgpanen-((panen.kgpanen/basis.basis)/sum(panen.kgpanen/basis.basis)over(partition by tanggal,idpemanen)*basis.basis) as lebihbasis
-> FROM
-> PANEN,BASIS,BLOK,PEMANEN
-> WHERE BLOK.Topografi=BASIS.TOPOGRAFI
-> AND PANEN.IDBLOK=BLOK.IDBLOK
-> AND PANEN.IDPEMANEN=PEMANEN.IDPEMANEN group by panen.tanggal,panen.idpemanen,blok.idblok
Dari query tersebut akan menghasilkan output seperti gambar berikut.
Demikian terimakasih,
Salam Query.... Execute.