我试图两次遍历记录集。一旦写入所有非零结果,然后第二次运行以写入特定列中具有零的所有行,以便所有那些值为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
答案 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"