以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  请帮忙优化代码 ,估计 for each嵌套太多了  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=52023)

--  作者:zhchling
--  发布时间:2014/6/7 14:46:00
--  请帮忙优化代码 ,估计 for each嵌套太多了

是有关房态表的一段代码,  我估计是嵌套的FOR EACH太多了, 执行起来有明显的延迟,估计1秒以上.

 

看能否优化代码,提高效率?

 

Dim mon As Integer = Tables("userb").current("zcldidariqi").Month
Dim days As Integer = Date.DaysInMonth(Tables("userb").current("zcldidariqi").Year,Tables("userb").current("zcldidariqi").Month)
Dim s As String

If Tables("userb").current("zcldidariqi").adddays(3).day < Tables("userb").current("zcldidariqi").day Then  \'如果跨月
      For j As Integer = Tables("userb").current("zcldidariqi").day To days
          s + = "\' \' As " & mon & "月" & j & "日,"
      Next
  Else   \'正常一个月
      For j As Integer = Tables("userb").current("zcldidariqi").day  To Tables("userb").current("zcldidariqi").adddays(3).day
          s + = "\' \' As " & mon & "月" & j & "日,"
      Next
End If

s = "Select  房型, \'        \' As 房间号 , " & s.trim(",") & "  from {客房信息表} order by 排序  "

Dim dt As DataTable = DataTables("选房窗口_table1")
dt.Fill( s ,  True)
Tables("选房窗口_table1").Cols("房间号").Width = 55
Tables("选房窗口_table1").Cols("房型").Width = 55

If dt.DataRows.Count < DataTables("客房信息表").DataRows.Count Then
    dt.AddNew(DataTables("客房信息表").DataRows.Count - dt.DataRows.Count)
End If
For i As Integer = 0 To DataTables("客房信息表").DataRows.Count - 1
    For j As Integer = 0 To dt.DataRows.Count - 1
        If i = j Then
            dt.DataRows(j)("房间号") = DataTables("客房信息表").DataRows(i)("房间号")
        End If
    Next
Next
For Each ftdr As DataRow In dt.DataRows
    For Each ftdc As DataCol In dt.DataCols
        For Each xcdr As DataRow In DataTables("zclxingcheng").DataRows
            If xcdr("日期").Year = Date.Today.Year AndAlso xcdr("日期").Month & "月" & xcdr("日期").Day & "日" = ftdc.Name AndAlso xcdr("房间号").Contains(ftdr("房间号")) Then
                Dim dr As DataRow = DataTables("userb").Find("ID = \'" & xcdr("客户ID") & "\'")
                If dr IsNot Nothing
                    ftdr(ftdc.Name) + = dr("name") & ","
                End If
            End If
        Next
        ftdr(ftdc.Name) = ftdr(ftdc.Name).Trim(",")
    Next
Next

e.Form.Text = Date.Today.Year & "年" & Date.Today.Month & "月房态表"


\'以下是把原有的房间号的行的复选框勾选上.
Dim zcl As String= Tables("userb.zclxingcheng").current("房间号")
Dim zcls As String =zcl.Replace(" ","") 
For Each r As Row In Tables("选房窗口_table1").Rows
    If zcls.Contains(r("房间号"))    Then
        r.Checked = True
    End If
Next


--  作者:Bin
--  发布时间:2014/6/7 14:49:00
--  
这种方式,数据量大了怎么也快不了.
--  作者:blackzhu
--  发布时间:2014/6/7 14:49:00
--  
1秒还不好?就滴答下
--  作者:zhchling
--  发布时间:2014/6/7 14:51:00
--  

版主回复神速.

 

怎么能换别的方式呢? 房态表的事困扰我很长时间了.


--  作者:zhchling
--  发布时间:2014/6/8 14:07:00
--  
  For Each xcdr As DataRow In DataTables("zclxingcheng").DataRows       这个是遍历全部表, 怎么限制条件, 比如 只遍历 日期大于今天的行.
--  作者:有点甜
--  发布时间:2014/6/8 15:18:00
--  
以下是引用zhchling在2014-6-8 14:07:00的发言:
  For Each xcdr As DataRow In DataTables("zclxingcheng").DataRows       这个是遍历全部表, 怎么限制条件, 比如 只遍历 日期大于今天的行.

 

看这里 http://www.foxtable.com/help/topics/0400.htm

 


--  作者:zhchling
--  发布时间:2014/6/8 22:02:00
--  

http://www.foxtable.com/help/index.html?n=0400.htm

帮助里有关于 查询与赋值并存 会影响效率的文章, 似乎和我的问题有些类似.  但不知道怎么修改代码.

 

   

第3级的FOR EACH里面这段代码非常耗时 
          If xcdr("日期").Year = Date.Today.Year AndAlso    xcdr("日期").Month & "月" & xcdr("日期").Day & "日" = ftdc.Name   AndAlso    xcdr("房间号").Contains(ftdr("房间号")) Then

 

怎么优化却没有思路.

 

 


--  作者:有点甜
--  发布时间:2014/6/8 22:05:00
--  

 做个例子发上来测试。


--  作者:zhchling
--  发布时间:2014/6/8 22:16:00
--  

我没有发短信的权利?  版主我怎么联系你?  例子需要单独发给你. 涉及到数据库安全.


--  作者:zhchling
--  发布时间:2014/6/8 22:33:00
--  
可否把论坛里发短信的功能打开?