以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]时间计算崩溃  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=23737)

--  作者:lxhmax
--  发布时间:2012/9/18 14:59:00
--  [求助]时间计算崩溃

麻烦大家帮我看下,下面这段代码哪里出问题了,每次当这段代码运行的时候fotable就崩溃,系统自动关闭了~

 

 

 

If e.DataRow.IsNull("发表日期") And  e.DataRow.IsNull("实际完成日期") Then
    e.DataRow("检测用时")=Nothing
Else
    Dim d1 As Date = e.DataRow("发表日期")
    Dim d2 As Date = e.DataRow("实际完成日期")
    If d1>d2
        e.DataRow("检测用时") = 0
    Else
        Dim cnt As Integer = (d2-d1).TotalDays
        For i As Integer = 1 To cnt
            Dim d3 As Date = d1.adddays(i)
            If d3.DayOfWeek = 0 OrElse d3.DayOfWeek = 6 Then \'如果是星期天或者星期六
                cnt = cnt - 1
            End If
        Next
       e.DataRow("检测用时") = cnt + 1
    End If
End If


--  作者:狐狸爸爸
--  发布时间:2012/9/18 15:09:00
--  

看看是不是这个原因:

http://www.foxtable.com/help/topics/1522.htm

 

搞不定,就设置好代码,将这个表传上来,我们帮你分析一下原因。


--  作者:lxhmax
--  发布时间:2012/9/18 15:46:00
--  
以下是引用狐狸爸爸在2012-9-18 15:09:00的发言:

看看是不是这个原因:

http://www.foxtable.com/help/topics/1522.htm

 

搞不定,就设置好代码,将这个表传上来,我们帮你分析一下原因。

 

在清理数据的时候也发现了一个问题,在委托信息的表上,剩下的这些信息在清楚的时候,foxtable也会崩溃直接关闭,委托信息表的提示列也是有计算的,这个在计算的时候也会崩溃,检测项目汇总里的检测用时在计算的时候也是会崩溃直接关闭,麻烦狐爸帮我看看这个粗略的表是怎么回事~~

这个是第一次用foxtable做数据管理,麻烦狐爸帮我看看还有没其他问题~~谢谢啦!!!

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:业务管理系统.zip

[此贴子已经被作者于2012-9-18 15:46:21编辑过]

--  作者:lxhmax
--  发布时间:2012/9/18 16:01:00
--  
qqq
--  作者:lin_hailun
--  发布时间:2012/9/18 17:01:00
--  
 如狐爸所说的,死循环了。

 在datacolchanging事件中,修改了【操作记录】的值,导致触发【操作记录】的datacolchanged事件,然后进入楼主的那段代码,由于没有判断列名,而下面的代码里又有修改 列 的内容,导致重新进入datacolchanging事件。
--  作者:lin_hailun
--  发布时间:2012/9/18 17:04:00
--  
 修改方法是,加一个列名判断。

 比如

if e.datacol.name <> "操作记录" then

end if       

--  作者:lxhmax
--  发布时间:2012/9/18 17:14:00
--  
其实我不是很懂应该在哪里修改代码,麻烦你说下我改怎么改好吗?谢谢啦!
--  作者:狐狸爸爸
--  发布时间:2012/9/18 17:20:00
--  

小林说得对,最好直接判断列名:

 

Select Case e.DataCol.name
    Case "完成日期","领取状态"
        If  e.DataRow.IsNull("完成日期") Or e.DataRow("领取状态")="已领取"  Then
            e.DataRow("提示")=Nothing
        Else
            Dim d1 As Date = Date.today
            Dim d2 As Date = e.DataRow("完成日期")
            If d1>d2
                e.DataRow("提示") = -1 * (d1 - d2).Days
            Else
                Dim cnt As Integer = (d2-d1).TotalDays
                For i As Integer = 1 To cnt
                    Dim d3 As Date = d1.adddays(i)
                    If d3.DayOfWeek = 0 OrElse d3.DayOfWeek = 6 Then \'如果是星期天或者星期六
                        cnt = cnt - 1
                    End If
                Next
                e.DataRow("提示") = cnt
            End If
        End If
End Select

 

这样效率高一些,因为你这段代码是完成日期和领取状态发生变化后才执行的,不是任何一列发生变化都执行,不判断列名,就容易死循环,导致死机。

[此贴子已经被作者于2012-9-18 17:22:34编辑过]

--  作者:狐狸爸爸
--  发布时间:2012/9/18 17:21:00
--  

还有:

 

Select Case e.DataCol.name
    Case "发表日期","实际完成日期"

        If e.DataRow.IsNull("发表日期") And  e.DataRow.IsNull("实际完成日期") Then
            e.DataRow("检测用时")=Nothing
        Else
            Dim d1 As Date = e.DataRow("发表日期")
            Dim d2 As Date = e.DataRow("实际完成日期")
            If d1>d2
                e.DataRow("检测用时") = 0
            Else
                Dim cnt As Integer = (d2-d1).TotalDays
                For i As Integer = 1 To cnt
                    Dim d3 As Date = d1.adddays(i)
                    If d3.DayOfWeek = 0 OrElse d3.DayOfWeek = 6 Then \'如果是星期天或者星期六
                        cnt = cnt - 1
                    End If
                Next
                e.DataRow("检测用时") = cnt + 1
            End If
        End If
End Select


--  作者:lxhmax
--  发布时间:2012/9/18 17:31:00
--  

可以运行了,谢谢各位老师的指教~