Dalam membangun suatu aplikasi terkadang kita membutuhkan penomoran otomatis sebagai identitas atau nomor transaksi. Misal nomor invoice 0001/INV/USR/2014, nomor surat 1205/TU/15/2015 dan lain-lain.
Berikut tutorial sederhana bagaimana membuat penomoran otomatis pada PHP.
Buat tabel-tabel berikut :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
CREATE TABLE `trans` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `description` varchar(50) DEFAULT NULL, `reset` varchar(20) DEFAULT NULL, `format` varchar(50) DEFAULT NULL, `digit` tinyint(4) DEFAULT NULL PRIMARY KEY (`id`), UNIQUE KEY `UNIQUE` (`name`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; CREATE TABLE `trans_d` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `trans_id` int(11) DEFAULT NULL, `trans_name` varchar(20) DEFAULT NULL, `periode` varchar(8) DEFAULT NULL, `number` int(10) unsigned DEFAULT NULL, `lastid` varchar(50) DEFAULT NULL PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1; |
Penjelasan Tabel
Tabel trans :
- name : nama singkat jenis penomoran, harus unique.
- description : keterangan yang lebih lengkap dari jenis penomoran.
- reset : periode penomoran akan direset.
yearly,monthly,daily,all - format : format string dari penomoran yang akan dibentuk.
- {Y} : Year. mis. 2015
- {Y2} : Year 2 digit. mis. 15
- {RY} : Romanic year. mis. MMXV
- {RY2} : Romanic year. mis. XV
- {M} : Month. mis. 06
- {D} : Day. mis. 27
- {N} : Nomor urut penomoran
- digit : jumlah digit nomor urut. akan ditambahkan leading zero didepan nomor urut.
Tabel trans_d :
- trans_id : panret id dari jenis penomoran (
iddi tabeltrans) - trans_name : nama jenis penomoran (
namedi tabeltrans) - periode : periode penomoran, targantung dari jenis
resetdi tabeltrans. mis. 2015, 201506, 20150607 - number : nomor urut terakhir penomoran
- lastid : string penomoran terakhir yang digenerate. mis. 0001/INV/USR/2014
Cara Menggunakan
Pertama kali harus masukkan parameter utama di tabel trans. Misal akan membuat penomoran untuk Purchasing Order dengan periode bulanan dengan format 000005/PO/XV06.
|
1 |
INSERT INTO `trans` VALUES (null, 'PO', 'Purchasing Order', 'monthly', '{N}/PO/{RY2}{M}', 5); |
Pada tabel trans_d boleh kosong dulu karena memang belum ada penomoran transaksi yang terbentuk.
Untuk mendapaktkan format penomoran berdasarakan parameter tersebut diatas menggunakan kode php berikut:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
<?php function romanic_number($integer, $upcase = true) { $table = array('M'=>1000, 'CM'=>900, 'D'=>500, 'CD'=>400, 'C'=>100, 'XC'=>90, 'L'=>50, 'XL'=>40, 'X'=>10, 'IX'=>9, 'V'=>5, 'IV'=>4, 'I'=>1); $return = ''; while($integer > 0) { foreach($table as $rom=>$arb) { if($integer >= $arb) { $integer -= $arb; $return .= $rom; break; } } } return $return; } $vname = 'PO'; $db = new PDO('mysql:host=localhost;dbname=karyadb;charset=utf8', 'root', ''); $st = $db->prepare("SELECT * FROM `trans` WHERE name = :vname"); $st->execute(array(':vname'=>$vname)); $row = $st->fetch(); $st->closeCursor(); $year = date('Y'); $year2 = date('y'); $rmyear = romanic_number($year); $rmyear2 = romanic_number($year2); $month = date('m'); $day = date('d'); switch ($row['reset']){ case 'yearly' : $periode = $year; break; case 'monthly' : $periode = $year.$month; break; case 'daily' : $periode = $year.$month.$day; break; default : $periode = ''; break; } $st2 = $db->prepare("SELECT * FROM `trans_d` WHERE name = :vname and periode = :vperiode"); $st2->execute(array(':vname'=>$vname, ':vperiode'=>$periode)); $row2 = $st2->fetch(); if ($row2){ $number = $row2['number'] + 1; } else { $number = 1; } $seq = str_pad($number, $row['digit'], '0', STR_PAD_LEFT); $newnum = $row['format']; $format = array('{Y}','{Y2}','{RY}','{RY2}','{M}','{D}','{N}'); $replace = array($year,$year2,$rmyear,$rmyear2,$month,$day,$seq); $newnum = str_replace($format,$replace,$newnum); $st2->closeCursor(); var_dump($newnum); $db = 0; |
maka akan didapat variable $newnum = “00001/PO/XV06”. String ini lah yang digunakan sebagai nomor Purchasing Order.
Setelah menyimpan transaksi, jangan lupa mengupdate tabel trans_d dengan nilai terahir yg digunakan.
– trans_id = $row[‘id’];
– trans_name = $row[‘name’];
– periode = $periode;
– number= $number;
– lastid = $newnum;
sehingga ketika terjadi transaksi dengan jenis dan periode yang sama akan didapat nomor urut yang benar.
Ini hanya metode sederhana bagaimana membuat penomoran otomatis untuk transaksi. Mungin ada code yang kurang efisien dan efektif, silakan dikembangkan sesuai dengan kebutuhan masing-masing.
Salam.






Gan, Saya membuat penomoran otomatis untuk surat tapi keluarnya kok
string(24) “001/TC.01/IE-21/XII/2015”. Itu masalahnya apa ya? agar tulisan String(24) hilang.
Mohon Bantuannya….
line yg ini gan
—-
var_dump($newnum);
—-
cukup ambil variable $newnum nya aja, itu yg akan dipake sebagai nomor, var_dump hanya untu menampilkan ke layar, seperti echo()
Pak, klo diperkenankan saya minta script’nya dikirim ke email saya : [email protected]
terima kasih banyak
artikel keren saya bookmark gan, barakallah