以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  求高效简洁的代码,高手请指点  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=9216)

--  作者:唐尸三摆手
--  发布时间:2011/3/15 8:37:00
--  求高效简洁的代码,高手请指点
在工厂的生产日历中会涉及到避开周日的因素,但是由于erp软件不够智能,所以只好做一次“体外治疗”,下面的代码就是针对周日做的处理,但是效率出其的慢
Dim st As Date = Date.Now
Dim cmd As New SQLCommand
Dim dt As DataTable
Dim ct AS Integer
Dim ct1 AS Integer
Dim ct2 AS Integer
Dim ct3 AS Integer
Dim ct4 AS Integer
Dim ct5 AS Integer
Dim ct6 AS Integer

cmd.C
cmd.CommandText="select * from aec00000 where centercode=\'0100\' and requiredate between \'2011-02-27\' and \'2011-03-10\'"
dt=cmd.ExecuteReader()
For Each dr As DataRow In dt.datarows
    Dim d1 As Date=dr("requiredate")
    Dim d2 As Date
    Dim d3 As Date
    Dim wk As Byte=d1.DayOfWeek
    If wk=2 Then   \'如果总装日期是周二,那么
        d2=dr("requiredate").AddDays(-3)
        d3=dr("requiredate").AddDays(-5)
    Else If wk=5 Then    \'如果总装日期是周五,那么
        d2=dr("requiredate").AddDays(-2)
        d3=dr("requiredate").AddDays(-4)
    Else  \'如果总装日期是周一?周三?周四或周六?周日,那么
        d2=dr("requiredate").AddDays(-2)
        d3=dr("requiredate").AddDays(-5)
    End If
\'-总装线日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d1 &"\',outputdate=\'"& d1 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And childlevel=0 And deptcode=\'0148\'"
    ct1=cmd.ExecuteNonQuery()
    \'-装配一线日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d1 &"\',outputdate=\'"& d1 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And childlevel=1 And deptcode=\'0102\'"
    ct2=cmd.ExecuteNonQuery()
    \'-装配组件日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d2 &"\',outputdate=\'"& d2 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And workcentercode=\'010212\'"
    ct3=cmd.ExecuteNonQuery()
    \'-装配二线日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d2 &"\',outputdate=\'"& d2 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And childlevel=1 And deptcode=\'0143\'"
    ct4=cmd.ExecuteNonQuery()
    \'-成型一车间日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d2 &"\',outputdate=\'"& d2 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And deptcode=\'0112\'"
    ct5=cmd.ExecuteNonQuery()
    \'-成型二车间日期设定
    cmd.CommandText="update aeg00000 set inputdate=\'"& d3 &"\',outputdate=\'"& d2 &"\' from aeg00000 where GTcode=\'"& dr("planid") &"\' And deptcode=\'0113\'"
    ct6=cmd.ExecuteNonQuery()
Next
ct=ct1+ct2+ct3+ct4+ct5+ct6 
Messagebox.Show( "本次操作总共影响" & ct & "行!耗时: " & (Date.Now - st).TotalSeconds & "秒")


只要一算就死机,看来是代码带冗余了,请高手指点精简代码。
红色部分大约有2000行数据结果,估计可能是判断周六周日的过程中发生死机的
[此贴子已经被作者于2011-3-15 8:41:32编辑过]

--  作者:狐狸爸爸
--  发布时间:2011/3/15 9:00:00
--  

如果2000行数据,你还不如直接载入这2000行到FoxTable处理,要高效很多。

你现在是2000*6 = 12000,要执行12000次Update语句,慢是正常的。