Tuesday, 9 December 2025

Aplikasi Stok Barang Delhpi 7

 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

 

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

Saturday, 25 February 2023

Membuat Nomor Otomatis Reset Setiap Bulan Mysql

 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

 

 

Saturday, 11 June 2022

Proporsi Basis Panen dengan SQL

 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.

 
Dari Skema tabel diatas saya sederhanakan tabel menjadi 4 saja, Basis,Blok,Panen dan Pemanen. Tabel Panen menyimpan transaksi untuk Kegiatan panen harian yang memiliki relasi ke tabel Pemanen dan tabel Blok.
 
Selanjutnya Buat database dan tabel-tabelnya.
 
CREATE TABLE `basis` (
  `Topografi` enum('Bukit','Datar') NOT NULL,
  `Basis` decimal(4,0) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
CREATE TABLE `blok` (
  `idBlok` char(5) NOT NULL,
  `Luas` decimal(5,2) DEFAULT NULL,
  `JumlahPokok` decimal(5,0) DEFAULT NULL,
  `Topografi` enum('Bukit','Datar') DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
CREATE TABLE `pemanen` (
  `idPemanen` int(11) NOT NULL,
  `NamaPemanen` varchar(45) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
CREATE TABLE `panen` (
  `idPanen` int(11) NOT NULL,
  `Tanggal` date DEFAULT NULL,
  `idPemanen` int(11) NOT NULL,
  `idBlok` char(5) NOT NULL,
  `KgPanen` decimal(5,0) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 
Kemudain tambahkan data kedalam tabel yang sudah dibuat sebagai contoh dalam melakukan perhitungan proporsi basis panen.
 
INSERT INTO `basis` (`Topografi`, `Basis`) VALUES
('Bukit', '1280'),
('Datar', '1600');
 
INSERT INTO `blok` (`idBlok`, `Luas`, `JumlahPokok`, `Topografi`) VALUES
('G0007', '20.76', '2500', 'Bukit'),
('H0006', '27.70', '3006', 'Bukit'),
('H0007', '28.98', '4000', 'Datar'),
('J0005', '30.10', '4200', 'Datar');
 
INSERT INTO `pemanen` (`idPemanen`, `NamaPemanen`) VALUES
(1, 'Paijo Kusumo'),
(2, 'Harianto Ardi'),
(3, 'Andika Perkusu'),
(4, 'Wagiman King Kong');
 
INSERT INTO `panen` (`idPanen`, `Tanggal`, `idPemanen`, `idBlok`, `KgPanen`) VALUES
(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');

 
Buat Key dan constrainnya
 
ALTER TABLE `basis`
  ADD PRIMARY KEY (`Topografi`);

ALTER TABLE `blok`
  ADD PRIMARY KEY (`idBlok`),
  ADD KEY `fk_Blok_Basis1_idx` (`Topografi`);

ALTER TABLE `panen`
  ADD PRIMARY KEY (`idPanen`),
  ADD KEY `fk_Panen_Pemanen_copy1_idx` (`idPemanen`),
  ADD KEY `fk_Panen_Blok1_idx` (`idBlok`);

ALTER TABLE `pemanen`
  ADD PRIMARY KEY (`idPemanen`);

ALTER TABLE `panen`
  MODIFY `idPanen` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;

ALTER TABLE `blok`
  ADD CONSTRAINT `fk_Blok_Basis1` FOREIGN KEY (`Topografi`) REFERENCES `basis` (`Topografi`) ON DELETE NO ACTION ON UPDATE NO ACTION;

ALTER TABLE `panen`
  ADD CONSTRAINT `fk_Panen_Blok1` FOREIGN KEY (`idBlok`) REFERENCES `blok` (`idBlok`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_Panen_Pemanen_copy1` FOREIGN KEY (`idPemanen`) REFERENCES `pemanen` (`idPemanen`) ON DELETE NO ACTION ON UPDATE NO ACTION;


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 haril dari proporsi basis panen dengan implementasi menggunkan basis data. Dalam hal penyelesaian masalah tentang pembahasan kali ini adalah kemudahan dalam menggunakan basis data untuk melakukan perhitungan lebih efisien karena hanya dengan query dapat menghitung proporsi basis panen dalam range bulanan dan bahkan tahunan dengan satu perintah query.

Demikian terimakasih,

Salam Query.... Execute.