以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]时间计算,代码运行出错(已解决)  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=57510)

--  作者:yyzlxc
--  发布时间:2014/9/25 19:07:00
--  [求助]时间计算,代码运行出错(已解决)
效果:计算员工当天的累计工时(工时列为整数,累计工时列为时间日期)。
问题:运行到加背景色代码时,出现错误提示。请各位老师指教,谢谢!!



For Each dr As DataRow In DataTables("C").DataRows
    Dim N,N2,h,h2,m,m2,s,s2 As Integer
    Dim gs As Date
    Dim mr As DataRow = dr
    Dim drs As List(of DataRow)
    If dr.IsNull("累计工时") Then
        dr = DataTables("C").Find("[序号] < " & mr("序号") & " And [员工] = \'" & mr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号] Desc") \'找出上一行
        If dr Is Nothing Then \'如果没有找到上一行,说明本行就是第一行
            N = mr("工时")
            h = N \\ 3600
            m = (N Mod 3600) \\ 60
            s = N Mod 60
            mr("累计工时") = Format(new Date(1,1,1,h,m,s), "HH:mm:ss")
            dr = mr
        End If
        drs = DataTables("C").Select("[序号] >= " & dr("序号") & " And [员工] = \'" & dr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号]")
        For j As Integer = 1 To drs.Count - 1 \'重算余下行的余额
            N2 = drs(j)("工时") \'数据类型为整数,转换为日期时间类型
            h2 = N2 \\ 3600
            m2 = (N2 Mod 3600) \\ 60
            s2 = N2 Mod 60
            gs = Format(new Date(1,1,1,h2,m2,s2), "HH:mm:ss")
            Dim t As TimeSpan = drs(j-1)("累计工时") + gs
            drs(j)("累计工时") = (Format(t.Hours,"00") & ":" & Format(t.Minutes,"00") & ":" & Format(t.Seconds,"00"))
        Next
    End If
Next


图片点击可在新窗口打开查看此主题相关图片如下:捕获3.jpg
图片点击可在新窗口打开查看


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目4.foxdb



[此贴子已经被作者于2014-9-25 22:10:10编辑过]

--  作者:有点甜
--  发布时间:2014/9/25 19:29:00
--  
For Each dr As DataRow In DataTables("C").DataRows
    Dim N,N2,h,h2,m,m2,s,s2 As Integer
    Dim gs As Date
    Dim mr As DataRow = dr
    Dim drs As List(of DataRow)
    If dr.IsNull("累计工时") Then
        dr = DataTables("C").Find("[序号] < " & mr("序号") & " And [员工] = \'" & mr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号] Desc") \'找出上一行
        If dr Is Nothing Then \'如果没有找到上一行,说明本行就是第一行
            N = mr("工时")
            mr("累计工时") = (new Date(1,1,1,0,0,0)).addSeconds(N)
            dr = mr
        End If
        drs = DataTables("C").Select("[序号] >= " & dr("序号") & " And [员工] = \'" & dr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号]")
        For j As Integer = 1 To drs.Count - 1 \'重算余下行的余额
            drs(j)("累计工时")= Cdate(drs(j-1)("累计工时")).AddSeconds(drs(j)("工时"))
        Next
    End If
Next

--  作者:yyzlxc
--  发布时间:2014/9/25 20:09:00
--  
谢谢甜老师,问题解决,代码又简化了许多,又学了一招,真的太感谢甜老师了。
--  作者:yyzlxc
--  发布时间:2014/9/25 21:19:00
--  
又碰到新问题,在原来的基础上,增加累计用时列,计算员工当天的累计用时(用时和累计用时列均为日期时间列)。
是加背景色的代码出错,还请各位老师指教,谢谢!!

代码如下:

For Each dr As DataRow In DataTables("C").DataRows
    Dim mr As DataRow = dr
    Dim drs As List(of DataRow)
    If dr.IsNull("累计用时") Then
        dr = DataTables("C").Find("[序号] < " & mr("序号") & " And [员工] = \'" & mr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号] Desc") \'找出上一行
        If dr Is Nothing Then \'如果没有找到上一行,说明本行就是第一行
            mr("累计用时") = mr("用时")
            dr = mr
        End If
        drs = DataTables("C").Select("[序号] >= " & dr("序号") & " And [员工] = \'" & dr("员工") & "\'And [日期] = \'" & mr("日期") & "\'", "[序号]")
        For j As Integer = 1 To drs.Count - 1 \'重算余下行的余额
            Dim t As TimeSpan = CDate(drs(j-1)("累计用时")) + CDate(drs(j)("用时"))
            drs(j)("累计用时") = (Format(t.Hours,"00") & ":" & Format(t.Minutes,"00") & ":" & Format(t.Seconds,"00"))
        Next
    End If
Next


图片点击可在新窗口打开查看此主题相关图片如下:捕获4.jpg
图片点击可在新窗口打开查看


--  作者:有点甜
--  发布时间:2014/9/25 21:25:00
--  
Dim d As Date = CDate(drs(j)("用时"))
drs(j)("累计用时") = CDate(drs(j-1)("累计用时")).AddSeconds(d.Hour*3600+d.Minute*60+d.Second)

--  作者:yyzlxc
--  发布时间:2014/9/25 22:09:00
--  
谢谢甜老师,问题解决,再次感谢!!