Data penjualan dari 10 sample barang pada toserba Ainun mart selama tahun 2014 dan 2015 menunjukkan bahwa pola penjualannya acak. Pola penjualan yang acak dapat diramalkan dengan menggunakan metode
16
moving average. Sehingga dalam penelitian ini, digunakan metode simple moving average untuk meramalkan pengadaan stok.
Metode simple moving average yang digunakan dalam penelitian ini menggunakan n = 3. Penggunaan n yang kecil untuk meningkatkan keakuratan karena berhubungan dengan faktor-faktor kejadian terdekat yang dapat mempengaruhi peramalan. Dalam penelitian ini, dicoba juga kedalam beberapa variasi pemodelan data yang baru dengan metode simple moving average.
Variasi pemodelan data yang baru dibuat untuk memenuhi kemungkinan jika pola data suatu barang memiliki pola yang sama setiap tahunnya. Variasi dibagi menjadi 3 yaitu variasi 1, variasi 2 dan variasi 3. Inti dari variasi pemodelan data yang baru adalah sama, yaitu peramalan menggunakan data yang telah ditentukan dari tahun sebelumnya untuk dirata-rata sehingga dapat memperkirakan data yang baru. Yang membedakan dari ketiga variasi adalah target dari peramalan. Contoh data yang diambil adalah data bulan 1, 2, dan 3 pada tahun 2014, kemudian dirata-rata. Target dari variasi 1 adalah bulan 1 tahun 2015, target dari variasi 2 adalah bulan 2 tahun 2015 dan target dari variasi 3 adalah bulan 3 tahun 2015.
3.4Fase Implementasi 3.4.1 Manajemen data
1. Perancangan Konseptual
Sistem pendukung pengambilan keputusan memiliki 3 entitas, antara lain : entitas kategori barang, entitas penjualan, entitas prediksi. Entitas kategori barang memilik relasi dengan entitas penjualan, sedangkan entitas prediksi tidak mempunyai relasi dengan entitas lain.
a. Entitas Barang
Entitas barang menyimpan data yang berkaitan dengan kriteria khusus mengenai kode barang dan nama barang. Entitas ini dibuat untuk mengelompokkan barang sesuai kriterianya.
17 b. Entitas Penjualan
Entitas Penjualan menyimpan data yang berkaitan dengan transaksi penjualan berupa kode penjualan. Dalam proses peramalan, data pada entitas ini dibutuhkan untuk menghitung peramalan.
c. Entitas Peramalan
Entitas Peramalan menyimpan data yang berkaitan dengan peramalan barang mengenai data penjualan dan hasil peramalannya. Entitas peramalan merupakan sebuah entitas untuk membantu dalam proses penghitungan peramalan.
BarangAinun PenjualanAinun
BarangPredik
memiliki
KodeBarang NamaBarang KodePenjualan
Jumlah no Penjualan Prediksi N 1 Gambar 3.1 : ER Diagram 2. Perancangan Logikal BarangAinun -KodeBarang : varchar(20) PK -NamaBarang : varchar(20) Penjualan Ainun -KodePenjualan : varchar(20) PK -jumlah : number
18 BarangPredik -No : number -Penjualan : number -Prediksi : number 3. Perancangan Fisikal
Nama Field Tipe Data Lebar Keterangan KodeBarang varchar 20 kode barang yang
dijual di toserba Ainun.
NamaBarang varchar 20 nama dari barang Tabel 3.1 Barang (BarangAinun)
Nama Field Tipe Data Lebar Keterangan KodePenjualan varchar 20 kode penjualan
selama 1 bulan KodeBarang number - kode dari barang
yang terjual Jumlah number - jumlah penjualan
selama 1 bulan Tabel 3.2 Penjualan (PenjualanAinun)
Nama Field Tipe Data Lebar Keterangan No number - nomor dari prediksi Penjualan number - data penjualan
Prediksi number - hasil dari peramalan Tabel 3.3 Peramalan (BarangPredik)
19 3.4.2 Manajemen Model 1. Usecase diagram a. Software Tester user
System
Setting mode Peramalan Setting Target Peramalan Lihat hasil Peramalan Input Data PenjualanGambar 3.2 : Use Case Diagram Software Tester b. Software User user
System
Lihat Kategori Barang Setting Target Peramalan Lihat hasil Peramalan Input Data Penjualan20 2. Class Diagram a. Software Tester +CatatPredik() +CariSelisih() +CariSelisih1() +CariSelisih2() +CariSelisih3() +CariPredik1() +CariPredik2() +CariPredik3() -No -Penjualan -Prediksi BarangPredik
Gambar 3.4 : Class Diagram Software Tester b. Software User +CatatPredik() +CariSelisih() +CariSelisih1() +CariSelisih2() +CariSelisih3() +CariPredik1() +CariPredik2() +CariPredik3() -No -Penjualan -Prediksi BarangPredik +CariBarangPrepared() +LihatSeluruhBarang() -KodeBarang -NamaBarang BarangAinun +CariData() -KodePenjualan -KodeBarang -Jumlah PenjualanAinun
21 3. Sequence diagram
a. Software Tester
SimulasiTest simulasiClass SimulasiKontrol simulasiDB MA
User ActionEvent
1 : Masukkan data()
2 : ButtonPredikActionPerformed()
3 : simpan data()
4 : simpan bulan()
5 : simpan nama bulan()
6 : simpan tahun() 7 : simpan vasriasi() 8 : hitungMA() 9 : ambil data() 10 : getAvg() 11 : hasil prediksi() 12 : catatPredik() 13 : kembali() 14 : mape() 15 : cariPredik() 16 : data Prediksi() 17 : cariSelisih() 18 : hasil MAPE() 19 : simpan hasil() 20 : tampil hasil()
22 b. Software User
UserFrame UserClass UserKontrol UserDB MA
user Action Event
1 : Masukkan data()
2 : ButtonPredictActionPerformed()
3 : simpan kode barang() 4 : simpan nama barang() 5 : simpan bulan() 6 : simpan nama bulan()
7 : simpan tahun() 8 : hitungMA() 9 : cariData() 10 : data penjualan() 11 : getAvg() 12 : hasil prediksi() 13 : catatPredik() 14 : kembali() 15 : mapeNormal() 16 : cariSelisih() 17 : hasil MAPE() 18 : kembali() 19 : mapeVar1() 20 : cariPredik1() 21 : data Prediksi() 22 : cariSelisih1() 23 : hasil MAPE() 24 : kembali() 25 : mapeVar2() 26 : cariPredik2() 27 : data Prediksi() 28 : cariSelisih2() 29 : hasil MAPE() 30 : kembali() 31 : mapeVar3() 32 : cariPredik3() 33 : data Prediksi() 34 : cariSelisih3() 35 : hasil MAPE() 36 : simpanhasil() 37 : tampil hasil()
23 4. Activity diagram
a. Software Tester
Halaman SimulasiTest
masukkan data
klik Button Prediksi hitungMA mapeNormal mode=normal else mode = Variasi 1
Sistem
User
hitungMA mapeVar1 else mode = Variasi 2 hitungMA mapeVar2 else mode = Variasi 3 hitungMA mapeVar3 tampil hasil24 b. Software User
Halaman SimulasiTest
masukkan data
klik Button Prediksi hitungMA mapeNormal
Sistem User
mapeVar1
mapeVar2
mapeVar3 cari MAPE terendah
Tampil hasil
Gambar 3.9 : Activity Diagram Software User 3.4.3 Manajemen dialog
1. Tampilan Software Tester
Mode Prediksi
Target Prediksi Bulan Tahun n Bulan
Prediksi Batal Keluar
Tahun Januari Februari Maret April Mei Juni Juli Agustus September Oktober November Desember Tahun Januari Februari Maret April Mei Juni Juli Agustus September Oktober November Desember
25 2. Tampilan Software User
SPPK Pengadaan Stok Barang Kode Barang Nama Barang Bulan Tahun Prediksi Batal Close Hasil Prediksi
Kode Barang Nama Barang
26 BAB IV
FASE IMPLEMENTASI
4.1Manajemen Data
Langkah pertama dalam mengimplementasikan program yang telah dirancang sebelumnya adalah membuat database. Database dibuat untuk menampung data yang akan dipakai atau telah dihasilkan oleh sistem kedalam tabel untuk disimpan sebagai record. Tabel yang dibuat ada 3 yaitu :
1. Tabel BarangAinun
Gambar 4.1 : Tabel BarangAinun
Gambar 4.1, merupakan tabel dari BarangAinun beserta keterangannya. Tabel BarangAinun merupakan tabel dummy dari tabel barang di ainun mart. Tabel ini berisi data barang apa saja yang dijual oleh ainin mart. Tabel ini hanya memilik 2 kolom yaitu kolom kodeKategori(PK) dan namaKategori karena dalam sistem yang dibuat hanya membutuhkan 2 kolom tersebut.
2. Tabel PenjualanAinun
Gambar 4.2 : Tabel PenjualanAinun
Gambar 4.2 diatas, merupakan table dari PenjualanAinun beserta keterangannya. Tabel PenjualanAinun merupakan tabel dummy dari tabel penjualan bulanan di ainun mart. Tabel ini berisi data penjualan bulanan barang ainun mart yang dikategorikan per barang dan per bulan. Tabel memiliki 3 kolom, yaitu kolom kodePenjualan(PK), kodeBarang dan jumlah.
27 3. Tabel BarangPredik
Gambar 4.3 : Tabel BarangPredik
Gambar 4.3 diatas, merupakan table dari BarangPredik beserta keterangannya. Tabel BarangPredik merupakan tabel bantu untuk program yang telah dibuat. Fungsi dari tabel ini adalah menyimpan sementara data penjualan dan hasil prediksi untuk mempermudah penghitungan MAPE. Tabel ini memiliki 3 kolom, yaitu kolom no, penjualan, prediksi.
4.2Manajemen Model 4.2.1 Software Tester
Berikut adalah fungsi-fungsi dan tahapan-tahapan peramalan pada software tester :
1. Button Prediksi
Merupakan sebuah tombol untuk melakukan prediksi dari data- data yang telah dimasukkan. Pada tombol prediksi dibagi menjadi 3 kondisi sesuai dengan mode peramalan yang telah dipilih sebelumnya. Langkah fungsi buttonPrediksi() dalam melakukan prediksi peramalan adalah sebagai berikut :
a. Melakukan peramalan
public void hitungMA(simulasiClass sm) throws SQLException {
int[] windowSizes = {sm.getVar()};
double[] data = {sm.getJan1(), sm.getFeb1(), sm.getMar1(), sm.getApr1(),
sm.getMei1(), sm.getJun1(), sm.getJul1(), sm.getAgt1(), sm.getSep1(),
sm.getOkt1(), sm.getNov1(), sm.getDes1(), sm.getJan2(), sm.getFeb2(),
sm.getMar2(), sm.getApr2(), sm.getMei2(), sm.getJun2(), sm.getJul2(),
28
sm.getAgt2(), sm.getSep2(), sm.getOkt2(), sm.getNov2(), sm.getDes2()};
int i = 1;
for (int windSize : windowSizes) { MA ma = new MA(windSize); for (double x : data) { if (x != 0) { sm.setNo(i); ma.newNum(x); sm.setData(x); double p = ma.getAvg(); System.out.println("Next number = " + x + ", SMA = " + p); sm.setPrediksi(p); simulasiDB.getKoneksi().catatPredik(sm); } i++; } } }
b. Menghitung dengan algoritma moving average package testerPack;
import java.util.LinkedList; import java.util.Queue;
public class MA {
private final Queue<Double> window = new LinkedList<Double>();
private final int period; private double sum;
29
public MA(int period) {
assert period > 0 : "Period must be a positive integer";
this.period = period; }
public void newNum(double num) { sum += num; window.add(num); if (window.size() > period) { sum -= window.remove(); } }
public double getAvg() { if (window.isEmpty()) {
return 0; // technically the average is undefined
}
return sum / window.size(); }
}
c. Memasukkan hasil prediksi kedalam tabel bantu
public void catatPredik(simulasiClass sim) throws SQLException {
PreparedStatement pstmt = null; try {
conn.setAutoCommit(false);
String sql = "update barangPredik set penjualan=? ,prediksi=? "
+ "where no=?";
30 pstmt.setDouble(3, sim.getNo()); pstmt.setDouble(2, sim.getPrediksi()); pstmt.setDouble(1, sim.getData()); pstmt.executeUpdate(); conn.commit();
} catch (SQLException exception) { conn.rollback(); throw exception; } finally { try { conn.setAutoCommit(true); if (pstmt != null) { pstmt.close(); }
} catch (SQLException exception) { throw exception;
} } }
d. Mencari prediksi
public void cariPredik1(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
conn.setAutoCommit(false);
String sql = "Select prediksi from barangPredik where "
+ "no=?";
31 conn.prepareStatement(sql); statement.setInt(1, sim.getBulan() + 2); result = statement.executeQuery(); if (result.next()) { p = result.getString("prediksi"); Double pr = Double.parseDouble(p); sim.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariPredik2(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
conn.setAutoCommit(false);
String sql = "Select prediksi from barangPredik where " + "no=?"; statement = conn.prepareStatement(sql); statement.setInt(1, sim.getBulan() + 1);
32 result = statement.executeQuery(); if (result.next()) { p = result.getString("prediksi"); Double pr = Double.parseDouble(p); sim.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariPredik3(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
conn.setAutoCommit(false);
String sql = "Select prediksi from barangPredik where " + "no=?"; statement = conn.prepareStatement(sql); statement.setInt(1, sim.getBulan()); result = statement.executeQuery(); if (result.next()) {
33 p = result.getString("prediksi"); Double pr = Double.parseDouble(p); sim.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
e. Mencari MAPE dan menampilkan hasil
public void mapeNormal(simulasiClass sm) throws SQLException {
int setno = sm.getNo() - 6; int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { simulasiDB.getKoneksi().cariSelisih(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
sm.setJum(jum); System.out.println("no :" + no + " mape :" + sm.getMAPE() + " jumlah Mape:" + sm.getJum()); }
34
sm.setJum(mapes);
sm.setHasil("Hasil prediksi untuk bulan " + sm.getNamaBulan() + " tahun " + sm.getTahun() + "\n adalah " + sm.getPrediksi() + "\n MAPE : " + sm.getJum() + "%"); }
public void mapeVar1(simulasiClass sm) throws SQLException {
simulasiDB.getKoneksi().cariPredik1(sm); int setno = sm.getBulan() + 6; int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { simulasiDB.getKoneksi().cariSelisih1(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
sm.setJum(jum); System.out.println("no :" + no + " mape :" + sm.getMAPE() + " jumlah Mape:" + sm.getJum()); }
int mapes = sm.getJum() / 6; sm.setJum(mapes);
sm.setHasil("Hasil prediksi untuk bulan " + sm.getNamaBulan()
35 + " tahun " + sm.getTahun() + "\n adalah " + sm.getPrediksi() + "\n MAPE : " + sm.getJum() + "%"); }
public void mapeVar2(simulasiClass sm) throws SQLException {
simulasiDB.getKoneksi().cariPredik2(sm); int setno = sm.getBulan() + 6; int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { simulasiDB.getKoneksi().cariSelisih2(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
sm.setJum(jum); System.out.println("no :" + no + " mape :" + sm.getMAPE() + " jumlah Mape:" + sm.getJum()); }
int mapes = sm.getJum() / 6; sm.setJum(mapes);
sm.setHasil("Hasil prediksi untuk bulan " + sm.getNamaBulan()
+ " tahun " + sm.getTahun() + "\n adalah " + sm.getPrediksi()
36 "%");
}
public void mapeVar3(simulasiClass sm) throws SQLException {
simulasiDB.getKoneksi().cariPredik3(sm); int setno = sm.getBulan() + 6; int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { simulasiDB.getKoneksi().cariSelisih3(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
sm.setJum(jum); System.out.println("no :" + no + " mape :" + sm.getMAPE() + " jumlah Mape:" + sm.getJum()); }
int mapes = sm.getJum() / 6; sm.setJum(mapes);
sm.setHasil("Hasil prediksi untuk bulan " + sm.getNamaBulan() + " tahun " + sm.getTahun() + "\n adalah " + sm.getPrediksi() + "\n MAPE : " + sm.getJum() + "%"); } }
37 f. Mencari selisih error
public void cariSelisih(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, sim.getNo() + 1); statement.setInt(2, sim.getNo()); statement.setInt(3, sim.getNo() + 1); result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); sim.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
38 }
}
public void cariSelisih1(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, sim.getNo()); statement.setInt(2, sim.getNo() - 10); statement.setInt(3, sim.getNo()); result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); sim.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
39
throw exception; }
}
public void cariSelisih2(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, sim.getNo()); statement.setInt(2, sim.getNo() - 11); statement.setInt(3, sim.getNo()); result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); sim.setMAPE(p); } conn.commit();
40
conn.rollback(); throw exception; }
}
public void cariSelisih3(simulasiClass sim) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, sim.getNo()); statement.setInt(2, sim.getNo() - 12); statement.setInt(3, sim.getNo()); result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); sim.setMAPE(p); } conn.commit();
41
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
2. Button Batal
Merupakan sebuah tombol yang akan mengembalikan semua text field dalam sistem simulasi menjadi bersih kembali sehingga tidak harus menghapusnya satu persatu.
3. Button Keluar
Merupakan sebuah tombol yang fungsinya adalah untuk menutup sistem.
4.2.2 Software User
Berikut adalah fungsi-fungsi dan tahap-tahap peramalan pada software user :
1. Button Prediksi
Merupakan sebuah tombol untuk melakukan prediksi. Berbeda dengan software tester, software user akan langsung menghitung keempat mode peramalan sekaligus. Keempat mode peramalan yang dihitung akan dicari MAPE terkecil dan MAPE terkecil itulah yang akan dikeluarkan sebagai hasil peramalan. Langkah fungsi buttonPrediksi() dalam melakukan prediksi peramalan adalah sebagai berikut :
a. Mencari data penjualan dalam database untuk diproses public void cariData(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
42
String sql = "Select jumlah from penjualanAinun where " + "kodePenjualan=?"; statement = conn.prepareStatement(sql); statement.setString(1, usr.getKodePjualan()); result = statement.executeQuery(); if (result.next()) { p = result.getString("jumlah"); Double pr = Double.parseDouble(p); usr.setPjualan(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
b. Melakukan peramalan
public void hitungMA(UserClass sm) throws SQLException {
int[] windowSizes = {3};
double[] data = new double[24]; for (int i = 0; i < 24; i++) { if (sm.getBulan() < 10) { sm.setBlnStr("0" + sm.getBulan()); } else { String bln = String.valueOf(sm.getBulan());
43 sm.setBlnStr(bln); } UserDB.getKoneksi().cariData(sm); sm.setBulan(sm.getBulan() + 1); if (sm.getBulan() == 13) { sm.setBulan(1); sm.setTahun(sm.getTahun() + 1); } data[i] = sm.getPjualan(); } int i = 1;
for (int windSize : windowSizes) { MA ma = new MA(windSize); for (double x : data) { if (x != 0) { sm.setNo(i); ma.newNum(x); sm.setData(x); double p = ma.getAvg(); sm.setPrediksi(p); UserDB.getKoneksi().catatPredik(sm); } i++; } } }
c. Menghitung dengan algoritma moving average package testerPack;
import java.util.LinkedList; import java.util.Queue;
44 public class MA {
private final Queue<Double> window = new LinkedList<Double>();
private final int period; private double sum;
public MA(int period) {
assert period > 0 : "Period must be a positive integer";
this.period = period; }
public void newNum(double num) { sum += num; window.add(num); if (window.size() > period) { sum -= window.remove(); } }
public double getAvg() { if (window.isEmpty()) {
return 0; // technically the average is undefined
}
return sum / window.size(); }
}
d. Memasukkan hasil prediksi kedalam table bantu
public void catatPredik(UserClass usr) throws SQLException {
45 try {
conn.setAutoCommit(false);
String sql = "update barangPredik set penjualan=? ,prediksi=? "
+ "where no=?"; pstmt = conn.prepareStatement(sql); pstmt.setDouble(3, usr.getNo()); pstmt.setDouble(2, usr.getPrediksi()); pstmt.setDouble(1, usr.getData()); pstmt.executeUpdate(); conn.commit();
} catch (SQLException exception) { conn.rollback(); throw exception; } finally { try { conn.setAutoCommit(true); if (pstmt != null) { pstmt.close(); }
} catch (SQLException exception) { throw exception;
} } }
e. Mencari prediksi
public void cariPredik1(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
46 try {
conn.setAutoCommit(false);
String sql = "Select prediksi from barangPredik where " + "no=?"; statement = conn.prepareStatement(sql); statement.setInt(1, usr.getNo1() + 14); result = statement.executeQuery(); if (result.next()) { p = result.getString("prediksi"); Double pr = Double.parseDouble(p); usr.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariPredik2(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
conn.setAutoCommit(false);
47 barangPredik where " + "no=?"; statement = conn.prepareStatement(sql); statement.setInt(1, usr.getNo1() + 13); result = statement.executeQuery(); if (result.next()) { p = result.getString("prediksi"); Double pr = Double.parseDouble(p); usr.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariPredik3(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
String p = "";
try {
conn.setAutoCommit(false);
String sql = "Select prediksi from barangPredik where "
+ "no=?";
48 conn.prepareStatement(sql); statement.setInt(1, usr.getNo1()+12); result = statement.executeQuery(); if (result.next()) { p = result.getString("prediksi"); Double pr = Double.parseDouble(p); usr.setPrediksi(pr); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
f. Mencari MAPE dan menampilkan hasil
public void mapeNormal(UserClass sm) throws SQLException {
int setno = sm.getNo() - 6; int jum = 0; sm.setNo(setno); sm.setMAPE(0); sm.setMAPE1(0); sm.setJum(0); for (int j = 0; j < 6; j++) { UserDB.getKoneksi().cariSelisih(sm); int no = sm.getNo() + 1; sm.setNo(no);
49
jum = jum + mape; }
public void mapeVar1(UserClass sm) throws SQLException {
UserDB.getKoneksi().cariPredik1(sm); int setno = sm.getNo1() + 18;
int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { UserDB.getKoneksi().cariSelisih1(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
}
int mapes = jum / 6;
if (mapes < sm.getMAPE1()) { sm.setJum(sm.getPrediksi()); sm.setMAPE1(mapes);
} }
public void mapeVar2(UserClass sm) throws SQLException {
UserDB.getKoneksi().cariPredik2(sm); int setno = sm.getNo1() + 18;
int jum = 0; sm.setNo(setno); sm.setMAPE(0);
for (int j = 0; j < 6; j++) {
50
UserDB.getKoneksi().cariSelisih2(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
}
int mapes = jum / 6;
if (mapes < sm.getMAPE1()) { sm.setJum(sm.getPrediksi()); sm.setMAPE1(mapes);
} }
public void mapeVar3(UserClass sm) throws SQLException {
UserDB.getKoneksi().cariPredik3(sm); int setno = sm.getNo1() + 18;
int jum = 0; sm.setNo(setno); sm.setMAPE(0); for (int j = 0; j < 6; j++) { UserDB.getKoneksi().cariSelisih3(sm); int no = sm.getNo() + 1; sm.setNo(no);
int mape = sm.getMAPE(); jum = jum + mape;
}
int mapes = jum / 6;
if (mapes < sm.getMAPE1()) { sm.setJum(sm.getPrediksi()); sm.setMAPE1(mapes);
}
51
sm.setHasil("Rekomendasi pengadaan stok untuk \nbarang " +sm.getNamaBrg()+"\npada bulan "+ sm.getNamaBulan() + " tahun " + sm.getTahun() +" adalah "+stok); }
g. Mencari selisih error
public void cariSelisih(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, usr.getNo() + 1); statement.setInt(2, usr.getNo()); statement.setInt(3, usr.getNo() + 1); result = statement.executeQuery();
52 if (result.next()) { p = result.getInt("mape"); usr.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariSelisih1(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, usr.getNo()); statement.setInt(2, usr.getNo() - 10); statement.setInt(3, usr.getNo()); result = statement.executeQuery();
53 if (result.next()) { p = result.getInt("mape"); usr.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariSelisih2(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement = conn.prepareStatement(sql); statement.setInt(1, usr.getNo()); statement.setInt(2, usr.getNo() - 11); statement.setInt(3, usr.getNo());
54 result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); usr.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
public void cariSelisih3(UserClass usr) throws SQLException {
PreparedStatement statement = null; ResultSet result = null;
int p = 0;
try {
conn.setAutoCommit(false);
String sql = "select ((ABS((select penjualan from barangpredik "
+ "where no=?)-(select prediksi from "
+ "barangpredik where no=?))/(select penjualan "
+ "from barangpredik where no=?))*100) as MAPE from dual";
statement =
conn.prepareStatement(sql);
statement.setInt(1, usr.getNo()); statement.setInt(2, usr.getNo() - 12);
55 statement.setInt(3, usr.getNo()); result = statement.executeQuery(); if (result.next()) { p = result.getInt("mape"); usr.setMAPE(p); } conn.commit();
} catch (SQLException exception) { conn.rollback();
throw exception; }
}
2. Button Batal
Merupakan sebuah tombol yang akan mengembalikan semua text field dalam sistem simulasi menjadi bersih kembali sehingga tidak harus menghapusnya satu persatu.
3. Button Keluar
Merupakan sebuah tombol yang fungsinya adalah untuk menutup sistem.
56 4.3Manajemen Dialog
4.3.1 Software Tester
Gambar 4.4 : User Interface SimulasiTest
Sistem simulasi merupakan sistem yang dibuat untuk melakukan percobaan-percobaan penghitungan dengan beberapa permodelan terhadap barang tertentu. Sistem simulasi jika dijalankan akan memiliki tampilan seperti diatas, yaitu tampilan dari form simulasiTest. SimulasiTest memiliki 5 panel sesuai dengan urutan dalam menjalankan sistem simulasi.
Urutan pertama adalah mode prediksi. Panel mode prediksi memiliki pilihan untuk memilih mode prediksi. Mode prediksi yang dapat dipilih adalah mode normal, variasi1, variasi2, dan variasi3. Setiap mode prediksi yang ada memiliki algoritma yang sama tetapi dengan variasi pemodelan data yang berbeda.
Urutan kedua adalah menentukan target prediksi. Target prediksi dibagi menjadi 3 text field yaitu text field bulan, tahun dan n bulan. Text field bulan dan tahun adalah target bulan pada tahun tertentu yang ingin diramalkan. Text field n bulan adalah berapa banyaknya n yang akan dihitung dalam algoritma. Khusus untuk n bulan akan dapat diisi jika mode prediksi yang dipilih adalah mode normal.
57
Urutan ketiga adalah panel data penjualan. Panel data