Dim b As New SQLCrossTableBuilder("损益总体比率","部门损益总账") '定义变量利润表附表,并从部门损益总账统计数据
b.AddTable("部门损益总账","部门名称","部门档案","部门名称") '添加统计表
b.AddTable("部门损益总账","科目编号","科目档案","科目编码") '添加统计表
b.HGroups.Adddef("所属日期",DateGroupEnum.none)
b.HGroups.AddDef("所属日期", DateGroupEnum.Year, "年")
b.HGroups.AddDef("所属日期", "月")
b.HGroups.AddDef("所属单位") '添加所属单位列用于水平分组
b.HGroups.AddDef("上级部门","部门") '添加部门名称列用于水平分组,并将列名称重新命名为部门
b.HGroups.AddDef("部门类型") '添加部门类型列用于水平分组
b.VGroups.AddDef("一级科目") '添加一级科目名称列用于垂直分组
b.Totals.AddDef("借方发生","本月") '添加借方发生列用于统计
b.Totals.AddDef("借方发生","累计",True) '添加借方发生列用于统计且截止累计金额
b.Decimals = 0 '小数点取0位
b.Filter = Filter
b.Build '生成统计表
Dim dic As new Dictionary(of String, String) '循环每一列,把标题和列名存储在字典里,然后引用,哪里需要某列的列名,就直接引用标题,如dic("标题名")
For Each c As Col In Tables("损益总体比率").cols
dic.add(c.Caption, c.name)
Next
If dic.ContainsKey("销售费用_本月") = False Then
DataTables("损益总体比率").dataCols.add("销售费用_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("销售费用_累计", Gettype(Double))
dic.add("销售费用_本月", "销售费用_本月")
dic.add("销售费用_累计", "销售费用_累计")
End If
If dic.ContainsKey("财务费用_本月") = False Then
DataTables("损益总体比率").dataCols.add("财务费用_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("财务费用_累计", Gettype(Double))
dic.add("财务费用_本月", "财务费用_本月")
dic.add("财务费用_累计", "财务费用_累计")
End If
If dic.ContainsKey("其他业务成本_本月") = False Then
DataTables("损益总体比率").dataCols.add("其他业务成本_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("其他业务成本_累计", Gettype(Double))
dic.add("其他业务成本_本月", "其他业务成本_本月")
dic.add("其他业务成本_累计", "其他业务成本_累计")
End If
If dic.ContainsKey("营业外支出_本月") = False Then
DataTables("损益总体比率").dataCols.add("营业外支出_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("营业外支出_累计", Gettype(Double))
dic.add("营业外支出_本月", "营业外支出_本月")
dic.add("营业外支出_累计", "营业外支出_累计")
End If
If dic.ContainsKey("其他业务收入_本月") = False Then
DataTables("损益总体比率").dataCols.add("其他业务收入_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("其他业务收入_累计", Gettype(Double))
dic.add("其他业务收入_本月", "其他业务收入_本月")
dic.add("其他业务收入_累计", "其他业务收入_累计")
End If
If dic.ContainsKey("营业外收入_本月") = False Then
DataTables("损益总体比率").dataCols.add("营业外收入_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("营业外收入_累计", Gettype(Double))
dic.add("营业外收入_本月", "营业外收入_本月")
dic.add("营业外收入_累计", "营业外收入_累计")
End If
If dic.ContainsKey("主营业务收入_本月") = False Then
DataTables("损益总体比率").dataCols.add("主营业务收入_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("主营业务收入_累计", Gettype(Double))
dic.add("主营业务收入_本月", "主营业务收入_本月")
dic.add("主营业务收入_累计", "主营业务收入_累计")
End If
If dic.ContainsKey("主营业务成本_本月") = False Then
DataTables("损益总体比率").dataCols.add("主营业务成本_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("主营业务成本_累计", Gettype(Double))
dic.add("主营业务成本_本月", "主营业务成本_本月")
dic.add("主营业务成本_累计", "主营业务成本_累计")
End If
If dic.ContainsKey("营业费用_本月") = False Then
dic.add("营业费用_本月", "营业费用_本月")
dic.add("营业费用_累计", "营业费用_累计")
End If
If dic.ContainsKey("资产减值损失_本月") = False Then
DataTables("损益总体比率").dataCols.add("资产减值损失_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("资产减值损失_累计", Gettype(Double))
dic.add("资产减值损失_本月", "资产减值损失_本月")
dic.add("资产减值损失_累计", "资产减值损失_累计")
End If
If dic.ContainsKey("其他支出_本月") = False Then
dic.add("其他支出_本月", "其他支出_本月")
dic.add("其他支出_累计", "其他支出_累计")
End If
DataTables("损益总体比率").dataCols.add("营业费用_本月", Gettype(Double), "isnull(" & dic("销售费用_本月") & ",0)+isnull(" & dic("财务费用_本月") & ",0)") '通过Add方法,动态增加临时列,并给临时列设置表达式,表达式引用字典的方式同直接引用有所区别
DataTables("损益总体比率").dataCols.add("营业费用_累计", Gettype(Double), "isnull(" & dic("销售费用_累计") & ",0)+isnull(" & dic("财务费用_累计") & ",0)")
DataTables("损益总体比率").dataCols.add("其他支出_本月", Gettype(Double), "isnull(" & dic("其他业务成本_本月") & ",0)+isnull(" & dic("营业外支出_本月") & ",0)-isnull(" & dic("其他业务收入_本月") & ",0)-isnull(" & dic("营业外收入_本月") & ",0)")
DataTables("损益总体比率").dataCols.add("其他支出_累计", Gettype(Double), "isnull(" & dic("其他业务成本_累计") & ",0)+isnull(" & dic("营业外支出_累计") & ",0)-isnull(" & dic("其他业务收入_累计") & ",0)-isnull(" & dic("营业外收入_累计") & ",0)")
DataTables("损益总体比率").dataCols.add("利润_本月", Gettype(Double), "isnull(" & dic("主营业务收入_本月") & ",0)-isnull(" & dic("主营业务成本_本月") & ",0)-isnull(" & dic("资产减值损失_本月") & ",0)-[营业费用_本月]-[其他支出_本月]")
DataTables("损益总体比率").dataCols.add("利润_累计", Gettype(Double), "isnull(" & dic("主营业务收入_累计") & ",0)-isnull(" & dic("主营业务成本_累计") & ",0)-isnull(" & dic("资产减值损失_累计") & ",0)-[营业费用_累计]-[其他支出_累计]")
DataTables("损益总体比率").dataCols.add("利润率_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("利润率_累计", Gettype(Double))
DataTables("损益总体比率").dataCols.add("毛利率_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("毛利率_累计", Gettype(Double))
DataTables("损益总体比率").dataCols.add("费用率_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("费用率_累计", Gettype(Double))
DataTables("损益总体比率").dataCols.add("打折率_本月", Gettype(Double))
DataTables("损益总体比率").dataCols.add("打折率_累计", Gettype(Double))
For Each c As Col In Tables("损益总体比率").Cols
If c.Caption Like "*率_本月" Or c.Caption Like "*率_累计" Then
c.DataCol.SetFormat("0.00%")
End If
Next
With Tables("损益总体比率") '改变统计表的列的位置
.Cols("所属日期").Move(1)
.Cols("部门类型").Move(2)
.Cols("利润_本月").Move(4)
.Cols("利润_累计").Move(5)
.Cols(dic("主营业务收入_本月")).Move(6)
.Cols(dic("主营业务收入_累计")).Move(7)
.Cols(dic("主营业务成本_本月")).Move(8)
.Cols(dic("主营业务成本_累计")).Move(9)
.Cols("营业费用_本月").Move(10)
.Cols("营业费用_累计").Move(11)
.Cols(dic("资产减值损失_本月")).Move(12)
.Cols(dic("资产减值损失_累计")).Move(13)
.Cols("其他支出_本月").Move(14)
.Cols("其他支出_累计").Move(15)
End With
With Tables("损益总体比率") '设置各列的宽度
.AutoSizeCols(15) '统一设置统计列的宽度
.Cols("所属日期").PrintWidth = 20
.Cols("所属单位").PrintWidth = 20
.Cols("部门").PrintWidth = 35
.Cols("部门类型").PrintWidth = 20
End With
With Tables("损益总体比率") '隐藏部分列
.Cols(dic("销售费用_本月")).Visible = False
.Cols(dic("销售费用_累计")).Visible = False
.Cols(dic("财务费用_本月")).Visible = False
.Cols(dic("财务费用_累计")).Visible = False
.Cols(dic("其他业务收入_本月")).Visible = False
.Cols(dic("其他业务收入_累计")).Visible = False
.Cols(dic("其他业务成本_本月")).Visible = False
.Cols(dic("其他业务成本_累计")).Visible = False
.Cols(dic("营业外收入_本月")).Visible = False
.Cols(dic("营业外收入_累计")).Visible = False
.Cols(dic("营业外支出_本月")).Visible = False
.Cols(dic("营业外支出_累计")).Visible = False
.Cols(dic("主营业务收入_本月")).Visible = False
.Cols(dic("主营业务收入_累计")).Visible = False
.Cols(dic("主营业务成本_本月")).Visible = False
.Cols(dic("主营业务成本_累计")).Visible = False
.Cols("营业费用_本月").Visible = False
.Cols("营业费用_累计").Visible = False
.Cols(dic("资产减值损失_本月")).Visible = False
.Cols(dic("资产减值损失_累计")).Visible = False
.Cols("其他支出_本月").Visible = False
.Cols("其他支出_累计").Visible = False
.Cols("利润_本月").Visible = False
.Cols("利润_累计").Visible = False
End With
Dim t As Table = Tables("损益总体比率")
Dim g As Subtotalgroup '以下为设置自定义汇总模式,b.Subtotal = True 不适用通过表达式生成的列
Dim cs As String = ""
For Each c As Col In Tables("损益总体比率").cols
If c.IsNumeric Then
cs &= c.name & ","
End If
Next
t.SubtotalGroups.Clear()
t.GroupAboveData = False
t.TreeVisible = False
t.SpillNode = False
g = New Subtotalgroup
g.Aggregate = AggregateEnum.Sum
g.GroupOn = "部门类型"
g.TotalOn = cs.trim(",")
g.Caption = "{0} 小计"
t.SubtotalGroups.Add(g)
g = New Subtotalgroup
g.Aggregate = AggregateEnum.Sum
g.GroupOn = "*"
g.TotalOn = cs.trim(",")
g.Caption = "总计"
t.SubtotalGroups.Add(g)
t.Subtotal()
Dim r As Row
For i As Integer = 0 To t.Rows.Count(True) - 1
r = t.Rows(i,True)
If r.IsGroup And (r(dic("主营业务收入_本月")) = 0 Or r(dic("主营业务收入_本月")) Is Nothing) Then
r("利润率_本月") = 0
r("利润率_累计") = 0
r("毛利率_本月") = 0
r("毛利率_累计") = 0
r("费用率_本月") = 0
r("费用率_累计") = 0
r("打折率_本月") = 0
r("打折率_累计") = 0
Else
r("利润率_本月") = r("利润_本月")/r(dic("主营业务收入_本月"))
r("利润率_累计") = r("利润_累计")/r(dic("主营业务收入_累计"))
r("毛利率_本月") = (r(dic("主营业务收入_本月"))-r(dic("主营业务成本_本月")))/r(dic("主营业务收入_本月"))
r("毛利率_累计") = (r(dic("主营业务收入_累计"))-r(dic("主营业务成本_累计")))/r(dic("主营业务收入_累计"))
r("费用率_本月") = r("营业费用_本月")/r(dic("主营业务收入_本月"))
r("费用率_累计") = r("营业费用_累计")/r(dic("主营业务收入_累计"))
r("打折率_本月") = r(dic("资产减值损失_本月"))/r(dic("主营业务收入_本月"))
r("打折率_累计") = r(dic("资产减值损失_累计"))/r(dic("主营业务收入_累计"))
End If
Next
Dim Chart As WinForm.Chart '定义一个图表变量
Dim Series As WinForm.ChartSeries '定义一个图系变量
Chart= e.Form.Controls("毛利率同期") ' 引用窗口中的图表
Chart.SeriesList.Clear() '清除图表原来的图系
chart.AxisX.ClearValueLabel
chart.AxisY.ClearValueLabel
For Each Year As String In DataTables("损益总体比率").GetValues("年", filter)
Series = Chart.SeriesList.Add() '每年一个图系
Series.Text = Year '指定图系名称为年份
Series.Length = 12 '指定图系的数据点数,1年12个月
Chart.AxisX.Min = 1 '指定X轴的最小值,也就是从1月开始
Chart.AxisX.Max = 12 ''指定X轴的最大值,一年只有12个月
For Month As Integer = 1 To 12 '逐月设置坐标
Series.X(Month) = Month '指定水平坐标为月份
Chart.AxisX.SetValueLabel(1, "一月份")
Chart.AxisX.SetValueLabel(2, "二月份")
Chart.AxisX.SetValueLabel(3, "三月份")
Chart.AxisX.SetValueLabel(4, "四月份")
Chart.AxisX.SetValueLabel(5, "五月份")
Chart.AxisX.SetValueLabel(6, "六月份")
Chart.AxisX.SetValueLabel(7, "七月份")
Chart.AxisX.SetValueLabel(8, "八月份")
Chart.AxisX.SetValueLabel(9, "九月份")
Chart.AxisX.SetValueLabel(10, "十月份")
Chart.AxisX.SetValueLabel(11, "十一月份")
Chart.AxisX.SetValueLabel(12, "十二月份")
Dim r1 As DataRow = DataTables("损益总体比率").Find("年 = " & Year & " And 月 = " & Month)'找出对应年月的行
If r1 IsNot Nothing '如果找到对应年月的行
Series.Y(Month) = r1("毛利率_本月") '指定数量作为垂直坐标
End If
Next
Next
Chart.AxisX.AnnoWithLabels = True '启用字符标示
Chart.TopMost = True '不同图表间切换
Chart.SeriesList(0).DataLabelText = "{#YVAL}" '显示数据标记的值
Chart.SeriesList(0).TooltipText = "{#YVAL}" '停在数据标记上时是否显示值
Chart.SeriesList(0).LineColor = Color.Red '设置连接线的颜色
Chart.SeriesList(0).LineThickNess = 2 '设置连接线的粗细
Chart.SeriesList(0).MarkShape = MarkShapeEnum.Dot '设置数据点的形状
Chart.SeriesList(0).MarkSize = 10 '设置数据点的大小
Chart.SeriesList(0).MarkColor = Color.Green '设置数据点的颜色
Chart.SeriesList(0).LinePattern = LinePatternEnum.Solid '设置连接线的类型
If Chart.SeriesList.count = 2 Then
Chart.SeriesList(1).DataLabelText = "{#YVAL}"
Chart.SeriesList(1).TooltipText = "{#YVAL}"
Chart.SeriesList(1).LineColor = Color.Green
Chart.SeriesList(1).LineThickNess = 2
Chart.SeriesList(1).MarkShape = MarkShapeEnum.Dot
Chart.SeriesList(1).MarkSize = 10
Chart.SeriesList(1).MarkColor = Color.Red
Chart.SeriesList(1).LinePattern = LinePatternEnum.Solid
End If
Chart.LegendVisible = True '显示图列
Chart.LegendCompass= CompassEnum.South '图列显示在南方(底端)