以文本方式查看主题

-  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=26895)

--  作者:jsq96jg
--  发布时间:2012/12/17 8:01:00
--  保存为什么这么慢?

我在保存按钮中设置如下代码:

For Each dt As DataTable In DataTables
  If dt.HasChanges Then
       dt.save()
   End If
Next

每次点完保存后,至少要反应5秒,不知道什么原因。我把其它表中“beforesavedatarow”事件中能减少的都减少了,还是不行?

求助狐爸!


--  作者:lin_hailun
--  发布时间:2012/12/17 9:16:00
--  
 5秒的话,是有点慢。几方面的原因。

 1,网络原因,如果是远程数据库的话,会出现这种情况。

 2,可能是代码连锁反应的问题,在可能触发的事件里写入 msgbox("xxx"),看一下都触发了哪些事件。

 3,贴出你beforesavedatarow的事件代码。

--  作者:jsq96jg
--  发布时间:2012/12/17 10:48:00
--  

关键不是远程数据,是本机的


--  作者:狐狸爸爸
--  发布时间:2012/12/17 10:51:00
--  

还得看看你修改或增加的行数有多少。


--  作者:jsq96jg
--  发布时间:2012/12/17 10:54:00
--  

Dim dr As DataRow=e.DataRow
If dr.Isnull("身份证号") Or dr.Isnull("单位代码") Then
    MessageBox.Show("身份证号或单位代码没填!")
    e.cancel=True
End If

 

\'本代码用于教师护士提高10%

If dr("工资类型")="事业专技" And dr("是否提高") = True Then
    on error resume Next
    Dim zwje As Double:dim jbje As Double
    If dr("工资相当职级")<>"干部见习期" And dr("工资相当职级")<>"工人试用期"Then
        Dim drxj As DataRow=DataTables("薪级标准").DataRows(1)
        If dr.IsNull("工资相当职级")=False And dr.IsNull("薪级_级别")=False Then
            zwje=jszwje(dr("工资相当职级"))*1.1
            jbje =drxj("级别" & dr("薪级_级别"))*1.1
            If zwje> Int(zwje) Then
                zwje=Int(zwje)+1
            End If
            If jbje> Int(jbje) Then
                jbje=Int(jbje)+1
            End If
            dr("职务或岗位工资") = zwje
            dr("薪级_工资额")  =jbje
        End If
    Else
        zwje=jxqgz(dr("工资类型"),dr("最高学历"))*1.1
        If  zwje > Int(zwje) Then
            zwje=Int(zwje)+1
        End If
        dr("见习工资")=zwje
    End If
End If

\'以下用于计算公积金,医保,房贴
If left(dr("工资类型"),2)="机关" Then
    on error resume Next
    dr("公积金")=(dr("职务或岗位工资")+dr("级别工资_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.12
    dr("医疗保险")=(dr("职务或岗位工资")+dr("级别工资_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.02
    If dr("参加工作时间")< #01/01/1998# Then
        dr("住房补贴")=(dr("职务或岗位工资")+dr("级别工资_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.024
    Else
        dr("住房补贴")=Nothing
    End If
Else
    dr("公积金")=(dr("职务或岗位工资")+dr("薪级_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.12
    dr("医疗保险")=(dr("职务或岗位工资")+dr("薪级_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.02
    If dr("参加工作时间")< #01/01/1998# Then
        dr("住房补贴")=(dr("职务或岗位工资")+dr("级别工资_工资额")+dr("工作性津贴")+dr("生活补贴")) * 0.024
    Else
        dr("住房补贴")=Nothing
    End If
End If

 


\'以下代码用于生成人员编号
If dr("单位代码") <> "" Then
    on error resume Next
    Dim drdw As DataRow=DataTables("单位基本信息").find("单位代码=\'"& dr("单位代码") &"\'")
    Dim dwjc As String
    If drdw IsNot Nothing Then
        dwjc =drdw("单位简称")
        If len(dwjc)> 4 Then
            dwjc=left(dwjc,4)
        End If
    End If
    Dim bh As String=getpy(dwjc,True)
    If dr("人员编号").StartsWith(bh) = False Then
        Dim flt As String:dim idx As Integer:dim max As String
        flt="单位代码=\'"& dr("单位代码") &"\'"
        max = e.DataTable.Compute("Max(人员编号)",flt) \'取得最大编号
        If max > "" Then \'如果存在最大单据编号
            idx = CInt(max.substring(max.Indexof("0"),3))+ 1 \'获得最大单据编号的后四位顺序号,并加1
        Else
            idx = 1 \'否则顺序号等于1
        End If
        dr("人员编号")=bh & format(idx,"000")
    End If
End If

\'以下代码清除操作日志
Dim tv As Date = dr("操作日志")
Dim tp As TimeSpan = Date.Today - tv
If tp.TotalDays >= 7 Then \'如果已经超过7天
    dr("操作日志") = #01/01/0001# \'则清空
End If


--  作者:jsq96jg
--  发布时间:2012/12/17 10:54:00
--  
以上是beforesavedatarow事件代码
--  作者:狐狸爸爸
--  发布时间:2012/12/17 10:56:00
--  
删除beforesavedatarow中的全部代码,先确定是不是这个事件造成的,如果是的,在考虑优化或者转移到别的事件中。
--  作者:jsq96jg
--  发布时间:2012/12/17 10:59:00
--  

好的,我试试看

 


--  作者:jsq96jg
--  发布时间:2012/12/17 15:36:00
--  

没的情况,删掉还那样!


--  作者:wjl-se
--  发布时间:2012/12/17 15:40:00
--  

看看是不是表达式的影响:

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