Foxtable(狐表)用户栏目专家坐堂 → 非自然月的统计


  共有3710人关注过本帖树形打印复制链接

主题:非自然月的统计

帅哥哟,离线,有人找我吗?
狐狸爸爸
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251054 威望:0 精华:91 注册:2008/6/17 17:14:00
非自然月的统计  发帖心情 Post By:2015/5/14 14:27:00 [只看该作者]

部分企业在统计数据的时候,并不使用自然月,例如有的从上月的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相关》这一章,有较为详细的介绍。

[此贴子已经被作者于2015/5/14 14:30:09编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
Bin
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2015/5/14 14:29:00 [只看该作者]

图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
yinyb36
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:953 积分:7252 威望:0 精华:0 注册:2011/9/6 13:36:00
  发帖心情 Post By:2015/5/14 19:35:00 [只看该作者]

顶,可以参考一下,还有种情况,截止日期不固定,如:正常情况下,提前两个工作日截止,如果提前截止,另行通知

 回到顶部
帅哥哟,离线,有人找我吗?
lsy
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:5246 积分:33163 威望:0 精华:8 注册:2013/1/17 21:28:00
  发帖心情 Post By:2015/5/31 15:10:00 [只看该作者]

不能漏掉,顶上,收藏。

 回到顶部
帅哥哟,离线,有人找我吗?
zqxzhs
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:473 积分:4794 威望:0 精华:0 注册:2015/4/30 22:08:00
  发帖心情 Post By:2016/4/24 8:01:00 [只看该作者]

老师,“如果如果是25日之后的日期,则将此日期增加6天,使其成为下个月的日期,然后再取年月参与统计”这与2月份、30天、31天的月,是不是取得月会有问题呢?


 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/4/24 11:37:00 [只看该作者]

不会有问题,仅仅是使得时间处于下个月而已,用来获取年和月。不是获取天数

 回到顶部
帅哥哟,离线,有人找我吗?
zqxzhs
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:473 积分:4794 威望:0 精华:0 注册:2015/4/30 22:08:00
  发帖心情 Post By:2016/4/24 17:30:00 [只看该作者]

获取年没问题,二月是不是有问题呀,25+6=31号,月不是就是当月了,遇到一个月30天时,31号是次月的1日,月就是当月加1了,对不同的月份来讲,获得的月是不是不同呢。

 回到顶部
帅哥哟,离线,有人找我吗?
大红袍
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:39310 积分:196782 威望:0 精华:1 注册:2015/4/25 9:23:00
  发帖心情 Post By:2016/4/24 17:50:00 [只看该作者]

 代码没问题啊,大于25号,就是26等等以上的数字了,那么加上6天,怎么也是到了下一个月了吧?然后获取月份,都是正确的啊。

 回到顶部