Imports System.Windows.Forms.DataVisualization.Charting Public Class 車輛銷售報表 ReadOnly ds As New DataSet : ReadOnly ds1 As New DataSet Dim NUM1, NUM2, NUM3 As Integer : Dim 狀態, 價, 車 As String Private maxY As Long = 0 Private Sub 車輛銷售報表_Load(sender As Object, e As EventArgs) Handles MyBase.Load If CC(104) = False Then 車廠型態 = False Else 線路選擇.ShowDialog() : 線路選擇.BringToFront() End If Me.MdiParent = ICS_ASMS_ERP_SYS : Me.WindowState = 2 : Me.AutoScroll = True If 車廠型態 = True Then 狀態 = "車輛買賣" 價 = "賣出售價" Else 狀態 = "保養維修" 價 = "買入進價" End If ComboBox1下拉表單資料載入() Set_清單1() : Set_清單2() End Sub Private Function IsVerticalScrollBarVisible(dgv As DataGridView) As Boolean Return dgv.FirstDisplayedScrollingRowIndex > 0 OrElse dgv.DisplayedRowCount(False) < dgv.Rows.Count End Function Private Sub ComboBox1下拉表單資料載入() conn.Close() SQL_營運報表_年份查詢() 年份清單_cb.Items.Clear() While (dr.Read()) : 年份清單_cb.Items.Add(dr("年份")) : End While conn.Close() 年份清單_cb.Text = Year(Today) 月份清單_cb.Items.Clear() 月份清單_cb.Items.Add("") Dim currentMonth As Integer = DateTime.Now.Month For month As Integer = 1 To 12 Dim monthString As String = month.ToString("D2") ' 这里使用 "D2" 格式化将单个数字的月份前面补零 月份清單_cb.Items.Add(monthString) ' 如果这个月份是当前月份,可以将其选中 If month = currentMonth Then 月份清單_cb.SelectedItem = monthString End If Next End Sub Private Sub Set_清單1() Dim ds1, ds2 As New DataSet : 車種_dgv.DataSource = Nothing : ds1.Clear() : 合計1_dgv.DataSource = Nothing : ds2.Clear() 車種_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 車種_dgv.ColumnHeadersHeight = 25 : 車種_dgv.AllowUserToAddRows = False : 車種_dgv.RowTemplate.Height = 20 合計1_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 合計1_dgv.ColumnHeadersHeight = 25 : 合計1_dgv.AllowUserToAddRows = False : 合計1_dgv.RowTemplate.Height = 20 合計1_dgv.ScrollBars = ScrollBars.None : 合計1_dgv.ColumnHeadersVisible = False PA58 = 年份清單_cb.Text & 月份清單_cb.Text SQL_車輛銷售報表_車種(價, 狀態) : da.Fill(ds1) : 車種_dgv.DataSource = ds1.Tables(0) : conn.Close() SQL_車輛銷售報表_車種合計(價, 狀態) : da.Fill(ds2) : 合計1_dgv.DataSource = ds2.Tables(0) : conn.Close() 車種_dgv.Columns(0).FillWeight = 40 : 車種_dgv.Columns(1).FillWeight = 20 : 車種_dgv.Columns(2).FillWeight = 40 車種_dgv.Columns("總價").DefaultCellStyle.Format = "#,##0" 車種_dgv.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 車種_dgv.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter 車種_dgv.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 車種_dgv.Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter 合計1_dgv.Columns(0).FillWeight = 40 : 合計1_dgv.Columns(1).FillWeight = 20 : 合計1_dgv.Columns(2).FillWeight = 40 合計1_dgv.Columns("總價").DefaultCellStyle.Format = "#,##0" : 合計1_dgv.Columns("次數").DefaultCellStyle.Format = "#,##0" 合計1_dgv.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 合計1_dgv.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter 合計1_dgv.Columns(2).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 合計1_dgv.Columns(2).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter NUM3 = 0 合計1_dgv.Rows(0).Cells(0).Value = "合計:" : 合計1_dgv.Rows(0).Cells(1).Value = "0" : 合計1_dgv.Rows(0).Cells(2).Value = "0" For i As Integer = 0 To 車種_dgv.Rows.Count - 1 合計1_dgv.Rows(0).Cells(1).Value += 車種_dgv.Rows(i).Cells(1).Value 合計1_dgv.Rows(0).Cells(2).Value += 車種_dgv.Rows(i).Cells(2).Value If 車種_dgv.Rows(i).Cells(2).Value > NUM3 Then NUM3 = 車種_dgv.Rows(i).Cells(2).Value End If Next If 車種_dgv.Rows.Count Mod 15 = 0 Then ' 如果能整除15,直接等于商 NUM1 = (車種_dgv.Rows.Count / 15) - 1 Else ' 如果不能整除15,向上取整 NUM1 = 車種_dgv.Rows.Count \ 15 End If NUM2 = 0 If IsVerticalScrollBarVisible(車種_dgv) Then : 合計1_dgv.Size = New Size(車種_dgv.Size.Width - 17, 合計1_dgv.Size.Height) Else : 合計1_dgv.Size = New Size(車種_dgv.Size.Width, 合計1_dgv.Size.Height) : End If If 車種_dgv.Rows.Count > 0 Then 彙總1() 下一頁_bt.Visible = True 上一頁_bt.Visible = True Else Chart2.Series.Clear() 下一頁_bt.Visible = False 上一頁_bt.Visible = False End If End Sub Private Sub Set_清單2() Dim ds1, ds2 As New DataSet : 計算_dgv.DataSource = Nothing : ds1.Clear() : 合計2_dgv.DataSource = Nothing : ds2.Clear() 計算_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 計算_dgv.ColumnHeadersHeight = 25 : 計算_dgv.AllowUserToAddRows = False : 計算_dgv.RowTemplate.Height = 20 合計2_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 合計2_dgv.ColumnHeadersHeight = 25 : 合計2_dgv.AllowUserToAddRows = False : 合計2_dgv.RowTemplate.Height = 20 合計2_dgv.ScrollBars = ScrollBars.None : 合計2_dgv.ColumnHeadersVisible = False SQL_車輛銷售報表_日期合計(價, 狀態) : da.Fill(ds2) : 合計2_dgv.DataSource = ds2.Tables(0) : conn.Close() 合計2_dgv.Columns("總價").DefaultCellStyle.Format = "#,##0" 合計2_dgv.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 合計2_dgv.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter Dim str1 As String = 年份清單_cb.Text Dim str2 As String = 月份清單_cb.Text If str2 <> "" Then PA58 = 年份清單_cb.Text & 月份清單_cb.Text SQL_車輛銷售報表_日期(價, 狀態) : da.Fill(ds1) : 計算_dgv.DataSource = ds1.Tables(0) : conn.Close() Dim table As New DataTable() table.Columns.Add("日期", GetType(String)) table.Columns.Add("金額", GetType(Decimal)) Dim daysInMonth As Integer = DateTime.DaysInMonth(CInt(str1), CInt(str2)) For day As Integer = 1 To daysInMonth Dim dateStr As String = str1 & str2.PadLeft(2, "0"c) & day.ToString().PadLeft(2, "0"c) table.Rows.Add(dateStr, 0) Next 日期_dgv.DataSource = table 日期_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 日期_dgv.ColumnHeadersHeight = 25 : 日期_dgv.AllowUserToAddRows = False : 日期_dgv.RowTemplate.Height = 20 日期_dgv.Columns("金額").DefaultCellStyle.Format = "#,##0" 日期_dgv.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 日期_dgv.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter For i As Integer = 0 To 日期_dgv.Rows.Count - 1 For j As Integer = 0 To 計算_dgv.Rows.Count - 1 If 日期_dgv.Rows(i).Cells("日期").Value = 計算_dgv.Rows(j).Cells("日期").Value Then 日期_dgv.Rows(i).Cells("金額").Value = 計算_dgv.Rows(j).Cells("總價").Value End If Next Next Else PA58 = 年份清單_cb.Text SQL_車輛銷售報表_日期年(價, 狀態) : da.Fill(ds1) : 計算_dgv.DataSource = ds1.Tables(0) : conn.Close() Dim table As New DataTable() table.Columns.Add("月份", GetType(String)) table.Columns.Add("金額", GetType(Decimal)) For day As Integer = 1 To 12 Dim dateStr As String = str1 & day.ToString().PadLeft(2, "0"c) table.Rows.Add(dateStr, 0) Next 日期_dgv.DataSource = table 日期_dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing 日期_dgv.ColumnHeadersHeight = 25 : 日期_dgv.AllowUserToAddRows = False : 日期_dgv.RowTemplate.Height = 20 日期_dgv.Columns("金額").DefaultCellStyle.Format = "#,##0" 日期_dgv.Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 日期_dgv.Columns(1).HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter For i As Integer = 0 To 日期_dgv.Rows.Count - 1 For j As Integer = 0 To 計算_dgv.Rows.Count - 1 If 日期_dgv.Rows(i).Cells("月份").Value = 計算_dgv.Rows(j).Cells("日期").Value Then 日期_dgv.Rows(i).Cells("金額").Value = 計算_dgv.Rows(j).Cells("總價").Value End If Next Next End If 合計2_dgv.Rows(0).Cells(0).Value = "合計:" : 合計2_dgv.Rows(0).Cells(1).Value = "0" For i As Integer = 0 To 日期_dgv.Rows.Count - 1 合計2_dgv.Rows(0).Cells(1).Value += 日期_dgv.Rows(i).Cells(1).Value Next If IsVerticalScrollBarVisible(日期_dgv) Then : 合計2_dgv.Size = New Size(日期_dgv.Size.Width - 17, 合計2_dgv.Size.Height) Else : 合計2_dgv.Size = New Size(日期_dgv.Size.Width, 合計2_dgv.Size.Height) : End If If 合計2_dgv.Rows(0).Cells(1).Value <> 0 Then 彙總() Else Chart1.Series.Clear() End If End Sub Private Sub 彙總() Chart1.Series.Clear() Chart1.Series.Add("金額") : Chart1.Series("金額").ChartType = SeriesChartType.Column Chart1.ChartAreas(0).BackColor = Color.Transparent : Chart1.Legends(0).BackColor = Color.Transparent Chart1.ChartAreas(0).AxisY.LabelStyle.Font = New Font("Arial", 8) : Chart1.ChartAreas(0).AxisY.LabelStyle.Format = "#,##0" For i As Integer = 0 To 日期_dgv.Rows.Count - 1 Dim fullString As String = 日期_dgv.Rows(i).Cells(0).Value.ToString Dim lastTwoChars As String = fullString.Substring(fullString.Length - 2) Chart1.Series("金額").Points.AddXY(lastTwoChars, CLng(日期_dgv.Rows(i).Cells(1).Value.ToString)) Next End Sub Private Sub 彙總1() Chart2.Series.Clear() Chart2.Series.Add("金額") : Chart2.Series("金額").ChartType = SeriesChartType.Column Chart2.Series.Add("次數") : Chart2.Series("次數").ChartType = SeriesChartType.FastLine Chart2.ChartAreas(0).BackColor = Color.Transparent : Chart2.Legends(0).BackColor = Color.Transparent Chart2.ChartAreas(0).AxisY.LabelStyle.Font = New Font("Arial", 8) : Chart2.ChartAreas(0).AxisY.LabelStyle.Format = "#,##0" Chart2.ChartAreas(0).AxisY.Minimum = 0 Dim sum3 As Double = 合計1_dgv.Rows(0).Cells(2).Value / 合計1_dgv.Rows(0).Cells(1).Value For i As Integer = 15 * NUM2 To (15 * (NUM2 + 1)) - 1 If i < 車種_dgv.Rows.Count Then Chart2.Series("金額").Points.AddXY(車種_dgv.Rows(i).Cells(0).Value.ToString, CLng(車種_dgv.Rows(i).Cells(2).Value.ToString)) Chart2.Series("次數").Points.AddXY(車種_dgv.Rows(i).Cells(0).Value.ToString, CLng(車種_dgv.Rows(i).Cells(1).Value.ToString) * sum3) End If Next End Sub Private Sub 下一頁_bt_Click(sender As Object, e As EventArgs) Handles 下一頁_bt.Click If NUM2 < NUM1 Then NUM2 += 1 End If 彙總1() End Sub Private Sub 上一頁_bt_Click(sender As Object, e As EventArgs) Handles 上一頁_bt.Click If NUM2 > 0 Then NUM2 -= 1 End If 彙總1() End Sub Private Sub 年份清單_cb_SelectedIndexChanged(sender As Object, e As EventArgs) Handles 年份清單_cb.SelectedIndexChanged maxY = 0 : Set_清單1() : Set_清單2() End Sub Private Sub 月份清單_cb_SelectedIndexChanged(sender As Object, e As EventArgs) Handles 月份清單_cb.SelectedIndexChanged maxY = 0 : Set_清單1() : Set_清單2() End Sub End Class