Membuat Format Nomor Surat Otomatis di MySQL di Java | SIMRS Khanza

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:

  1. 0002 → Nomor urut 4 digit (reset tiap tahun)
  2. /SKS-2/ → Kode seri tetap
  3. VIII → Bulan dalam angka Romawi
  4. /HOL/ → Kode tambahan tetap
  5. 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())"
  );

إرسال تعليق