5.1 Kesimpulan
Pada penelitian ini, average-based fuzzy time series berhasil diimplementasikan pada suatu sistem otomasi untuk meramalkan jumlah penjualan telur pada salah satu distributor telur di Kabupaten Deli Serdang untuk satu minggu ke depan. Dengan pengimplementasian metode average-based fuzzy time series ini peramalan dapat digunakan hanya dengan satu variabel data time series saja, yaitu dengan data penjualan telur dengan jumlah data yang tidak terlalu banyak, sehingga peramalan dapat dilakukan dengan mudah dan sederhana dibandingkan dengan metode peramalan lainnya yang melibatkan banyak variabel dan dengan jumlah data yang banyak.
5.2 Saran
Pada penelitian selanjutnya, diharapkan metode average-based fuzzy time series dapat dibandingkan dan dianalisis kinerjanya dengan metode lain pada data penelitian yang sama, agar didapatkan hasil peramalan yang lebih akurat dengan membandingkan
Abbas, Bahtiar Saleh. Robert. Shinta. 2008. “Analisis peramalan penjualan bahan bakar minyak jenis premium di SPBU Pahlawan Asri Bandung”. Piranti Warta 11(3): hal.469-482.
Ai, The Jin. 1999. “Optimasi peramalan pemulusan eksponensial satu parameter dengan menggunakan algoritma non-linear programming”. Jurnal Teknologi Industri 3(3): hal.139-148.
Anggraeni, Wiwik. Sri Wahyuni, Indah. 2011. “Penerapan metode exponentially
weighted quantile regression untuk peramalan penjualan mobil”. SNATI:
hal.231-236.
Anwary, A.A. 2011. Prediksi Kurs Rupiah Terhadap Dollar Amerika menggunakan
Metode Fuzzy Time Series. Tugas Akhir. Semarang:Universitas Diponegoro.
Chen, S. M. 1996. “Forecasting enrollments based on fuzzy time series”. Fuzzy Sets
and Systems 81: hal.311-319.
Haris, M. Syauqi. 2010. Implementasi Metode Fuzzy Time Series dengan Penentuan
Interval Berbasis Rata-rata untuk Peramalan Data Penjualan Bulanan. Tugas
Akhir. Malang:Universitas Brawijaya.
Hernasary, Yunita. 2007. Metode Time Invariant Fuzzy Time Series untuk Peramalan
Pendaftaran Calon Mahasiswa. Tugas Akhir. Medan:Universitas Sumatera
Utara.
Huarng, Kunhuang.”Heuristic models of fuzzy time series for forecasting”.2000. Fuzzy
Sets and Systems 123: hal.369-386.
Jilani, T.A. Burney, A.S.Ardil, Cemal,. 2008. “A new quantile based fuzzy time
series forecasting model”. International Jaournal of Electrical and
Engineering 3(8): hal.501-507.
Jumingan. 2009.Studi Kelayakan Bisnis – Teori dan pembuatan Proposal Kelayakan. Jakarta: Bumi Aksara.
Kusumadewi, S., Purnomo, H. 2004. Aplikasi Logika Fuzzy untuk pendukung
keputusan. Yogyakarta: Graha Ilmu.
Makridakis, S., Wheelright, S.C., McGee, V.E. 1992. Metode dan Aplikasi
Peramalan. Jilid I. Edisi 2. Terjemahan Andriyanto, U.S., Basith, A. Jakarta:
linear Programming pada PT.MAST”. National Conference: Design and
Application of Technology: hal.84-91.
Rahmawati, Ihwana. 2007. Perbandingan Antara Metode Arima Box-Jenkins dengan
Jaringan Multi Layer Perceptron untuk Peramalan Penjualan. Tugas Akhir.
Surabaya: Institut Teknologi Sepuluh Nopember.
Simorangkir, Sabrina Pratiwi. 2011. Implementasi Sistem Pendukung Keputusan
Investasi Perumahan dengan Metode Sugeno. Skripsi. Medan: Sumatera
Utara.
Song, Q., Chissom, B.S.1993.”Fuzzy time series and it models”. Fuzzy Sets and
Systems 54: hal.269-277.
Widodo, Joko. 2008. Ramalan Penjualan Sepeda Motor Honda. Tugas Akhir. Jakarta: Universitas Gunadarma.
Winarno, W.W. 2007. Analisis Ekonometrika dan Statistika dengan Eviews. Yogyakarta: UPP STIM YKPN.
Xihao, Sun. Yimin, Li. 2007. “Average-based fuzzy time series for forecasting
Shanghai compound index”. World Journal of Modelling and Simulation 4(2):
LAMPIRAN A: Listing Program
1. Form Login
Imports System.Data
Imports System.Data.SqlClient
Public Class LoginForm
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
initializeConn()
Dim da As sqldataAdapter Dim ds As New DataSet Dim dt As DataTable
da = FetchData("SELECT COUNT(*) FROM pengguna WHERE username='" & UsernameTextBox.Text & "' AND password='" & md5Conv(PasswordTextBox.Text) & "'") ds.Clear() da.Fill(ds, "table") dt = ds.Tables(0) If dt.Rows(0)(0) > 0 Then actUser = UsernameTextBox.Text FormUtama.Show() Me.Close() Else
MsgBox("Username tidak cocok dengan password") End If
End Sub
Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
Me.Close() End Sub
Private Sub UsernameLabel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UsernameLabel.Click
End Sub End Class
2. Halaman Utama
Public Class FormUtama
Private Sub MDIParent1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
initializeConn()
LabelPengguna.Text = actUser LabelTanggal.Text = Now End Sub
Private Sub KeluarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KeluarToolStripMenuItem.Click
End End Sub
Private Sub LogOutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LogOutToolStripMenuItem.Click
LoginForm.Show() Me.Close() End Sub
Private Sub PenggunaToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PenggunaToolStripMenuItem.Click
FormPengguna.MdiParent = Me FormPengguna.Show()
End Sub
Private Sub UbahPasswordToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
FormUbahPass.MdiParent = Me FormUbahPass.Show()
End Sub
Private Sub OlahDataPenjualanToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
OlahDataPenjualanToolStripMenuItem.Click FormPenjualan.MdiParent = Me FormPenjualan.Show()
End Sub
Private Sub PeramalanToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PeramalanToolStripMenuItem.Click
FormPeramalan.MdiParent = Me FormPeramalan.Show()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
LabelTanggal.Text = Now End Sub
End Class
Imports System.Data
Imports System.Data.SqlClient
Public Class FormPenjualan
Public Sub btnState1() SimpanBtn.Enabled = True UbahBtn.Enabled = False BatalBtn.Enabled = False HapusBtn.Enabled = False CariBtn.Enabled = True End Sub
Public Sub btnState2()
SimpanBtn.Enabled = False UbahBtn.Enabled = True BatalBtn.Enabled = True HapusBtn.Enabled = True CariBtn.Enabled = False End Sub
Private Sub IsiTahun()
Dim dtmin, dtmax As DataTable
dtmin = FetchDataTable("SELECT MIN(YEAR(tanggal)) FROM penjualan") dtmax = FetchDataTable("SELECT MAX(YEAR(tanggal)) FROM penjualan") TahunCombo.Items.Clear()
Dim mintahun, maxtahun, i As Integer mintahun = dtmin.Rows(0)(0)
maxtahun = dtmax.Rows(0)(0) For i = mintahun To maxtahun TahunCombo.Items.Add(i) Next
End Sub
Private Sub IsiBulan(ByVal tahun As String) Dim dtmin, dtmax As DataTable
dtmin = FetchDataTable("SELECT MIN(MONTH(tanggal)) FROM penjualan WHERE tanggal LIKE '" & tahun & "%'")
dtmax = FetchDataTable("SELECT MAX(MONTH(tanggal)) FROM penjualan WHERE tanggal LIKE '" & tahun & "%'")
BulanCombo.Items.Clear()
Dim minbulan, maxbulan As Integer minbulan = dtmin.Rows(0)(0) maxbulan = dtmax.Rows(0)(0) While minbulan <= maxbulan
BulanCombo.Items.Add(convMonth(minbulan)) minbulan = minbulan + 1
End While End Sub
Public Sub newId()
Dim da As sqldataAdapter Dim ds As New DataSet Dim dt As DataTable
da = FetchData("SELECT COUNT(*) FROM penjualan") da.Fill(ds, "table")
dt = ds.Tables(0)
Dim n As Integer
n = dt.Rows(0)(0) + 1 While temp = False Dim kd As String
kd = "TLR" & n.ToString
da = FetchData("SELECT COUNT(*) FROM penjualan WHERE kode='" & kd & "'") ds.Clear() da.Fill(ds, "table") dt = ds.Tables(0) If (dt.Rows(0)(0) > 0) Then n = n + 1 Else temp = True End If End While
KdPenjualanTxt.Text = "TLR" & n.ToString End Sub
Public Sub fillDG(ByVal q As String) Dim da As SqlDataAdapter
Dim ds As New DataSet da = FetchData(q) da.Fill(ds, "table")
If ds.Tables(0).Rows.Count = 0 Then
MsgBox("Data penjualan tidak dapat ditemukan") End If
DataGridView1.DataSource = ds.Tables(0) End Sub
Private Sub TutupBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TutupBtn.Click
Me.Close() End Sub
Private Sub FormPenjualan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
IsiTahun()
IsiBulan(TahunCombo.Text) newId()
btnState1()
fillDG("SELECT * FROM penjualan ORDER BY tanggal") KdPenjualanTxt.Enabled = False
End Sub
Private Sub TahunCombo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TahunCombo.SelectedIndexChanged
IsiBulan(TahunCombo.Text) End Sub
Private Sub SimpanBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpanBtn.Click
If JlhPenjualanTxt.Text = "" Then MsgBox("Isi jumlah penjualan") Else
Dim da As SqlDataAdapter Dim ds As New DataSet Dim dt As DataTable
da = FetchData("SELECT COUNT(*) FROM penjualan WHERE tanggal='" & Format(PeriodeDP.Value, "yyyy-MM-dd") & "'")
da.Fill(ds, "table") dt = ds.Tables(0)
If (dt.Rows(0)(0) > 0) Then
MsgBox("Data penjualan sudah terdaftar untuk tanggal ini") Exit Sub
End If
RunQuery("INSERT INTO penjualan(kode, tanggal, jumlah) VALUES ('" & KdPenjualanTxt.Text & "','" & Format(PeriodeDP.Value, "yyyy-MM-dd") & "','" & Val(JlhPenjualanTxt.Text) & "')")
newId()
JlhPenjualanTxt.Clear()
fillDG("SELECT * FROM penjualan ORDER BY tanggal") JlhPenjualanTxt.Focus()
End If End Sub
Private Sub BatalBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BatalBtn.Click
newId() PeriodeDP.Value = Today JlhPenjualanTxt.Clear() btnState1() DataGridView1.ClearSelection() JlhPenjualanTxt.Focus() End Sub
Private Sub DataGridView1_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellDoubleClick btnState2() KdPenjualanTxt.Text = DataGridView1.SelectedRows(0).Cells(0).Value PeriodeDP.Value = DataGridView1.SelectedRows(0).Cells(1).Value JlhPenjualanTxt.Text = DataGridView1.SelectedRows(0).Cells(2).Value JlhPenjualanTxt.Focus() End Sub
Private Sub HapusBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HapusBtn.Click
RunQuery("DELETE FROM penjualan WHERE kode='" & KdPenjualanTxt.Text & "'")
fillDG("SELECT * FROM penjualan ORDER BY tanggal") newId() PeriodeDP.Value = Today JlhPenjualanTxt.Clear() btnState1() DataGridView1.ClearSelection() JlhPenjualanTxt.Focus() End Sub
Private Sub CariBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CariBtn.Click
Dim cond As String
If deconvMonth(BulanCombo.Text) = 1 Or deconvMonth(BulanCombo.Text) = 2 Then
cond = " tanggal LIKE '%" & TahunCombo.Text & "%-0" & deconvMonth(BulanCombo.Text) & "-%'"
cond = " tanggal LIKE '%" & TahunCombo.Text & "%-%" & deconvMonth(BulanCombo.Text) & "%-%'"
End If
fillDG("SELECT * FROM penjualan WHERE kode LIKE '%" & TextBox1.Text & "%' AND" & cond & " ORDER BY tanggal")
End Sub
Private Sub UbahBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UbahBtn.Click
If JlhPenjualanTxt.Text = "" Then MsgBox("Isi jumlah penjualan") Else
RunQuery("UPDATE penjualan SET tanggal='" & Format(PeriodeDP.Value, "yyyy-MM-dd") & "', jumlah='" & Val(JlhPenjualanTxt.Text) & "' WHERE kode='" & KdPenjualanTxt.Text & "'")
fillDG("SELECT * FROM penjualan ORDER BY tanggal") newId() PeriodeDP.Value = Today JlhPenjualanTxt.Clear() btnState1() DataGridView1.ClearSelection() JlhPenjualanTxt.Focus() End If End Sub End Class 4. Halaman Peramalan
Public Class FormPeramalan
Dim cond As String
Dim Dmin, Dmax, n As Double Dim interval As Double Dim u(1000, 2) As Long Dim c, a(1000000) As Integer Dim flrg(1000) As ArrayList
Private Sub getMin()
Dim dtmin, dtmax As DataTable
dtmin = FetchDataTable("SELECT MIN(jumlah) FROM penjualan " & cond) dtmax = FetchDataTable("SELECT MAX(jumlah) FROM penjualan " & cond) If IsDBNull(dtmin.Rows(0)(0)) Then
MsgBox("Tidak ada penjualan pada range periode ini") Exit Sub
End If
Dmin = dtmin.Rows(0)(0) Dmax = dtmax.Rows(0)(0) End Sub
Private Sub getFLRG() Dim dtmin As DataTable
dtmin = FetchDataTable("SELECT MIN(jumlah) FROM penjualan " & cond) If IsDBNull(dtmin.Rows(0)(0)) Then
Exit Sub End If
dt = FetchDataTable("SELECT jumlah, tanggal FROM penjualan " & cond & " ORDER BY tanggal")
If dt.Rows.Count < 3 Then
MsgBox("Data penjualan pada range tanggal tidak mencukupi untuk melakukan peramalan")
Exit Sub End If
Dim ave As Double Dim i As Long n = dt.Rows.Count ave = 0
For i = 0 To dt.Rows.Count - 2
ave += Math.Abs(dt.Rows(i)(0) - dt.Rows(i + 1)(0)) / n Next ave /= 2 Dim pw10 As Double pw10 = 0.1 While (pw10 <= ave) pw10 *= 10 End While pw10 /= 10 interval = Math.Round(ave / pw10) * pw10 c = 0
For i = Dmin To Dmax Step interval u(c, 0) = i u(c, 1) = i + interval c += 1 Next For i = 0 To dt.Rows.Count - 1 Dim tmp As Integer tmp = 0
While (dt.Rows(i)(0) >= u(tmp, 1)) And tmp < c tmp += 1
End While a(i) = tmp Next
For i = 0 To 999
flrg(i) = New ArrayList Next For i = 0 To dt.Rows.Count - 2 flrg(a(i)).Add(a(i + 1)) Next DataGridView1.DataSource = Nothing DataGridView1.Columns.Clear() Dim dt2 As DataTable
dt2 = FetchDataTable("SELECT * FROM penjualan " & cond & " ORDER BY tanggal")
Dim tgl As Date
dt2.Rows.Add("Peramalan", tgl, 0) DataGridView1.DataSource = dt2
Dim dc As New DataGridViewTextBoxColumn Dim cell As New DataGridViewTextBoxCell
dc.HeaderText = "Peramalan" dc.CellTemplate = cell
DataGridView1.Columns.Add(dc)
DataGridView1.Rows(0).Cells(3).Value = 0
For i = 0 To dt.Rows.Count - 1 Dim temp As Double
temp = 0
If (flrg(a(i)).Count < 1) Then
temp = Math.Round(aver(u(a(i), 0), u(a(i), 1))) Else
Dim ntemp As Double Dim j As Long
ntemp = flrg(a(i)).Count For j = 0 To ntemp - 1 Dim k As Long
k = flrg(a(i)).Item(j)
temp += aver(u(k, 0), u(k, 1)) / ntemp Next
End If
DataGridView1.Rows(i + 1).Cells(3).Value = Math.Round(temp) Next
Dim err As Double err = 0 For i = 1 To dt.Rows.Count - 1 err += (Math.Abs(DataGridView1.Rows(i).Cells(2).Value - DataGridView1.Rows(i).Cells(3).Value) / DataGridView1.Rows(i).Cells(2).Value) / CDbl(n - 1) Next ErrorLbl.Text = Math.Round(err * 100, 2) End Sub
Private Sub proses() getMin()
getFLRG() End Sub
Private Sub IsiTahun()
Dim dtmin, dtmax As DataTable
dtmin = FetchDataTable("SELECT MIN(YEAR(tanggal)) FROM penjualan") dtmax = FetchDataTable("SELECT MAX(YEAR(tanggal)) FROM penjualan") TahunCombo.Items.Clear()
Dim mintahun, maxtahun, i As Integer mintahun = dtmin.Rows(0)(0)
maxtahun = dtmax.Rows(0)(0) For i = mintahun To maxtahun TahunCombo.Items.Add(i) Next
End Sub
Private Sub IsiBulan(ByVal tahun As String) Dim dtmin, dtmax As DataTable
dtmin = FetchDataTable("SELECT MIN(MONTH(tanggal)) FROM penjualan WHERE tanggal LIKE '" & tahun & "%'")
dtmax = FetchDataTable("SELECT MAX(MONTH(tanggal)) FROM penjualan WHERE tanggal LIKE '" & tahun & "%'")
BulanCombo.Items.Clear()
Dim minbulan, maxbulan As Integer minbulan = dtmin.Rows(0)(0)
maxbulan = dtmax.Rows(0)(0) While minbulan <= maxbulan
BulanCombo.Items.Add(convMonth(minbulan)) minbulan = minbulan + 1
End While End Sub
Private Sub TutupBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TutupBtn.Click
Me.Close() End Sub
Private Sub FormPeramalan_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
RadioButton1.Checked = True GroupBox1.Enabled = True RadioButton2.Checked = False GroupBox2.Enabled = False IsiTahun() IsiBulan(TahunCombo.Text) Button4.Enabled = False Button3.Enabled = False End Sub
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
If RadioButton1.Checked Then GroupBox1.Enabled = True Else GroupBox1.Enabled = False End If End Sub
Private Sub RadioButton2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton2.CheckedChanged
If RadioButton2.Checked Then GroupBox2.Enabled = True Else GroupBox2.Enabled = False End If End Sub
Private Sub Tanggal1DP_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tanggal1DP.ValueChanged
If Tanggal1DP.Value > Tanggal2DP.Value Then Tanggal1DP.Value = Tanggal2DP.Value End If
End Sub
Private Sub Tanggal2DP_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tanggal2DP.ValueChanged
If Tanggal2DP.Value < Tanggal1DP.Value Then Tanggal2DP.Value = Tanggal1DP.Value End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button4.Enabled = True Button3.Enabled = True
MsgBox("Pilih bulan dan tahun") Else
If deconvMonth(BulanCombo.Text) = 1 Or deconvMonth(BulanCombo.Text) = 2 Then
cond = " WHERE tanggal LIKE '%" & TahunCombo.Text & "%-0" & deconvMonth(BulanCombo.Text) & "-%'"
Else
cond = " WHERE tanggal LIKE '%" & TahunCombo.Text & "%-%" & deconvMonth(BulanCombo.Text) & "%-%'"
End If proses() End If End Sub
Private Sub TahunCombo_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TahunCombo.SelectedIndexChanged
IsiBulan(TahunCombo.Text) End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Button4.Enabled = True Button3.Enabled = True
cond = "WHERE tanggal BETWEEN '" & Format(Tanggal1DP.Value, "yyyy-MM- dd") & "' AND '" & Format(Tanggal2DP.Value, "yyyy-MM-dd") & "'"
proses() End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
FormGrafik.Show() End Sub
'Print data grid
Private oStringFormat As StringFormat
Private oStringFormatComboBox As StringFormat Private oButton As Button
Private oCheckbox As CheckBox Private oComboBox As ComboBox Private nTotalWidth As Int16 Private nRowPos As Int16 Private NewPage As Boolean Private nPageNo As Int16 Private Header As String
Private sUserName As String = FormUtama.LabelPengguna.Text
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint oStringFormat = New StringFormat
oStringFormat.Alignment = StringAlignment.Near oStringFormat.LineAlignment = StringAlignment.Center oStringFormat.Trimming = StringTrimming.EllipsisCharacter oStringFormatComboBox = New StringFormat
oStringFormatComboBox.LineAlignment = StringAlignment.Center oStringFormatComboBox.FormatFlags = StringFormatFlags.NoWrap oStringFormatComboBox.Trimming = StringTrimming.EllipsisCharacter
oButton = New Button oCheckbox = New CheckBox oComboBox = New ComboBox nTotalWidth = 0
For Each oColumn As DataGridViewColumn In DataGridView1.Columns nTotalWidth += oColumn.Width Next nPageNo = 1 NewPage = True nRowPos = 0 End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage Static oColumnLefts As New ArrayList
Static oColumnWidths As New ArrayList Static oColumnTypes As New ArrayList Static nHeight As Int16
Dim nWidth, i, nRowsPerPage As Int16 Dim nTop As Int16 = e.MarginBounds.Top Dim nLeft As Int16 = e.MarginBounds.Left If nPageNo = 1 Then
For Each oColumn As DataGridViewColumn In DataGridView1.Columns nWidth = CType(Math.Floor(oColumn.Width / nTotalWidth * nTotalWidth * (e.MarginBounds.Width / nTotalWidth)), Int16)
nHeight = e.Graphics.MeasureString(oColumn.HeaderText, oColumn.InheritedStyle.Font, nWidth).Height + 11 oColumnLefts.Add(nLeft) oColumnWidths.Add(nWidth) oColumnTypes.add(oColumn.GetType) nLeft += nWidth Next End If
Do While nRowPos < DataGridView1.Rows.Count
Dim oRow As DataGridViewRow = DataGridView1.Rows(nRowPos) If nTop + nHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then DrawFooter(e, nRowsPerPage) NewPage = True nPageNo += 1 e.HasMorePages = True Exit Sub Else If NewPage Then ' Draw Header
e.Graphics.DrawString(Header, New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString(Header, New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13)
' Draw Columns
nTop = e.MarginBounds.Top i = 0
For Each oColumn As DataGridViewColumn In DataGridView1.Columns
e.Graphics.FillRectangle(New
SolidBrush(Drawing.Color.LightGray), New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight)) e.Graphics.DrawString(oColumn.HeaderText,
New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat) i += 1 Next NewPage = False End If nTop += nHeight i = 0
For Each oCell As DataGridViewCell In oRow.Cells
If oColumnTypes(i) Is GetType(DataGridViewTextBoxColumn) OrElse oColumnTypes(i) Is GetType(DataGridViewLinkColumn) Then
e.Graphics.DrawString(oCell.Value.ToString,
oCell.InheritedStyle.Font, New SolidBrush(oCell.InheritedStyle.ForeColor), New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat) ElseIf oColumnTypes(i) Is GetType(DataGridViewButtonColumn) Then
oButton.Text = oCell.Value.ToString
oButton.Size = New Size(oColumnWidths(i), nHeight) Dim oBitmap As New Bitmap(oButton.Width,
oButton.Height)
oButton.DrawToBitmap(oBitmap, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
ElseIf oColumnTypes(i) Is GetType(DataGridViewCheckBoxColumn) Then
oCheckbox.Size = New Size(14, 14)
oCheckbox.Checked = CType(oCell.Value, Boolean) Dim oBitmap As New Bitmap(oColumnWidths(i), nHeight) Dim oTempGraphics As Graphics =
Graphics.FromImage(oBitmap)
oTempGraphics.FillRectangle(Brushes.White, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
oCheckbox.DrawToBitmap(oBitmap, New Rectangle(CType((oBitmap.Width - oCheckbox.Width) / 2, Int32),
CType((oBitmap.Height - oCheckbox.Height) / 2, Int32), oCheckbox.Width, oCheckbox.Height))
e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
ElseIf oColumnTypes(i) Is GetType(DataGridViewComboBoxColumn) Then
oComboBox.Size = New Size(oColumnWidths(i), nHeight) Dim oBitmap As New Bitmap(oComboBox.Width,
oComboBox.Height)
oComboBox.DrawToBitmap(oBitmap, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
e.Graphics.DrawString(oCell.Value.ToString,
oCell.InheritedStyle.Font, New SolidBrush(oCell.InheritedStyle.ForeColor), New RectangleF(oColumnLefts(i) + 1, nTop, oColumnWidths(i) - 16, nHeight),
oStringFormatComboBox)
ElseIf oColumnTypes(i) Is GetType(DataGridViewImageColumn) Then
Dim oCellSize As Rectangle = New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight)
Dim oImageSize As Size = CType(oCell.Value, Image).Size e.Graphics.DrawImage(oCell.Value, New
Rectangle(oColumnLefts(i) + CType(((oCellSize.Width - oImageSize.Width) / 2), Int32), nTop + CType(((oCellSize.Height - oImageSize.Height) / 2), Int32), CType(oCell.Value, Image).Width, CType(oCell.Value, Image).Height))
End If
e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight)) i += 1 Next End If nRowPos += 1 nRowsPerPage += 1 Loop DrawFooter(e, nRowsPerPage) e.HasMorePages = False End Sub
Private Sub DrawFooter(ByVal e As
System.Drawing.Printing.PrintPageEventArgs, ByVal RowsPerPage As Int32) Dim sPageNo As String = nPageNo.ToString + " of " +
Math.Ceiling(DataGridView1.Rows.Count / RowsPerPage).ToString ' Right Align - User Name
e.Graphics.DrawString(sUserName, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(sPageNo, DataGridView1.Font, e.MarginBounds.Width).Width), e.MarginBounds.Top +
e.MarginBounds.Height + 7) ' Left Align - Date/Time
e.Graphics.DrawString(Now.ToLongDateString + " " +
Now.ToShortTimeString, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top + e.MarginBounds.Height + 7)
' Center - Page No. Info
e.Graphics.DrawString(sPageNo, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(sPageNo, DataGridView1.Font, e.MarginBounds.Width).Width) / 2, e.MarginBounds.Top + e.MarginBounds.Height + 31)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If RadioButton1.Checked Then
Header = "Data penjualan dan peramalan pada bulan " & BulanCombo.Text & " tahun " & TahunCombo.Text
Else
Header = "Data penjualan dan peramalan " & Tanggal1DP.Text & " - " & Tanggal2DP.Text
End If
Dim dlg As New PrintPreviewDialog() dlg.Width = 600 dlg.Height = 700 dlg.Document = PrintDocument1 dlg.ShowDialog() End Sub End Class 5. Halaman Grafik
Public Class FormGrafik
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim i As Integer
dt.Columns.Add("tanggal") dt.Columns.Add("jumlah") dt.Columns.Add("peramalan")
For i = 0 To FormPeramalan.DataGridView1.Rows.Count - 1 Dim dr As DataRow = dt.NewRow
dr("tanggal") = Format(FormPeramalan.DataGridView1.Rows(i).Cells(1).Value, "yyyy-MM-dd") dr("jumlah") = Math.Round(FormPeramalan.DataGridView1.Rows(i).Cells(2).Value) dr("peramalan") = Math.Round(FormPeramalan.DataGridView1.Rows(i).Cells(3).Value) dt.Rows.Add(dr) Next Chart1.DataSource = dt
Chart1.Series(0).Name = "Hasil sebenarnya" Chart1.Series.Add("Prediksi") Chart1.Series(0).IsValueShownAsLabel = True Chart1.Series(1).IsValueShownAsLabel = True Chart1.Series(0).XValueMember = "tanggal" Chart1.Series(1).XValueMember = "tanggal" Chart1.Series(0).YValueMembers = "jumlah" Chart1.Series(1).YValueMembers = "peramalan" Chart1.DataBind() End Sub
'Print data grid
Private oStringFormat As StringFormat
Private oStringFormatComboBox As StringFormat Private oButton As Button
Private oCheckbox As CheckBox Private oComboBox As ComboBox Private nTotalWidth As Int16 Private nRowPos As Int16 Private NewPage As Boolean Private nPageNo As Int16 Private Header As String
Private sUserName As String = FormUtama.LabelPengguna.Text
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint oStringFormat = New StringFormat
oStringFormat.Alignment = StringAlignment.Near oStringFormat.LineAlignment = StringAlignment.Center oStringFormat.Trimming = StringTrimming.EllipsisCharacter oStringFormatComboBox = New StringFormat
oStringFormatComboBox.LineAlignment = StringAlignment.Center oStringFormatComboBox.FormatFlags = StringFormatFlags.NoWrap oStringFormatComboBox.Trimming = StringTrimming.EllipsisCharacter oButton = New Button
oCheckbox = New CheckBox