Pada bab ini akan dijelaskan mengenai bagaimana mengimplementasikan sistem yang telah dirancang sehingga menghasilkan suatu aplikasi yang dapat digunakan. Program ini dibuat dengan menggunakan SQL Server 7.0 dan pembuatan interface dengan Borland Delphi 7.
4.1. Implementasi pada SQL Server 7
Membangun database adalah langkah awal dari pembuatan suatu aplikasi ini. Beberapa hal yang perlu dilakukan dalam permbuatan database adalah sebagai berikut:
a. Pembuatan Database
Pada Enterprise Manager, klik icon Microsoft SQL Server untuk membuka
Server. Folder Database diklik kanan kemudian pilih New Database.
Gambar 4.1. Enterprise Manager
Nama database diisi dengan ‘Tugas_Akhir1’ dan location pada
‘D:\Program1’. Location pada tab Transaction Log diubah dengan ‘D:\Program1’.
Database primer dan file-file log transaksi akan dibuat menggunakan nama yang
telah diketik sebagai awalannya.
Gambar 4.2. Database Properties
b. Pembuatan Tabel
Pada folder Databases, tanda + diklik dan dipilih Tables. Tombol mouse
kanan ditekan dan pilih New Table.
Gambar 4.3. Pembuatan Tabel Baru
4.2. Setting ODBC dan BDE
ODBC atau Open Database Connectivity adalah sebuah standar yang dikembangkan oleh Microsoft untuk mendukung driver database yang bersifat independent terhadap produk. Langkah-langkah untuk setting ODBC adalah sebagai berikut:
a. ODBC dibuka dari Control Panel | Administrative Tools | Data Souce (ODBC)
sehingga tampil window seperti pada Gambar 4.4.
Gambar 4.4. ODBC Data Sources Administrator
b. Dengan menekan tombol Add setelah memilih MQIS, maka akan tampil
window Create New Data Source.
c. Driver yang dipilih adalah SQL Server, lalu tombol Finish ditekan. Form untuk pembuatan data source akan muncul, nama datasource diisi dengan ‘SI’ dan DatabaseName diisi dengan ‘Tugas_Akhir1’.
4.3. Pembuatan Data Module
Delphi menyediakan fasilitas data module untuk mendefinisikan hubungan pada setiap aplikasi. Alasan pemakaian data module adalah untuk pemakaian bersama komponen-komponen data access di antara beberapa form dan memisahkan form data dari interface user. Data module dapat dibuat dengan memilih menu File | New | Data Module. Data module dapat diisi dengan komponen Session, Database, Data source, Table maupun Query.
Gambar 4.6. Data Module
4.4. Penggunaan Quick Report pada Delphi 7
Saat meng-install Delphi 7, komponen Quick Report tidak ada dalam component pallete sehingga untuk dapat menggunakan aplikasi ini Quick Report harus di-install terlebih dahulu. Langkah-langkah untuk meng-install Quick Report adalah sebagai berikut:
a. Bukalah Delphi 7 kemudian dipilih menu Component | Install Component.
Gambar 4.7. Install Package
b. Dengan menekan tombol Add, kemudian file ‘dclcrt70.bpl’ dalam folder Bin dibuka.
Untuk Delphi 6 langkah peng-install-an tidak perlu dilakukan. Untuk menggunakan Quick Report, pilih File | New | Report.
4.5. Form dan Procedure 4.5.1. Daftar Form
Berikut ini adalah daftar form yang dapat diakses dari Form Menu.
Tabel 4.1. Daftar Form
Menu Form Keterangan
Operator Untuk menambah, mengubah, mengaktifkan, menon-aktifkan, dan mencari data operator File
Ubah Password Untuk mengubah password user
Barang Untuk menambah, mengubah, mengaktifkan, menon-aktifkan, dan mencari data barang Kategori Untuk menambah, mengubah, dan mencari
data kategori Master
Supplier Untuk menambah, mengubah, mengaktifkan, menon-aktifkan, dan mencari data supplier Order Untuk menambah, mengubah, dan mencari
data order
Pembelian Untuk menambah, mengubah, dan mencari data penjualan
Retur Pembelian Untuk menambah, mengubah, dan mencari data retur pembelian
Hutang Untuk melakukan pelunasan hutang dan mencari data hutang
Input Penjualan Untuk melakukan transaksi dan menyimpan data transaksi penjualan
Retur Penjualan Untuk melakukan dan menyimpan retur penjualan
Transaksi
Pengiriman Untuk menyimpan data pengiriman dan pelunasan yang telah dilakukan dari transaksi penjualan
Peramalan Peramalan Untuk meramalkan penjualan per kategori barang berdasarkan satuan
Laporan Barang Untuk menampilkan laporan stok dan minimum stok
Laporan Adjustment Stok
Untuk menampilkan laporan adjustment stok Order Untuk menampilkan laporan order
Pembelian Untuk menampilkan laporan pembelian per supplier dan laporan pembelian secara keseluruhan
Retur Pembelian Untuk menampilkan laporan retur pembelian Penjualan Untuk menampilkan laporan penjualan Laporan
Retur Penjualan Untuk menampilkan laporan retur penjualan
4.5.2. Daftar Procedure
Berikut ini adalah form-form yang terdapat pada aplikasi yang telah dibuat beserta daftar procedure-nya.
a. Form Login
Form login adalah form yang pertama kali muncul saat aplikasi ini dijalankan. Untuk dapat mengakses menu, user harus meng-input-kan nama user dan password. Jika user lupa password-nya, maka tekan tombol password untuk mendapatkan password. Procedure yang terdapat pada form ini dapat dilihat pada Tabel 4.2.
Tabel 4.2. Procedure Form Login
Procedure Keterangan
Tform1.BtOkClick Mengecek username dan password sesuai yang ada di database dan menentukan hak aksesnya Tform1.BtBatalClick Keluar dari aplikasi
b. Form Ubah Password
Form Ubah Password digunakan untuk mengubah password yang dimiliki user. Procedure yang terdapat pada form ini dapat dilihat pada Tabel 4.3.
Tabel 4.3. Procedure Form Ubah Password
Procedure Keterangan
Tform17.BtOkClick Menyimpan perubahan password
c. Form Operator
Form operator merupakan form utama dimana user dapat melakukan
beberapa fungsi, yaitu untuk menambah, mengubah, mencari, mengaktifkan, menon-
aktifkan data operator. Procedure yang berkaitan dengan form ini dapat dilihat pada
Tabel 4.4.
Tabel 4.4. Procedure yang Berhubungan dengan Form Operator
Tombol Form Procedure Keterangan
Baru Input Operator Tform9.BtOkClick Meng-input-kan data operator
Ubah Ubah Operator Tform10.BtOkClick Menyimpan hasil modifikasi data operator Non-Aktif Operator Tform9.BtNonAktifClick Menon-aktifkan data
operator
Aktif Pengaktifan Tform29.Aktif1Click Mengaktifkan kembali data operator
Cari Operator TForm8.BtCariClick Mencari data operator
d. Form Barang
Form barang merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu menambah, mengubah, mencari, mengaktifkan, dan menon- aktifkan data barang. Procedure yang yang berkaitan dengan form ini dapat dilihat pada Tabel 4.5.
Tabel 4.5. Procedure yang Berhubungan dengan Form Barang
Tombol Form Procedure Keterangan
Baru Input Barang Tform5.BtOkClick Menginputkan data barang
Ubah Ubah Barang Tform6.BtOkClick Menyimpan hasil modifikasi data barang Non-Aktif Barang Tform4.BtNonAktifClick Menon-aktifkan data
barang
Aktif Pengaktifan Tform29.Aktif1Click Mengaktifkan kembali data barang
Cari Barang Tform4.BtCariClick Mencari data barang
Barang TForm4.
DBBrgDrawColumnCell
Menandai grid barang yang sudah mencapai stok minimum
Segmen Program 4.1. Procedure Form Barang
procedure TForm4.DBBrgDrawColumnCell(Sender: TObject; const Rect:
TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TCustomDbGridCracker(Sender)do
begin
if Datalink.ActiveRecord=row-1 then canvas.Brush.Color:=$00FFB871 else Canvas.Brush.Color:=clWindow;
end;
with datamodule2 do
if (Column.Field=QBrgJumlah) and
(QBrgJumlah.AsFloat<=QbrgStok_min.AsFloat) then begin
DbBrg.Canvas.Brush.Color:=$008CB1FF;
DbBrg.DefaultDrawDataCell(Rect,QbrgJumlah,State);
end;
end;
e. Form Kategori
Form kategori merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu menambah, mengubah, dan mencari data kategori. Procedure yang berkaitan dengan form ini dapat dilihat pada Tabel 4.6.
Tabel 4.6. Procedure yang Berhubungan dengan Form Kategori
Tombol Form Procedure Keterangan
Baru Input Kategori Tform12.BtOkClick Meng-input-kan data kategori
Ubah Ubah Kategori Tform13.BtOkClick Menyimpan hasil modifikasi data kategori Cari Kategori Tform11.BtCariClick Mencari data kategori
f. Form Supplier
Form supplier merupakan form utama dimana user dapat melakukan
beberapa fungsi, yaitu menambah, mengubah, mencari, mengaktifkan, dan
menonaktifkan data supplier. Procedure yang yang berkaitan dengan form ini dapat
dilihat pada Tabel 4.7.
Tabel 4.7. Procedure yang Berhubungan dengan Form Supplier
Tombol Form Procedure Keterangan
Baru Input Supplier Tform15.BtOkClick Meng-input-kan data supplier
Ubah Ubah Supplier Tform16.BtOkClick Menyimpan hasil modifikasi data supplier
Non-Aktif Supplier Tform14.
BtNonAktifClick Menon-aktifkan data supplier
Aktif Pengaktifan Tform29.Aktif1Click Mengaktifkan kembali data supplier
Cari Supplier Tform14.BtCariClick Mencari data supplier
g. Form Order
Form order merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu menambah, mengubah, mencari, mengaktifkan, dan menonaktifkan data order. Procedure yang yang berkaitan dengan form ini dapat dilihat pada Tabel 4.8.
Tabel 4.8. Procedure yang Berhubungan dengan Form Order
Tombol Form Procedure Keterangan
Baru Input Order Tform18.BtOkClick Meng-input-kan data order
Ubah Ubah Order Tform19.BtOkClick Menyimpan hasil modifikasi data order Cari Order Tform18.BtCariClick Mencari data order
h. Form Pembelian
Form pembelian merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu menambah, mengubah, dan mencari data pembelian.
Procedure yang berkaitan dengan form ini dapat dilihat pada Tabel 4.9.
Tabel 4.9. Procedure yang Berhubungan dengan Form Pembelian
Tombol Form Procedure Keterangan
Baru Input Pembelian
Tform22.BtOkClick, Tform22.BtOk2Click, Tform22.BtOk3Click
Meng-input-kan data pembelian order, langsung, dan konsiyasi
Ubah Ubah Pembelian
Tform16.BtOkClick Menyimpan hasil modifikasi data pembelian
Cari Pembelian Tform21.BtCariClick Mencari data pembelian
Segmen Program 4.2. Procedure Form Input Pembelian
//untuk pembelian order
procedure TForm22.BtOKClick(Sender: TObject);
var i,k,hitung,tot2:integer;
tot1,bayar:real;
begin
//pengecekan hasil:=false;
cekmaster;
if hasil=true then begin
with datamodule2 do begin
if j>=2 then begin
dbta.StartTransaction;
try
//simpan ke Mpembelian MPembelian.Last;
MPembelian.Append;
MPembelian['Kode_Pembelian']:=EKodeBeli.Text;
MPembelian['Kode_Supplier']:=CbSupp.Text;
MPembelian['Tgl_Beli']:=Tgl_beli.Date;
MPembelian['No_Faktur']:=EFaktur.Text;
MPembelian['Total']:=strtofloat(MTotal.Text);
MPembelian['Status']:=CbStatus.Text;
MPembelian['Keterangan']:=MKeterangan.Text;
if CbStatus.Text='KREDIT' then begin
MPembelian['Tgl_Jatuh_Tempo']:=strtodate(ETempo.Text);
MPembelian['Lunas']:='N' end
else MPembelian['Lunas']:='Y';
MPembelian.Post;
//Simpan Tabel Dpembelian DPembelian.Last;
for i:=1 to j-1 do begin
DPembelian['Kode_Barang']:=SgBeli.Cells[1,i];
DPembelian['Jumlah']:=strtofloat(SgBeli.Cells[4,i]);
DPembelian['Harga_Beli']:=strtofloat(SgBeli.Cells[5,i]);
DPembelian['Diskon_Beli']:=strtofloat(SgBeli.Cells[6,i]);
DPembelian.Post;
//jika barang dikirim sesuai jumlah order if Sgbeli.Cells[8,i]='0' then
begin
//update tabel DOrder Dorder.First;
for k:=1 to Dorder.RecordCount do begin
if
(DOrder['Kode_Order']=SgBeli.Cells[0,i]) and (DOrder['Kode_Barang']=SgBeli.Cells[1,i]) then
begin
DOrder.Edit;
DOrder['Terpenuhi']:='Y';
DOrder['Lengkap']:='Y';
DOrder['Sisa_Order']:=0;
DOrder.Post;
break;
end
else Dorder.Next;
end;
//Update Tabel Barang if
Barang.Locate('Kode_Barang',SgBeli.Cells[1,i],[]) then begin
Barang.Edit;
Barang['Jumlah']:=Barang['Jumlah']+strtofloat(SgBeli.Cells[4,i]);
Barang.Post;
end;
end else begin
//Update Tabel DOrder Dorder.First;
for k:=1 to DOrder.RecordCount do if
(DOrder['Kode_Order']=SgBeli.Cells[0,i])and
(DOrder['Kode_Barang']=SgBeli.Cells[1,i]) then
begin
DOrder.Edit;
DOrder['Terpenuhi']:='Y';
DOrder['Sisa_order']:=strtofloat(Sgbeli.Cells[8,i]);
DOrder.Post;
break;
end
else Dorder.Next;
//Update Tabel Barang if
Barang.Locate('Kode_Barang',SgBeli.Cells[1,i],[]) then begin
Barang.Edit;
Barang['Jumlah']:=Barang['Jumlah']+strtofloat(SgBeli.Cells[4,i]);
Barang.Post;
end;
end;
//cek DOrder& Update MOrder
//var hitung untuk menghitung Kode_Order pada detail yg lengkap=y
QCekMOrder.Close;
QCekMOrder.SQL.Clear;
QCekMOrder.SQL.Add('select count(d.lengkap) as jum');
QCekMOrder.SQL.Add('from Morder m, Dorder d');
QCekMOrder.SQL.Add('where d.Kode_Order=:kode and m.Kode_Order=d.Kode_Order');
QCekMOrder.SQL.Add('and d.lengkap=''Y''');
QCekMOrder.Prepare;
QCekMOrder.Params[0].AsString:=SgBeli.Cells[0,i];
QCekMOrder.Open;
hitung:=QCekMOrder.Fields[0].Value;
if
MOrder.Locate('Kode_Order',SgBeli.Cells[0,i],[]) then begin
if MOrder['jum_item']=hitung then begin
MOrder.Edit;
Morder['M_Terpenuhi']:='Y';
Morder.Post;
end;
end;
end;
//simpan tabel hutang
if CbStatus.Text='KREDIT' then begin
KodeHutang;
//pembulatan hutang ke kelipatan 50 tot1:=Strtofloat(Mtotal.Text)/50;
tot2:=ceil(tot1);
bayar:=tot2*50;
Hutang.Last;
Hutang.Append;
Hutang['Keterangan']:='BARANG TETAP';
Hutang.Post;
end;
dbta.Commit;
Hutang.Active:=false;
Hutang.Active:=true;
Barang.Active:=false;
Barang.Active:=true;
MPembelian.Active:=false;
MPembelian.Active:=true;
DPembelian.Active:=false;
Dpembelian.Active:=true;
kosongbeliorder;
//kode pembelian Kode;
EKodeBeli.Text:=kodebeli;
j:=1;
except
dbta.Rollback;
messagedlg('Data tidak dapat disimpan',mtWarning,[mbOK],0);
end;
end;
end;
end;
end;
i. Form Retur Pembelian
Form retur pembelian merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu menambah, mengubah dan mencari data retur pembelian.
Procedure yang berkaitan dengan form ini dapat dilihat pada Tabel 4.10.
Tabel 4.10. Procedure yang Berhubungan dengan Form Retur Pembelian
Tombol Form Procedure Keterangan
Baru Input Retur Pembelian
Tform24.BtOkClick Meng-input-kan data retur pembelian
Ubah Ubah Retur
Pembelian
Tform26.BtOkClick Menyimpan hasil modifikasi data retur pembelian
Cari Retur Pembelian
Tform25.BtCariClick Mencari data retur
pembelian
j. Form Hutang
Form hutang merupakan form utama dimana user dapat melakukan beberapa fungsi, yaitu melunasi dan mencari data hutang. Procedure yang berkaitan dengan form ini dapat dilihat pada Tabel 4.11.
Tabel 4.11. Procedure yang Berhubungan dengan Form Hutang
Tombol Form Procedure Keterangan
Bayar Pelunasan
Hutang Tform28.BtOkClick Menyimpan data retur dan perubahan status lunas Cari Hutang Tform27.BtCariClick Mencari data hutang
k. Menu Penjualan
Dari menu penjualan user dapat memilih beberapa submenu, yaitu baru, retur dan pelunasan (hanya bisa diakses oleh pemilik). Procedure yang terdapat pada menu ini dapat dilihat pada Tabel 4.12.
Tabel 4.12. Procedure Menu Penjualan
SubMenu Form Procedure Keterangan
Baru Input
Penjualan Tform30.BtOkClick Meng-input-kan data retur pembelian
Retur Retur Penjualan
Tform34.BtOkClick Meng-input-kan data retur penjualan dan menonaktifkan nota lama jika terjadi retur tukar-tambah
Pengiriman Pengiriman Tform51.BtOKClick Mengubah status lunas dan pengiriman pada Mpenjualan menjadi “Y”
l. Form Adjustment Stok
Form digunakan untuk mencatat koreksi stok. Procedure yang terdapat pada
form ini dapat dilihat pada Tabel 4.13.
Tabel 4.13. Procedure Form Adjustment Stok
Procedure Keterangan
Tform32.BtOkClick Menyimpan data adjustment
Tform32.Cek Mengecek kelengkapan peng-input-an
m. Form Peramalan
Form Peramalan digunakan untuk melakukan perhitungan peramalan berdasarkan data-data penjualan yang ada di database. Procedure yang terdapat pada form ini dapat dilihat pada Tabel 4.14.
Tabel 4.14. Procedure Form Peramalan
Procedure Keterangan
Tform61.BtOkClick Melakukan proses peramalan Tform61.Pengambilan_Data Mengambil data dari tabel Mpenjualan dan
Dpenjualan Tform61.Winter(alpha, beta,
gamma:real; L:integer);
Melakukan perhitungan dengan metode Winter Tform61.Forecast_per_Item Melakukan perhitungan untuk forecasting per item
Segmen Program 4.3. Perhitungan Peramalan Secara Keseluruhan
procedure TForm61.BtOKClick(Sender: TObject);
var alpha, beta, gamma, increment:real;
L, L_max:integer;
temp,tgl_awal,tgl_akhir:TDateTime;
tgl, bulan, tahun:word;
begin
if (Cbbrg.Text<>'') then begin
with datamodule2 do begin
nol:=false;
Kosong;
Pengambilan_data;
increment:=0.1;
L_max:=7;
alpha:=0;
while alpha<=1 do begin
beta:=0;
while beta<=1 do begin
gamma:=0;
while gamma<=1 do begin
L:=3;
while L<=L_max do begin
if nol=false then begin
//kosong_SgRamal;
kosong_SgRamal;
//perhitungan winter
Winter(alpha, beta, gamma, L);
inc(L);
end else exit;
end;
gamma:=gamma+increment;
end;
beta:=beta+increment;
end;
alpha:=alpha+increment;
end;
//pengaturan form Form61.Height:=489;
BtGrafik.Enabled:=true;
end;
end else begin
messagedlg('Anda harus mengisi kode barang', mtInformation, [mbOK],0);
CbBrg.SetFocus;
BtOk.Enabled:=false;
end;
end;
Pada segmen program 4.3. dapat dilihat bahwa untuk melakukan peramalan ada beberapa hal yang harus dilakukan, antara lain: membaca data penjualan yang ada pada database, melakukan perhitungan dengan metode Winter, dan yang terakhir adalah melakukan perhitungan untuk peramalan per item.
Pada segmen program 4.4. dapat dilihat bahwa yang pertama kali dilakukan
adalah menentukan periode awal dan periode akhir dari data yang akan digunakan
untuk peramalan. Setelah data selesai dibaca, dilakukan pengecekan data penjualan
per bulan sesuai dengan kategori dan satuan yang telah dipilih. Pengecekan dilakukan
untuk memastikan bahwa tidak ada nilai 0 dalam data penjualan per bulan. Apabila
mengantisipasi divine by zero error pada error absolut yang berimbas pada MAPE (Mean Average Percentage Error) dan variabel-variabel yang berhubungan dengan I
n(faktor penyesuaian seasonal).
Segmen Program 4.4. Procedure untuk Pengambilan Data Penjualan
procedure Tform61.Pengambilan_data;
var {variabel untuk menghitung jangka waktu pengambilan data}
tahun_akhir, bulan_akhir, tgl_akhir:word;
tgl, bulan, tahun :word;
awal_bulan, periode_awal, periode_akhir, temp_periode:Tdatetime;
{variabel untuk menginputkan data ke tabel data_fore}
tgl_i, bulan_i, tahun_i:word;
awal_i,akhir_i, temp_i:Tdatetime;
{variabel untuk mengenali bulan &tahun untuk SgHasil}
tgl_j:string;
i:integer;
begin
decodedate(now, tahun, bulan, tgl);
tgl:=1;
//untuk hitung periode awal
awal_bulan:=encodedate(tahun,bulan, tgl);
periode_awal:=IncMonth(awal_bulan,-18);
//untuk menghitung periode akhir
temp_periode:=IncMonth(awal_bulan,-1);
decodedate(temp_periode, tahun_akhir, bulan_akhir, tgl_akhir);
periode_akhir:=EndOfAMonth(tahun_akhir, bulan_akhir);
with datamodule2 do begin
//pengambilan data tempdata.Active:=false;
tempdata.EmptyTable;
tempdata.Active:=true;
//untuk nota yang aktif QDatajual.Close;
Qdatajual.SQL.Clear;
Qdatajual.SQL.Add('select m.Tgl_jual, d.jumlah');
Qdatajual.SQL.Add('from mpenjualan m, dpenjualan d, barang b');
Qdatajual.SQL.Add('where m.no_nota=d.no_nota');
Qdatajual.SQL.Add('and m.aktif=''Y''');
QDatajual.SQL.Add('and d.kode_barang= :kode');
Qdatajual.SQL.Add('and m.Tgl_jual BETWEEN :awal and :akhir');
Qdatajual.SQL.Add('and b.kode_barang=d.kode_barang');
Qdatajual.SQL.Add('Order by m.tgl_jual');
Qdatajual.Prepare;
Qdatajual.Params[0].AsString:=CbBrg.Text;
Qdatajual.Params[1].AsDateTime:=periode_awal-1;
Qdatajual.Params[2].AsDateTime:=periode_akhir;
QDatajual.Open;
while not Qdatajual.Eof do begin
tempdata.Append;
tempdata['Tgl_jual']:=Qdatajual.Fields[0].Value;
tempdata['jumlah']:=Qdatajual.Fields[1].Value;
tempdata.Post;
Qdatajual.Next;
end;
//untuk nota yang tidak aktif Qdataretur.Close;
Qdataretur.SQL.Clear;
Qdataretur.SQL.Add('select DISTINCT (mj.tgl_jual), dj.jumlah');
Qdataretur.SQL.Add('from mpenjualan mj,dpenjualan dj, mreturcustomer mr, dreturcustomer dr, barang b');
Qdataretur.SQL.Add('where mj.no_nota=mr.no_nota_lama');
Qdataretur.SQL.Add('and mj.no_nota=dj.no_nota');
Qdataretur.SQL.Add('and dj.kode_barang=b.kode_barang');
Qdataretur.SQL.Add('and mj.aktif=''N''');
Qdataretur.SQL.Add('and dj.kode_barang=:kode');
Qdataretur.SQL.Add('and mj.Tgl_jual BETWEEN :awal1 and :akhir1');
Qdataretur.SQL.Add('and mr.tgl_retur BETWEEN :akhir2 and :akhir3');
Qdataretur.Prepare;
qdataretur.Params[0].AsString:=Cbbrg.Text;
qdataretur.Params[1].AsDateTime:=periode_akhir-1;
qdataretur.Params[2].AsDateTime:=periode_akhir;
qdataretur.Params[3].AsDateTime:=periode_akhir;
qdataretur.Params[4].AsDateTime:=periode_akhir+1;
Qdataretur.Open;
while not Qdataretur.Eof do begin
tempdata.Append;
tempdata['Tgl_jual']:=Qdataretur.Fields[0].Value;
tempdata['jumlah']:=Qdataretur.Fields[1].Value;
tempdata.Post;
Qdataretur.Next;
end;
tempdata.Active:=false;
tempdata.Active:=true;
//input data ke SgRamal & SgHasil for i:=1 to 18 do
begin
//hitung periode bulan ke-i if i=1 then
begin
awal_i:=periode_awal;
decodedate(awal_i, tahun_i, bulan_i, tgl_i);
akhir_i:=EndOfAMonth(tahun_i, bulan_i);
end
decodedate(temp_i, tahun_i, bulan_i, tgl_i);
awal_i:=StartOfAMonth(tahun_i, bulan_i);
akhir_i:=EndOfAMonth(tahun_i, bulan_i);
end;
Qbulan.Close;
Qbulan.SQL.Clear;
Qbulan.SQL.Add('select sum(jumlah) as jum');
Qbulan.SQL.Add('from tempdata');
Qbulan.SQL.Add('where Tgl_jual BETWEEN :awal and :akhir');
Qbulan.Prepare;
Qbulan.Params[0].AsDateTime:=awal_i;
Qbulan.Params[1].AsDateTime:=akhir_i-1;
Qbulan.Open;
while not Qbulan.Eof do begin
//untuk SgHasil
SgHasil.Cells[0,i]:=inttostr(i);
DateTimeToString(tgl_j,'dd/mmm/yy', akhir_i);
SgHasil.Cells[1,i]:=copy(tgl_j, 4,length(Tgl_j)-3);
//untuk SgRamal
SgRamal.Cells[0,i]:=inttostr(i);
if Qbulan.Fields[0].Value<>null then SgRamal.Cells[1,i]:=floattostr(Qbulan.Fields[0].Value)
else begin
messagedlg('Forecasting tidak dapat dilakukan karena ada data bulanan yang bernilai 0',mtInformation,[mbOK],0);
nol:=true;
exit;
end;
Qbulan.Next;
end;
end;
for i:=19 to 20 do begin
//untuk SgHasil
temp_i:=IncMonth(periode_awal,i-1);
decodedate(temp_i, tahun_i, bulan_i, tgl_i);
akhir_i:=EndOfAMonth(tahun_i, bulan_i);
DateTimeToString(tgl_j,'dd/mmm/yy', akhir_i);
SgHasil.Cells[0,i]:=inttostr(i);
SgHasil.Cells[1,i]:=copy(tgl_j, 4,length(Tgl_j)-3);
//untuk SgRamal
SgRamal.Cells[0,i]:=inttostr(i);
end;
end;
end;
Peramalan dengan metode Winter dilakukan dengan berbagai macam
kombinasi dari nilai Alpha, Beta, Gamma, dan panjang musiman (L). Hasil peramalan
ini dibandingkan nilai MSE-nya, dan dipilih nilai MSE yang terkecil (lihat segmen program 4.5.). Perhitungan peramalan ini menggunakan rumus-rumus yang ada pada bab 2.
Segmen Program 4.5. Peramalan dengan Metode Winter
procedure Tform61.Winter(alpha, beta, gamma:real; L:integer);
var XL, X2L, juml1, juml2 :real;
b, S, I, F, error,err_kuadrat, err_abs, MSE, MAPE, temp:real;
loopL, loop2L, h, g, periode, jum_periode, m :integer;
begin
//lakukan inisialisasi juml1:=0;
juml2:=0;
err_kuadrat:=0;
err_abs:=0;
jum_periode:=18;
//menghitung nilai XL dan X2L for loopL:=1 to L do
begin
juml1:=juml1+strtofloat(SgRamal.Cells[1,loopL]);
end;
XL:=juml1/L;
for Loop2L:=(L+1) to (2*L) do begin
juml2:=juml2+strtoFloat(SgRamal.Cells[1,loop2L]);
end;
X2L:=juml2/L;
//menghitung nilai B ke-L b:=(X2L-XL)/L;
SgRamal.Cells[4,L]:=floattostr(RoundTo(b,-2));
//menghitung nilai S ke-L
S:=XL+(strtofloat(SgRamal.Cells[4,L])*(L-1)/2);
SgRamal.Cells[2,L]:=floattostr(RoundTo(S,-2));
//menghitung nilai I yg pertama s/d I ke-L for h:=1 to L do
begin
I:=strtofloat(SgRamal.Cells[1,h])/XL;
SgRamal.Cells[3,h]:=floattostr(RoundTo(I,-2));
end;
//menghitung nilai F ke-g+m m:=1;
g:=L;
F:=((strtofloat(SgRamal.Cells[2,g]))+(strtofloat(SgRamal.Cells[4,g])
*m))*
(strtofloat(SgRamal.Cells[3,g-L+m]));
SgRamal.Cells[5,g+m]:=floattostr(RoundTo(F,-2));
//perhitungan dengan persamaan dasar Winter
S:=(alpha*strtofloat(SgRamal.Cells[1,periode])/
strtofloat(SgRamal.Cells[3,periode-L]))+(1-alpha)*
(strtofloat(SgRamal.Cells[2,periode-1])+
strtofloat(SgRamal.Cells[4,periode-1]));
SgRamal.Cells[2,periode]:=floattostr(RoundTo(S,-2));
//menghitung nilai b ke-periode
if Strtofloat(SgRamal.Cells[2,periode])<>0 then begin
b:=(gamma*(strtofloat(SgRamal.Cells[2,periode])- strtofloat(SgRamal.Cells[2,periode-1])))+
((1-gamma)*strtofloat(SgRamal.Cells[4,periode-1]));
SgRamal.Cells[4,periode]:=floattostr(RoundTo(b,-2));
end else exit;
//menghitung nilai I ke-periode
if strtofloat(SgRamal.Cells[4,periode])<>0 then begin
I:=(beta*(strtofloat(SgRamal.Cells[1,periode])/
strtofloat(SgRamal.Cells[2,periode])))+
((1-beta)*strtofloat(SgRamal.Cells[3,periode-L]));
SgRamal.Cells[3,periode]:=floattostr(RoundTo(I,-2));
end else exit;
//menghitung nilai F ke-periode+1
if strtofloat(SgRamal.Cells[4,periode])<>0 then begin
F:=(strtofloat(SgRamal.Cells[2,periode])+
(strtofloat(SgRamal.Cells[4,periode])*m)) *strtofloat(SgRamal.Cells[3,periode-L+m]);
SgRamal.Cells[5,periode+1]:=floattostr(RoundTo(F,-2));
end else exit;
if strtofloat(SgRamal.Cells[5,periode+1])<>0 then begin
//menghitung error kuadrat dan error absolut error:=strtofloat(SgRamal.Cells[1,periode])-
strtofloat(SgRamal.Cells[5,periode]);
SgRamal.Cells[6,periode]:=floattostr(RoundTo(sqr(error),-2));
err_kuadrat:=err_kuadrat+RoundTo(sqr(error),-2);
temp:=abs(error/strtofloat(SgRamal.Cells[1,periode])*100);
err_abs:=err_abs+temp;
SgRamal.Cells[7,periode]:=floattostr(RoundTo(temp,-2));
end else exit;
end;
//menghitung nilai F ke-periode+2 m:=2;
F:=(strtofloat(SgRamal.Cells[2,jum_periode])+
(strtofloat(SgRamal.Cells[4,jum_periode])*m)) *strtofloat(SgRamal.Cells[3,jum_periode-L+m]);
SgRamal.Cells[5,jum_periode+2]:=floattostr(RoundTo(F,-2));
//mengecek MSE_terkecil
MSE:=RoundTo(err_kuadrat/(jum_periode-L),-2);
MAPE:=RoundTo(err_abs/(jum_periode-L),-2);
if (alpha=0) and (beta=0) and (gamma=0) and (L=3) then begin
alpha_terkecil.Text:=floattostr(alpha);
beta_terkecil.Text:=floattostr(beta);
gamma_terkecil.Text:=floattostr(gamma);
L_terkecil.Text:=floattostr(L);
MSE_terkecil.Text:=floattostr(MSE);
MAPE_terkecil.Text:=floattostr(MAPE);
Hasil_F.Text:=SgRamal.Cells[5,jum_periode+2];
Salin_Hasil;
end else begin
if alpha_terkecil.Text='' then begin
alpha_terkecil.Text:=floattostr(alpha);
beta_terkecil.Text:=floattostr(beta);
gamma_terkecil.Text:=floattostr(gamma);
L_terkecil.Text:=floattostr(L);
MSE_terkecil.Text:=floattostr(MSE);
MAPE_terkecil.Text:=floattostr(MAPE);
Hasil_F.Text:=SgRamal.Cells[5,jum_periode+2];
Salin_Hasil;
end else
if MSE<strtofloat(MSE_Terkecil.Text) then begin
alpha_terkecil.Text:=floattostr(alpha);
beta_terkecil.Text:=floattostr(beta);
gamma_terkecil.Text:=floattostr(gamma);
L_terkecil.Text:=floattostr(L);
MSE_terkecil.Text:=floattostr(MSE);
MAPE_terkecil.Text:=floattostr(MAPE);
Hasil_F.Text:=SgRamal.Cells[5,jum_periode+2];
Salin_Hasil;
end else
if MSE=strtofloat(MSE_Terkecil.Text) then begin
if MAPE<strtofloat(MAPE_Terkecil.Text) then begin
alpha_terkecil.Text:=floattostr(alpha);
beta_terkecil.Text:=floattostr(beta);
gamma_terkecil.Text:=floattostr(gamma);
L_terkecil.Text:=floattostr(L);
MSE_terkecil.Text:=floattostr(MSE);
MAPE_terkecil.Text:=floattostr(MAPE);
Hasil_F.Text:=SgRamal.Cells[5,jum_periode+2];
Salin_Hasil;
end;