完整的代码改为这样也一样效果:
With Tables("多栏式明细账_Table1")
For i As Integer = .Rows.count - 1 To 0 Step -1
.Rows(i).Delete
Next
Dim g As Subtotalgroup
.SubtotalGroups.Clear()
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.CommandText = "Select 日期,字号,凭证号,摘要,二级科目,借方金额 fr om {财务数据源} Where [日期] >= #" & e.Form.Controls("StartDate").Value & "# And [日期] <= #" & e.Form.Controls("EndDate").Value & "# And [一级科目] = '" & e.Form.Controls("combobox1").Value & "'"
dt = cmd.ExecuteReader()
Dim b As New CrossTableBuilder("统计表1",dt)
b.HGroups.AddDef("日期",DateGroupEnum.Year,"年")
b.HGroups.AddDef("日期",DateGroupEnum.Month,"月")
b.HGroups.AddDef("日期",DateGroupEnum.Day,"日")
b.HGroups.AddDef("字号")
b.HGroups.AddDef("凭证号")
b.HGroups.AddDef("摘要")
b.VGroups.AddDef("二级科目","{0}")
b.Totals.AddDef("借方金额","借方金额")
b.HorizontalTotal = True
b.OrderByTotal = True
b.Build(True)
.DataSource = b.BuildDataSource
Dim s As String = ""
For Each c As Col In .Cols
If c.Name Like "借方金额_*" Then
s = s & "," & c.name
End If
Next
MessageBox.Show(s)
g = New Subtotalgroup
g.GroupOn = "月"
g.TotalOn = s.Trim(",")
g.Caption = "本月发生额"
.SubtotalGroups.Add(g)
g = New Subtotalgroup
g.GroupOn = "月"
g.Caption = "{0}月"
.SubtotalGroups.Add(g)
.Sort = "年,月"
.Subtotal(True)
Dim r As Row
For i As Integer = 0 To .Rows.Count(True) - 1
r = .Rows(i,True)
If r.IsGroup AndAlso r("年") Like "*月" '如果是分组行
Dim f As String = "年 = " & .Rows(i-2,True)("年") & " And 月 <= " & r("年").trim("月")
r("年") = "本年累计"
For Each c As Col In .Cols
If c.name = c.Name Like "借方金额_*" Then
r(c.name) = .Compute("Sum(" & c.name & ")",f)
End If
Next
End If
Next
Dim ct As WinForm.Table = e.Form.Controls("Table1")
Dim t As Table = ct.Table
Dim str As String
Dim w As Integer = 0
For Each c As Col In t.Cols
If c.Visible Then
If s.Trim(",").Contains(c.Name) Then
str = str & "|" & c.Name & "|[width]"
Else
If c.name = "年" OrElse c.name = "月" OrElse c.name = "日" OrElse c.name = "字号" OrElse c.name = "凭证号" Then
str = str & "|" & c.Name & "|35"
w + = 35
ElseIf c.Name = "摘要" Then
str = str & "|" & c.Name & "|300"
w + = 300
ElseIf c.Width = -1 Then
str = str & "|" & c.Name & "|60"
w + = 60
End If
End If
End If
Next
Dim w2 As Integer = (ct.Width - w) / s.Trim(",").Count
str = str.trim("|").Replace("[width]",w2)
t.SetColVisibleWidth(str)
End With