如何两次遍历记录集?

时间:2012-01-30 20:08:27

标签: access-vba recordset ms-access-2010

我试图两次遍历记录集。一旦写入所有非零结果,然后第二次运行以写入特定列中具有零的所有行,以便所有那些值为0的行都在文件的末尾。但是,由于.EOF在第一次运行时被触发,因此仍然是" True"当我试图再次通过它。两次运行它的最佳方法是什么?

   With CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

        Do Until .EOF
             If .Fields(2) = 0 Then
             Else

                strCSV = ""
                 For x = 0 To .Fields.Count - 1
                       'No Qualifier
                       strCSV = strCSV & strDelimiter & Nz(.Fields(x), vbNullString)

                 Next x

                 'Eliminate Back to back strQualifiers or Qualifiers if changed
                 strCSV = Replace(strCSV, strQualifier & strQualifier, "")

                 strPrint = Mid(strCSV, Len(strDelimiter) + 1)
                 Print #intOpenFile, strPrint
            End If
                 .MoveNext
          Loop

          Do Until .EOF
             If Nz(.Fields(2), vbNullString) = 0 Then

                strCSV = ""
                 For x = 0 To .Fields.Count - 1
                       'No Qualifier
                       strCSV = strCSV & strDelimiter & Nz(.Fields(x), vbNullString)

                 Next x

                 'Eliminate Back to back strQualifiers or Qualifiers if changed
                 strCSV = Replace(strCSV, strQualifier & strQualifier, "")

                 strPrint = Mid(strCSV, Len(strDelimiter) + 1)
                 Print #intOpenFile, strPrint
            End If
                 .MoveNext
          Loop

   End With

3 个答案:

答案 0 :(得分:2)

要回答您的问题,请在两次运行之间使用.MoveFirst。但@Remou提出了一个很好的观点,即只需在SQL(+1)中添加ORDER BY即可避免这种复杂化

答案 1 :(得分:2)

一个非常老的问题,但是最近似乎很活跃,并且它仍然在搜索中出现,这就是我到这里为止的方式。而且,作为新成员,我需要从某个地方开始,所以要保持友善。

OP似乎试图对特定要求进行编码,该要求是使所有结果以数字升序排列,但底部为零。您可以在SQL中使用以下语句来完成此操作:

SELECT * FROM MyTable
ORDER BY MyNumField DESC, MyOtherSortField
WHERE MyNumField > 0

UNION ALL

SELECT * FROM MyTable
ORDER BY MyOtherSortField
WHERE MyNumField = 0

UNION合并两个或多个SELECT语句的结果,删除重复项。 UNION ALL连接结果,效率更高,因为它停止SQL删除两个列表之间的重复项-在这种情况下,由于选择标准互斥,我们知道它们不会重叠。

答案 2 :(得分:1)

您似乎忽略了关系数据库的重点,即除了您所施加的数据库之外,它没有其他顺序:

sSQL = "SELECT * FROM MyTable ORDER BY MyNumField DESC"
Set QDF = CurrentDB.CreateQueryDef ("DatOut", sSQL)

DoCmd.TransferText acExportDelim,,"DatOut","C:\Docs\Datout.csv"