汗
Dim jb As New SQLJoinTableBuilder("利润表附表","部门损益总账")
jb.AddTable("部门损益总账","部门名称","部门档案","部门名称",JoinModeEnum.inner) '添加统计表
jb.AddTable("部门损益总账","科目编号","科目档案","科目编码",JoinModeEnum.inner) '添加统计表
jb.AddCols("{部门档案}.所属单位", "部门类型", "所属日期", "上级部门", "一级科目","借方发生")
jb.Build
Dim dt1 As DataTable = DataTables("部门档案")
Dim dt2 As DataTable = DataTables("部门损益总账")
Dim dt3 As DataTable = DataTables("利润表附表")
Dim dt4 As DataTable = DataTables("科目档案")
'dt3.DataRows.Clear
Dim kms As List(Of String) = dt3.GetValues("一级科目")
Dim min As Date = dt2.Compute("min(所属日期)")
Dim max As Date = dt2.Compute("max(所属日期)")
For Each dr As DataRow In dt1.Select("")
Dim sd As Date = min
Do While Format(sd, "yyyyMM") <= Format(max, "yyyyMM")
For Each km As String In kms
Dim ndr As DataRow = dt3.AddNew
ndr("一级科目") = km
ndr("所属单位") = dr("所属单位")
ndr("部门类型") = dr("部门类型")
ndr("上级部门") = dr("上级部门")
ndr("所属日期") = sd
Next
sd = sd.AddMonths(1)
Loop
Next
Dim b As New CrossTableBuilder("利润表附表", dt3) '定义变量利润表附表,并从部门损益总账统计数据
b.HGroups.AddDef("所属单位") '添加所属单位列用于水平分组
b.HGroups.AddDef("部门类型") '添加部门类型列用于水平分组
b.HGroups.AddDef("上级部门","部门") '添加部门名称列用于水平分组,并将列名称重新命名为部门
b.HGroups.AddDef("所属日期",DateGroupEnum.year,"年")
b.HGroups.AddDef("所属日期",DateGroupEnum.month,"月")
b.VGroups.AddDef("一级科目") '添加一级科目名称列用于垂直分组
b.Totals.AddDef("借方发生","本月") '添加借方发生列用于统计
b.Totals.AddDef("借方发生","累计",True) '添加借方发生列用于统计且截止累计金额
b.Decimals = 2 '小数点取0位
b.Build '生成统计表
Dim t3 As Table = Tables("利润表附表")
Dim drs As List(Of DataRow) = t3.DataTable.Select("", "部门,年")
For Each c As Col In t3.Cols
If c.Caption Like "*_累计" Then
Dim pdr As DataRow = Nothing
Dim by As String = c.name.Replace("_up", "")
For Each dr As DataRow In drs
If pdr Is Nothing OrElse dr("部门") <> pdr("部门") OrElse dr("年") <> pdr("年") Then
dr(c.name) = dr(by)
Else
dr(c.name) = dr(by) + pdr(by)
End If
pdr = dr
Next
End If
Next
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)-[营业费用_累计]-[其他支出_累计]")
With Tables("利润表附表") '改变统计表的列的位置
.Cols("所属单位").Move(2)
.Cols("部门类型").Move(3)
.Cols("部门").Move(4)
.Cols("利润_本月").Move(5)
.Cols("利润_累计").Move(6)
.Cols(dic("主营业务收入_本月")).Move(7)
.Cols(dic("主营业务收入_累计")).Move(8)
.Cols(dic("主营业务成本_本月")).Move(9)
.Cols(dic("主营业务成本_累计")).Move(10)
.Cols("营业费用_本月").Move(11)
.Cols("营业费用_累计").Move(12)
.Cols(dic("资产减值损失_本月")).Move(13)
.Cols(dic("资产减值损失_累计")).Move(14)
.Cols("其他支出_本月").Move(15)
.Cols("其他支出_累计").Move(16)
End With
With Tables("利润表附表") '设置各列的宽度
.AutoSizeCols(15) '统一设置统计列的宽度
.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
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 AndAlso c.Name <> "年" AndAlso c.Name <> "月" 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 Then
r(dic("主营业务收入_累计")) = 0
r(dic("主营业务成本_累计")) = 0
r("营业费用_累计") = 0
r(dic("资产减值损失_累计")) = 0
r("其他支出_累计") = 0
r("利润_累计") = 0
End If
Next
MainTable = Tables("利润表附表") '打开生成的统计表
CurrentTable.Cols.Frozen = 5 '冻结前四列
DataTables("利润表附表").SysStyles("Subtotal0").BackColor = Color.pink '设置报表样式
DataTables("利润表附表").SysStyles("Subtotal0").FontBold = True
DataTables("利润表附表").SysStyles("GrandTotal").FontBold = True