Total Tayangan Halaman

Sabtu, 05 Juni 2010

Trigger dan Stored Procedure Peminjaman dan Pengembalian Pustaka

Dunia membuat program adalah sebuah seni tersendiri di dalam dunia komputer, karena komputer tidak akan berfungsi tanpa adanya perangkat lunak. Program-program tidak dapat dipisahkan dengan data, baik yang disimpan ke dalam variabel, senarai, objek, bahkan database. Kadang ada hal yang rumit yang dapat ditemukan pada saat melakukan pembuatan perangkat lunak. Tugas dari programmer software tersebut sebenarnya dapat diperingan apabila didukung/dibantu oleh programmer database yang handal.

Contoh kasus adalah tentang peminjaman dan pengembalian pustaka. Dengan adanya trigger, stored procedure dan stored function di bawah ini, programmer software tidak perlu memusingkan tentang bagaimana dia harus menangani peminjaman, pengembalian dan perpanjangan peminjaman. Cukup mengubah/menyisipkan data ke database saja, yang lain akan ditangani oleh database itu sendiri.

Untuk peminjaman:
Cukup menyisipkan baris dengan field yang terisi adalah kddetailpustaka (barcode pustaka), kdperson (peminjam) dan kdpetugaspinjam
(petugas perpustakaan)

Untuk perpanjangan:
Cukup mengganti field perpanjangan

Untuk penembalian:
Cukup mengisi field kdpetugaskembali (petugas penerima pengembalian pustaka)

struktur tabel:
USE simptt;

CREATE TABLE `simptt`.`pt_person`
(
`idperson` varchar(15) NOT NULL,
`kdperson` int(10) unsigned NOT NULL AUTO_INCREMENT,
`namalengkap` varchar(40) NOT NULL DEFAULT '',
`tempatlahir` varchar(40) NOT NULL,
`tgllahir` date NOT NULL,
`jeniskelamin` varchar(1) NOT NULL,
`kdagama` tinyint(4) NOT NULL,
`tglregistrasi` date NOT NULL,
`kdgrupperson` tinyint(4) NOT NULL,
`kdunitkerja` tinyint(4) NOT NULL,
`alamatlengkap` varchar(100) NOT NULL,
`kdpropkab` varchar(5) NOT NULL,
`notelp` varchar(13) NOT NULL,
`namaortu` varchar(40) NOT NULL,
`alamatortu` varchar(100) NOT NULL,
`notelportu` varchar(13) NOT NULL,
`kdpekerjaanortu` tinyint(4) NOT NULL,
`norekeningbank` varchar(20) NOT NULL DEFAULT '',
`kdbank` int(10) unsigned NOT NULL DEFAULT '0',
`npwp` varchar(30) NOT NULL DEFAULT '',
`sandi` varchar(32) NOT NULL DEFAULT '',
`nilaideposit` float NOT NULL DEFAULT '0',
`kdstatusperkawinan` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`kdperson`),
UNIQUE KEY `UNIK` (`idperson`)
)
ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 COMMENT='Master Person'

CREATE TABLE `simptt`.`lib_detailpustaka`
(
`kddetailpustaka` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Kode item/barang pustaka',
`kdpustaka` mediumint(8) unsigned NOT NULL COMMENT 'Pustaka (FK lib_masterpustaka)',
`kdinventaris` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Kode inventaris item/barang pustaka',
`tglbeli` date NOT NULL COMMENT 'Tanggal pembelian item/barang pustaka',
`hargabeli` double(7,1) unsigned NOT NULL COMMENT 'Harga pembelian item/barang pustaka',
`tglterbit` date DEFAULT NULL COMMENT 'Tanggal penerbitan item/barang pustaka, jika hanya diketahui tahun maka diisi 1 januari',
`kdrak` smallint(5) unsigned DEFAULT NULL COMMENT 'Rak penyimpanan (FK lib_rak)',
`kdstatusinv` tinyint(3) unsigned NOT NULL COMMENT 'Status inventaris (FK inv_statusinvent)',
`kdcaraperolehan` tinyint(3) unsigned NOT NULL COMMENT 'Cara memperoleh (FK inv_caraperolehan)',
`dipinjam` tinyint(1) DEFAULT '0' COMMENT 'false: tidak dipinjam, true: dipinjam',
PRIMARY KEY (`kddetailpustaka`),
KEY `FK1` (`kdpustaka`) USING BTREE,
KEY `FK2` (`kdrak`) USING BTREE,
KEY `FK3` (`kdstatusinv`) USING BTREE,
KEY `FK4` (`kdcaraperolehan`) USING BTREE
)
ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='Informasi pustaka per item/barang'

CREATE TABLE `simptt`.`lib_aturanpeminjaman`
(
`kdaturanpeminjaman` tinyint(3) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Kode aturan peminjaman pustaka',
`kdgrupperson` tinyint(3) unsigned NOT NULL COMMENT 'Grup peminjam (FK pt_grupperson)',
`kdjenispustaka` tinyint(3) unsigned NOT NULL COMMENT 'Kode jenis pustaka (FK lib_jenispustaka)',
`maxlamapinjam` tinyint(3) unsigned DEFAULT '0' COMMENT 'Maksimal lama pinjam (hari), 0 berarti tidak terbataas',
`maxjumlahpinjam` tinyint(3) unsigned DEFAULT '0' COMMENT 'Maksimal jumlah pinjam (hari), 0 berarti tidak terbatas',
`maxperpanjangan` tinyint(3) unsigned DEFAULT '0' COMMENT 'Maksimal perpanjangan (hari), 0 berarti tidak terbatas',
`denda` double unsigned NOT NULL COMMENT 'Besarnya denda keterlambatan',
PRIMARY KEY (`kdaturanpeminjaman`),
UNIQUE KEY `UNIK` (`kdgrupperson`,`kdjenispustaka`)
)
ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='Aturan yang digunakan pada peminjaman pustaka'

CREATE TABLE `simptt`.`pt_grupperson`
(
`kdgrupperson` tinyint(4) unsigned NOT NULL DEFAULT '0',
`grupperson` varchar(45) NOT NULL,
PRIMARY KEY (`kdgrupperson`)
)
ENGINE=MyISAM DEFAULT CHARSET=latin1 MAX_ROWS=20 ROW_FORMAT=FIXED

CREATE TABLE `simptt`.`lib_jenispustaka`
(
`kdjenispustaka` tinyint(3) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Kode jenis pustaka',
`jenispustaka` varchar(25) NOT NULL COMMENT 'Keterangan',
PRIMARY KEY (`kdjenispustaka`)
)
ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 MAX_ROWS=9 ROW_FORMAT=FIXED COMMENT='Jenis pustaka'

Trigger:
USE simptt;

DELIMITER $$

CREATE DEFINER = `root`@`localhost` TRIGGER `simptt`.`lib_peminjaman_set_tglharuskembali` BEFORE INSERT ON `lib_peminjaman` FOR EACH ROW BEGIN
DECLARE maxlamapinjam_ INTEGER;
DECLARE kdpustaka_ INTEGER;
DECLARE kdjenispustaka_ INTEGER;
DECLARE kdgrupperson_ INTEGER;
SET kdpustaka_ := (SELECT kdpustaka FROM lib_detailpustaka WHERE kddetailpustaka=NEW.kddetailpustaka LIMIT 0,1);
SET kdjenispustaka_ := (SELECT kdjenispustaka FROM lib_masterpustaka WHERE kdpustaka=kdpustaka_);
SET kdgrupperson_ := (SELECT kdgrupperson FROM lib_v_anggota_simpel WHERE kdperson=NEW.kdperson LIMIT 0,1);
SET NEW.tglpinjam := NOW();
SET maxlamapinjam_ := (SELECT IFNULL(maxlamapinjam, 0) as maxlamapinjam FROM lib_aturanpeminjaman WHERE kdjenispustaka=kdjenispustaka_ AND kdgrupperson=kdgrupperson_ LIMIT 0,1);
IF (maxlamapinjam_ IS NULL) THEN
SET maxlamapinjam_ := 0;
END IF;
IF (maxlamapinjam_ = 0) THEN
SET NEW.tglharuskembali := NULL;
ELSE
SET NEW.tglharuskembali := DATE_ADD(DATE(NOW()), INTERVAL maxlamapinjam_ DAY);
END IF;
SET NEW.kembali := FALSE;
UPDATE lib_detailpustaka SET dipinjam=TRUE WHERE kddetailpustaka=NEW.kddetailpustaka;
END $$

CREATE DEFINER = `root`@`localhost` TRIGGER `simptt`.`lib_peminjaman_set_denda` BEFORE UPDATE ON `lib_peminjaman` FOR EACH ROW BEGIN
DECLARE haritidakdidenda_ INTEGER;
DECLARE interval_ INTEGER;
DECLARE denda_ DOUBLE;
DECLARE maxperpanjangan_ TINYINT;
DECLARE maxlamapinjam_ TINYINT;
DECLARE kdpustaka_ INTEGER;
DECLARE kdjenispustaka_ INTEGER;
DECLARE kdgrupperson_ INTEGER;
IF NOT (OLD.tglharuskembali = DATE("0000-00-00") OR OLD.tglharuskembali IS NULL) THEN
SET kdpustaka_ := (SELECT kdpustaka FROM lib_detailpustaka WHERE kddetailpustaka=NEW.kddetailpustaka LIMIT 0,1);
SET kdjenispustaka_ := (SELECT kdjenispustaka FROM lib_masterpustaka WHERE kdpustaka=kdpustaka_);
SET kdgrupperson_ := (SELECT kdgrupperson FROM lib_v_anggota_simpel WHERE kdperson=NEW.kdperson LIMIT 0,1);
IF (NEW.perpanjangan != OLD.perpanjangan) THEN
SET maxperpanjangan_ := (SELECT IFNULL(maxperpanjangan, 0) as maxperpanjangan FROM lib_aturanpeminjaman WHERE kdjenispustaka=kdjenispustaka_ AND kdgrupperson=kdgrupperson_ LIMIT 0,1);
IF (maxperpanjangan_ IS NULL) THEN
SET maxperpanjangan_ := 0;
END IF;
IF ((NEW.perpanjangan > maxperpanjangan_) AND (maxperpanjangan_ > 0)) THEN
SET NEW.perpanjangan := maxperpanjangan_;
ELSE
SET maxlamapinjam_ := (SELECT IFNULL(maxlamapinjam, 0) as maxlamapinjam FROM lib_aturanpeminjaman WHERE kdjenispustaka=kdjenispustaka_ AND kdgrupperson=kdgrupperson_ LIMIT 0,1);
IF (maxlamapinjam_ IS NULL) THEN
SET maxlamapinjam_ := 0;
END IF;
SET interval_ := DATEDIFF(DATE(NOW()), NEW.tglharuskembali);
SET haritidakdidenda_ := (SELECT COUNT(tglnondenda) FROM lib_nondenda WHERE tglnondenda BETWEEN OLD.tglpinjam AND NEW.tglharuskembali);
IF (interval_ - haritidakdidenda_ > 0) THEN
SET denda_ := (SELECT IFNULL(denda, 0) as denda FROM lib_aturanpeminjaman WHERE kdjenispustaka=kdjenispustaka_ AND kdgrupperson=kdgrupperson_ LIMIT 0,1);
IF (denda_ IS NULL) THEN
SET denda_ := 0.0;
END IF;
IF (!((denda_ IS NULL) OR (denda_ = 0))) THEN
SET NEW.denda := OLD.denda + (interval_ * denda_);
END IF;
END IF;
SET NEW.tglharuskembali := DATE_ADD(DATE(NOW()), INTERVAL maxlamapinjam_ DAY);
END IF;
ELSE
IF (NEW.kdpetugaskembali IS NOT NULL) THEN
SET interval_ := DATEDIFF(DATE(NOW()), NEW.tglharuskembali);
SET haritidakdidenda_ := (SELECT COUNT(tglnondenda) FROM lib_nondenda WHERE tglnondenda BETWEEN OLD.tglpinjam AND NEW.tglharuskembali);
IF (interval_ - haritidakdidenda_ > 0) THEN
SET denda_ := (SELECT IFNULL(denda, 0) as denda FROM lib_aturanpeminjaman WHERE kdjenispustaka=kdjenispustaka_ AND kdgrupperson=kdgrupperson_ LIMIT 0,1);
IF (denda_ IS NULL) THEN
SET denda_ := 0.0;
END IF;
IF (!((denda_ IS NULL) OR (denda_ = 0))) THEN
SET NEW.denda := OLD.denda + (interval_ * denda_);
END IF;
END IF;
SET NEW.tglkembali:= NOW();
SET NEW.kembali := TRUE;
UPDATE lib_detailpustaka SET dipinjam=FALSE WHERE kddetailpustaka=OLD.kddetailpustaka;
END IF;
END IF;
ELSE
IF ((NEW.perpanjangan = OLD.perpanjangan) AND (NEW.kdpetugaskembali IS NOT NULL)) THEN
SET NEW.tglkembali := NOW();
SET NEW.kembali := TRUE;
UPDATE lib_detailpustaka SET dipinjam=FALSE WHERE kddetailpustaka=OLD.kddetailpustaka;
END IF;
END IF;
END $$

DELIMITER ;

function dan prosedur:
USE simptt;

DELIMITER $

CREATE DEFINER=`root`@`localhost` FUNCTION `lib_f_aturanpeminjaman_denda`() RETURNS double
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE denda_ DOUBLE;
SET denda_ := (SELECT IFNULL(denda, 0) as denda FROM lib_aturanpeminjaman WHERE kdjenispustaka=@kdjenispustaka AND kdgrupperson=@kdgrupperson LIMIT 0,1);
IF (denda_ IS NULL) THEN
SET denda_ := 0.0;
END IF;
RETURN denda_;
END$

CREATE DEFINER=`root`@`localhost` FUNCTION `lib_f_aturanpeminjaman_makslamapinjam`() RETURNS int(11)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE maxlamapinjam_ INTEGER;
SET maxlamapinjam_ := (SELECT IFNULL(maxlamapinjam, 0) as maxlamapinjam FROM lib_aturanpeminjaman WHERE kdjenispustaka=@kdjenispustaka AND kdgrupperson=@kdgrupperson LIMIT 0,1);
IF (maxlamapinjam_ IS NULL) THEN
SET maxlamapinjam_ := 0;
END IF;
RETURN maxlamapinjam_;
END$

CREATE DEFINER=`root`@`localhost` FUNCTION `lib_f_aturanpeminjaman_maksperpanjangan`() RETURNS int(11)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE maxperpanjangan_ INTEGER;
SET maxperpanjangan_ := (SELECT IFNULL(maxperpanjangan, 0) as maxperpanjangan FROM lib_aturanpeminjaman WHERE kdjenispustaka=@kdjenispustaka AND kdgrupperson=@kdgrupperson LIMIT 0,1);
IF (maxperpanjangan_ IS NULL) THEN
SET maxperpanjangan_ := 0;
END IF;
RETURN maxperpanjangan_;
END$$

DELIMITER ;

Tidak ada komentar: