非自然月的统计
部分企业在统计数据的时候,并不使用自然月,例如有的从上月的26日到本月的25日算做一个月,如何完成种非自然月的统计呢?
我们下面介绍两个两个方法。
增加一个统计日期列
我们可以在表中再增加一个统计日期列,然后将表的DataColChanged事件代码设置为:
Select
Case e.DataCol.name
Case
"日期"
If e.NewValue
Is Nothing
Then
e.DataRow("统计日期")
= Nothing
Else
Dim
dt As Date
= e.NewValue
If
dt.Day > 25
Then
'如果为25日以后的日期
dt =
new Date(dt.year,dt.month,1)
'改为下个月的第一天
dt=
dt.AddMonths(1)
End If
e.DataRow("统计日期")
= dt
End
If
End
Select
之后我们根据这个新增加的统计日期列进行统计即可。
利用自定义表达式
如果使用SQLGroupTableBuilder或SQLCrossTableBuilder进行统计,那么我们无需额外增加一列,可以直接用自定义表达式作为分组,实现非自然月的统计。
例如按月统计销售数量和金额:
Dim
b As
New
SQLGroupTableBuilder("统计表1","订单")
b.Groups.AddExp("年","Year(iif(Day(日期)>
25,DateAdd('d',6,日期),日期))")
b.Groups.AddExp("月","Month(iif(Day(日期)>
25,DateAdd('d',6,日期),日期))")
b.Totals.AddDef("数量")
b.Totals.AddExp("金额","数量
* 单价")
b.Build()
MainTable =
Tables("统计表1")
上述代码利用表达式,如果如果是25日之后的日期,则将此日期增加6天,使其成为下个月的日期,然后再取年月参与统计。
需要注意的是,SQL Server的数据源并不支持iif函数,需要用Case When语句代替,此外DateAdd的第一个参数也不需要用单引号括起来,所以代码需要改为:
Dim
b As
New
SQLGroupTableBuilder("统计表1","订单")
b.ConnectionName
= "数据源名称"
b.Groups.AddExp("年","Year(Case
When Day(日期) > 25 Then DateAdd(d,6,日期) Else 日期 End)")
b.Groups.AddExp("月","Month(Case
When Day(日期)
> 25 Then DateAdd(d,6,日期)
Else 日期
End)")
b.Totals.AddDef("数量")
b.Totals.AddExp("金额","数量
* 单价")
b.Build()
MainTable =
Tables("统计表1")
关于Access和SQL Server的语法和函数差异,我们的《SQL相关》这一章,有较为详细的介绍。