0

由于某种原因,当我过滤记录集然后启动 Do While Not 循环时,循环首先通过偶数记录,然后是奇数......

例如,下面的代码:

sql="SELECT * FROM ProcSaleQueue WHERE Num = '" & salegrouprs("Num") & "' AND Abbr = '" & salegrouprs("Abbr") & "' AND Item_Id = '" & salegrouprs("Item_Id") & "' AND Complete IS NULL ORDER BY ProcSaleId"
salesrs.Open sql, conn,3,3
salesrs.Filter="Complete = NULL"
salesrs.MoveFirst
Do While Not salesrs.EOF
  msgbox salesrs("ProcSaleId")
  'I do some processing things in here.
  salesrs("Complete") = 1
  salesrs.MoveNext
Loop

将输出

72 74 73 75

代替

72 73 74 75

但是当我删除时:

salesrs.Filter="Complete = NULL"

输出是有序的。我正在使用 .Filter 而不是再次查询,因为我必须多次循环这个记录集,而且它是一个巨大的集合,所以我不希望 SQL 服务器有太多的命中。有任何想法吗?

4

2 回答 2

0

.Filter()是没有意义的,因为你已经只选择了 SQL 本身中该字段为 NULL 的记录。

如果你想把你已经处理过的数据放在一边,你可以使用本地数组来存储ProcSaleId你可以拥有:

Dim arrProcessedProcSaleId()
ReDim arrProcessedProcSaleId(-1)
Do While Not salesrs.EOF
    curProcSaleId = salesrs("ProcSaleId")
    msgbox curProcSaleId

    For x=0 To Ubound(arrProcessedProcSaleId)
        'Here arrProcessedProcSaleId(x) contains value of already processed ProcSaleId
    Next

    'I do some processing things in here.

    'store value for later use:
    ReDim Preserve arrProcessedProcSaleId(UBound(arrProcessedProcSaleId) + 1)
    arrProcessedProcSaleId(UBound(arrProcessedProcSaleId)) = curProcSaleId
    salesrs.MoveNext
Loop
salesrs.Close
Erase arrProcessedProcSaleId

您可以拥有任意数量的数组,如果您有很多记录,请确保Erase在完成后有行以释放用于动态数组的内存。

于 2013-04-28T06:54:37.380 回答
0

通过将完成设置为 1,记录不再在过滤器的范围内,因此您在下一条记录上。尝试删除 salesrs.MoveNext

否则将过滤器放在一起并检查是否完成

if salesrs("Complete") = 1 then
  salesrs.MoveNext
else
  'do your stuff
  salesrs("Complete") = 1
end if
于 2013-04-27T14:26:11.827 回答