Pada sistem manajemen surat atau dokumen, sering kali kita membutuhkan format nomor yang mengikuti pola tertentu. Misalnya untuk contoh berikut:
0002/SKS-2/VIII/HOL/2025
Format di atas memiliki struktur:
- 0002 → Nomor urut 4 digit (reset tiap tahun)
- /SKS-2/ → Kode seri tetap
- VIII → Bulan dalam angka Romawi
- /HOL/ → Kode tambahan tetap
- 2025 → Tahun
1. Metode ELT (Singkat & Ringkas)
ELT() di MySQL digunakan untuk memilih nilai dari daftar berdasarkan posisi indeks.
Metode ini membuat mapping bulan menjadi angka Romawi lebih ringkas.
SELECT CONCAT(
LPAD(IFNULL(MAX(CAST(SUBSTRING_INDEX(no_surat,'/',1) AS UNSIGNED)),0)+1,4,'0'),
'/SKS-2/',
ELT(MONTH(CURDATE()),'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'),
'/HOL/',
YEAR(CURDATE())
) AS next_no_surat
FROM suratsakitpihak2
WHERE YEAR(tanggalawal) = YEAR(CURDATE());
Kelebihan:
- Kode lebih pendek dan mudah dibaca
- Mapping bulan ke Romawi langsung di satu fungsi
Kekurangan:
- Kurang fleksibel jika ingin mengganti mapping bulan secara dinamis
2. Metode CASE (Lebih Panjang & Fleksibel)
Metode ini menggunakan CASE WHEN untuk mengubah angka bulan menjadi angka Romawi.
SELECT CONCAT(
LPAD(IFNULL(MAX(CONVERT(SUBSTRING_INDEX(no_surat, '/', 1), SIGNED)),0)+1,4,'0'),
'/SKS-2/',
CASE MONTH(CURDATE())
WHEN 1 THEN 'I' WHEN 2 THEN 'II' WHEN 3 THEN 'III'
WHEN 4 THEN 'IV' WHEN 5 THEN 'V' WHEN 6 THEN 'VI'
WHEN 7 THEN 'VII' WHEN 8 THEN 'VIII' WHEN 9 THEN 'IX'
WHEN 10 THEN 'X' WHEN 11 THEN 'XI' WHEN 12 THEN 'XII'
END,
'/HOL/',
YEAR(CURDATE())
) AS next_no_surat
FROM suratsakitpihak2
WHERE YEAR(tanggalawal) = YEAR(CURDATE());
Kelebihan:
- Fleksibel untuk menambahkan logika lain di setiap bulan
- Mudah dipahami bagi yang baru belajar SQL
Kekurangan:
- Kode lebih panjang
Hasil Kedua Metode
Jika data terakhir untuk tahun berjalan adalah:
0001/SKS-2/VIII/HOL/2025
Maka query akan menghasilkan:
0002/SKS-2/VIII/HOL/2025
Nomor urut akan otomatis bertambah setiap kali ada data baru, dan akan reset kembali menjadi 0001 saat tahun berganti.
Kesimpulan
Metode ELT lebih singkat dan efisien, cocok untuk kebutuhan sederhana. Metode CASE lebih panjang tetapi fleksibel jika format bulan ingin dimodifikasi. Pilih metode yang sesuai dengan kebutuhan sistem Anda.
Penerapan untuk di SIMRS Khanza atau di java, bisa gunakan seperti ini
String AutoNumber = Sequel.cariIsi("SELECT CONCAT(YEAR(CURDATE()),'RSUH/SKS-2/',CASE MONTH(CURDATE()) WHEN 1 THEN 'I' WHEN 2 THEN 'II' WHEN 3 THEN 'III' WHEN 4 THEN 'IV' WHEN 5 THEN 'V' WHEN 6 THEN 'VI' WHEN 7 THEN 'VII' WHEN 8 THEN 'VIII' WHEN 9 THEN 'IX' WHEN 10 THEN 'X' WHEN 11 THEN 'XI' WHEN 12 THEN 'XII' END,'/',LPAD(IFNULL(MAX(CONVERT(SUBSTRING_INDEX(no_surat, '/', -1), SIGNED)),0)+1,4,'0')) AS next_no_surat FROM suratsakitpihak2 WHERE YEAR(tanggalawal) = YEAR(CURDATE())");
String AutoNumber = Sequel.cariIsi(
"SELECT CONCAT(LPAD(IFNULL(MAX(CAST(SUBSTRING_INDEX(no_surat,'/',1) AS UNSIGNED)),0)+1,4,'0'),'/SKS-2/',ELT(MONTH(CURDATE()),'I','II','III','IV','V','VI','VII','VIII','IX','X','XI','XII'),'/HOL/',YEAR(CURDATE())) FROM suratsakitpihak2 WHERE YEAR(tanggalawal)=YEAR(CURDATE())"
);