Foxtable(狐表)用户栏目专家坐堂 → 加班统计条件


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

主题:加班统计条件

帅哥哟,离线,有人找我吗?
jerry85618
  11楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:15 积分:205 威望:0 精华:0 注册:2012/2/24 12:31:00
  发帖心情 Post By:2016/8/11 14:20:00 [只看该作者]

像这样的考勤一般计算还可以,不过以我的不成熟的经验来看,还涉及到节假日换班等不确定因素,或者加班时间变更。所以系统不能做太死。

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


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

参考,其余自己写

 

Select Case e.DataCol.Name
    Case "签退时间", "日期"
        Dim d As Date = e.DataRow("日期")
        If d.DayOfWeek = 0 OrElse d.DayOfWeek = 6 Then
            Dim bz As Date = "8:00"
            Dim sp As TimeSpan = d - bz
            Dim n As Double = Math.Ceiling(sp.TotalMinutes / 30)
            e.DataRow("二倍") = sp.TotalHours
        Else
            d = e.DataRow("签退时间")
            Dim bz As Date = "17:35"
           
            If d > bz Then
                If d > "19:30" Then
                    d = d.AddMinutes(-30)
                ElseIf d > "19:00" Then
                    d = "19:00"
                End If
                Dim sp As TimeSpan = d - bz
                Dim n As Double = Math.Ceiling(sp.TotalMinutes / 30)
               
                e.DataRow("一倍") = n
            End If
        End If
End Select


 回到顶部
美女呀,离线,留言给我吧!
zhangning
  13楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:3355 威望:0 精华:0 注册:2016/4/14 16:56:00
  发帖心情 Post By:2016/8/12 15:53:00 [只看该作者]

编写了以下代码:
Select Case e.DataCol.Name
    Case "签退时间", "日期","签到时间"
        Dim d As Date = e.DataRow("日期")
        Dim dt As Date = e.DataRow("签退时间")
        Dim qd As Date = e.DataRow("签到时间")
        If d.DayOfWeek = 0 OrElse d.DayOfWeek = 6 Then
            Dim bz As Date = "8:00"
            If qd <= "8:00" Then
                qd = "8:00"
            ElseIf qd <= "8:30" Then
                qd = "8:30"
            ElseIf qd <= "9:00" Then
                qd = "9:00"
            ElseIf qd <= "9:30" Then
                qd = "9:30"
            ElseIf qd <= "10:00" Then
                qd = "10:00"
            ElseIf qd <= "10:30" Then
                qd = "10:30"
            ElseIf qd <= "11:00" Then
                qd = "11:00"
            ElseIf qd <= "11:30" Then
                qd = "11:30"
            ElseIf qd <= "12:00" Then
                qd = "12:00"
            ElseIf qd <= "13:00" Then
                qd = "12:00"
            ElseIf qd <= "13:30" Then
                qd = "13:30"
            ElseIf qd <= "14:00" Then
                qd = e.DataRow("签到时间")
            End If
            Dim sp As TimeSpan = dt - qd
            Dim n As Integer = sp.TotalMinutes / 30
            e.DataRow("二倍加班H") = n*0.5 -1
        Else
            Dim bz As Date = "17:01"
            If dt >= bz Then
                If dt >= "19:35" Then
                    dt = dt.AddMinutes(-30)
                ElseIf dt < "17:35" Then
                    dt = "17:01"
                ElseIf dt <= "19:05" Then
                    dt = e.DataRow("签退时间")
                ElseIf dt < "19:35"
                    dt = "19:05"
                End If
                Dim sp As TimeSpan = dt - bz
                Dim n As Integer = sp.TotalMinutes / 30
                e.DataRow("一倍半加班H") = n*0.5
            End If
        End If
If E.DataRow("签退时间") = Nothing Then
        E.DataRow("一倍半加班H") = Nothing
        E.DataRow("二倍加班H") = Nothing
        E.DataRow("三倍加班H") = Nothing
    End If
End Select
Select Case e.DataCol.Name  
Case  "日期","签到时间","迟到H"
    Dim d As Date = e.DataRow("日期")
    Dim qd As Date = e.DataRow("签到时间")
    If d.DayOfWeek = 1 OrElse d.DayOfWeek = 2 OrElse d.DayOfWeek = 3 OrElse d.DayOfWeek = 4 OrElse 

d.DayOfWeek = 5  Then
        Dim bz As Date = "8:00"
        If qd <= "8:00" Then
            qd = "8:00"
        ElseIf qd > "8:00" Then
            qd = e.DataRow("签到时间")
            Dim sp As TimeSpan = qd - bz
            Dim n As Double = Math.Ceiling(sp.TotalMinutes / 30)
            e.DataRow("迟到H") = n*0.5
        End If
    End If
    If E.DataRow("签到时间") = Nothing Then
        e.DataRow("迟到H") = Nothing
    End If

End Select
Select Case e.DataCol.Name  
Case  "日期","签退时间","早退H"
    Dim d As Date = e.DataRow("日期")
    Dim qd As Date = e.DataRow("签退时间")
    If d.DayOfWeek = 1 OrElse d.DayOfWeek = 2 OrElse d.DayOfWeek = 3 OrElse d.DayOfWeek = 4 OrElse 

d.DayOfWeek = 5  Then
        Dim bz As Date = "17:05"
        If qd < "17:05" Then
            qd = e.DataRow("签退时间")
            Dim sp As TimeSpan = bz - qd
            Dim n As Double = Math.Ceiling(sp.TotalMinutes / 30)
            e.DataRow("早退H") = n*0.5
        End If
    End If
    If E.DataRow("签退时间") = Nothing Then
        e.DataRow("早退H") = Nothing
    End If

End Select




能实现在 加班  迟到  早退 列自动出现数字,就是太臃肿了,
也许是臃肿的问题,往狐表里粘贴数据或删除一些数据的时候,狐表数据库后自动退出,
请问老师,这可能是什么原因呢?
[此贴子已经被作者于2016/8/12 15:55:16编辑过]

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


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

被赋值的列,不能判断,如红色的,要去掉。

 

Select Case e.DataCol.Name  
    Case  "日期","签到时间","迟到H"

 回到顶部
美女呀,离线,留言给我吧!
zhangning
  15楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:3355 威望:0 精华:0 注册:2016/4/14 16:56:00
  发帖心情 Post By:2016/8/12 17:09:00 [只看该作者]

按照老师说的,去掉了"迟到H"和"早退H",问题就解决了,
被赋值的列,不能判断, 相关的不明白,老师发些学习资料地址呗

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


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

以下是引用zhangning在2016/8/12 17:09:00的发言:
按照老师说的,去掉了"迟到H"和"早退H",问题就解决了,
被赋值的列,不能判断, 相关的不明白,老师发些学习资料地址呗

 

一般情况,是没问题的。

 

如果你加入这几列的判断,只要代码稍微编写不严谨,就会照成死循环,所以一般不要判断被赋值的列。


 回到顶部
美女呀,离线,留言给我吧!
zhangning
  17楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:3355 威望:0 精华:0 注册:2016/4/14 16:56:00
  发帖心情 Post By:2016/8/15 13:57:00 [只看该作者]

 Dim bz As Date = "17:05"
            If dt >= bz Then
                If dt >= "19:35" Then
                    dt = dt.AddMinutes(-30)
                ElseIf dt < "17:35" Then
                    dt = "17:01"
                ElseIf dt <= "19:05" Then
                    dt = e.DataRow("签退时间")
                ElseIf dt < "19:35"
                    dt = "19:05"
                End If
                Dim sp As TimeSpan = dt - bz
                Dim n As Integer = sp.TotalMinutes / 30
                e.DataRow("一倍半加班H") = n*0.5


如签退时间是20:19的时候,  “一倍半加班H”处显示的  2.5,
 20:20时是3,我想要的结果是直到20:35时才是3,
计算方式20:20-30-17:05=165分
165/30=5.5  取整数5, 5*0.5=2.5
之所以变3了,是不是在165/30=5.5  取整数时变成6了,
请问老师,如何才能不四舍五入,不论后边的小数多大,都只取整数






 回到顶部
美女呀,离线,留言给我吧!
zhangning
  18楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:3355 威望:0 精华:0 注册:2016/4/14 16:56:00
  发帖心情 Post By:2016/8/15 14:19:00 [只看该作者]

解决了,用Math.Floor取的整数

 回到顶部
美女呀,离线,留言给我吧!
zhangning
  19楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:513 积分:3355 威望:0 精华:0 注册:2016/4/14 16:56:00
  发帖心情 Post By:2016/8/16 11:25:00 [只看该作者]

老师,在下列代码中追击了一个条件,就是如果签退时间超过19:30的话,需要扣除1.5小时(中午吃饭1小时,晚上7点以后休息半小时),如粗体,具体代码如下:
Select Case e.DataCol.Name
    Case "签退时间", "日期","签到时间"
        Dim d As Date = e.DataRow("日期")
        Dim dt As Date = e.DataRow("签退时间")
        Dim qd As Date = e.DataRow("签到时间")
        If d.DayOfWeek = 0 OrElse d.DayOfWeek = 6 Then
            If qd <= "8:00" Then
                qd = "8:00"
            ElseIf qd <= "8:30" Then
                qd = "8:30"
            ElseIf qd <= "9:00" Then
                qd = "9:00"
            ElseIf qd <= "9:30" Then
                qd = "9:30"
            ElseIf qd <= "10:00" Then
                qd = "10:00"
            ElseIf qd <= "10:30" Then
                qd = "10:30"
            ElseIf qd <= "11:00" Then
                qd = "11:00"
            ElseIf qd <= "11:30" Then
                qd = "11:30"
            ElseIf qd <= "12:00" Then
                qd = "12:00"
            ElseIf qd <= "13:00" Then
                qd = "13:00"
            ElseIf qd <= "13:30" Then
                qd = "13:30"
            ElseIf qd <= "14:00" Then
                qd = e.DataRow("签到时间")
            End If
            Dim sp As TimeSpan = dt - qd
            Dim n As Integer = Math.Floor(sp.TotalMinutes / 30)
            If qd < "12:00" AndAlso dt > "13:00" Then
                e.DataRow("二倍加班H") = n*0.5 - 1
            ElseIf qd < "12:00" AndAlso dt >= "19:30" Then
                e.DataRow("二倍加班H") = n*0.5 - 1.5
            Else
                e.DataRow("二倍加班H") = n*0.5
            End If
        Else
            Dim bz As Date = "17:05"
            If dt >= bz Then
                If dt >= "19:35" Then
                    dt = dt.AddMinutes(-30)
                ElseIf dt < "17:35" Then
                    dt = "17:06"
                ElseIf dt <= "19:05" Then
                    dt = e.DataRow("签退时间")
                ElseIf dt < "19:35"
                    dt = "19:05"
                End If
                Dim sp As TimeSpan = dt - bz
                Dim n As Integer = Math.Floor(sp.TotalMinutes / 30)
                e.DataRow("一倍半加班H") = n*0.5
            End If
        End If


但是 不起作用,请老师帮看看哪里错了,应如何该呢?



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


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

改成

 

            If qd < "12:00" AndAlso dt >= "19:30" Then

                e.DataRow("二倍加班H") = n*0.5 - 1.5

            ElseIf qd < "12:00" AndAlso dt > "13:00" Then

                e.DataRow("二倍加班H") = n*0.5 - 1
            Else
                e.DataRow("二倍加班H") = n*0.5
            End If

 回到顶部
总数 22 上一页 1 2 3 下一页