【问题标题】:How to iterate through a record-set twice?如何遍历记录集两次?
【发布时间】:2012-02-22 14:43:26
【问题描述】:

我正在尝试对记录集进行两次迭代。一次写入所有非零结果,然后第二次运行以写入在特定列中具有零的所有行,以便所有值为 0 的行都位于文件末尾。但是,由于 .EOF 在第一次运行时被触发,当我再次尝试运行时它仍然是“真”。两次运行它的最佳方法是什么?

   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

【问题讨论】:

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


    【解决方案1】:

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

    sSQL = "SELECT * FROM MyTable ORDER BY MyNumField DESC"
    Set QDF = CurrentDB.CreateQueryDef ("DatOut", sSQL)
    
    DoCmd.TransferText acExportDelim,,"DatOut","C:\Docs\Datout.csv"
    

    【讨论】:

    • 我可能错了,但我不认为我错过了关系数据库的要点,只是我需要这样做的原因没有包含在我的问题中。本质上,我需要将结果文件中的行从 1 开始按 asc 排序,然后向上排序,所有的零都在文件末尾。它必须以这种方式在我正在创建的文件放入的程序中正确分层。不幸的是,我不能使用 DoCmd.TransferText,因为它会将我的小数截断为 2 而不是 6+,就像它在数据库中一样。
    • 如果您想查看我在尝试使 DoCmd.TransferText 命令工作时提出的较旧问题:stackoverflow.com/questions/6154812/…
    【解决方案2】:

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

    【讨论】:

    • 成功了,谢谢。不,订单在我的情况下无济于事。表本身是使用 asc 语句的 order 创建的,但我需要将值 asc 与底部的零。而且我不知道有什么方法可以做到这一点。仅供参考,它需要按照我刚刚解释的顺序在它正在显示的软件中正确分层。无论如何,这对我正在做的事情非常有用,谢谢。 (不管我在做什么很奇怪,哈哈)。
    【解决方案3】:

    非常老的问题,但最近似乎一直很活跃,并且仍在搜索中,这就是我最终来到这里的原因。而且,作为一个新成员,我需要从某个地方开始,所以请善待。

    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 删除两个列表之间的重复项 - 在这种情况下,我们知道它们不会重叠,因为选择标准是互斥的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多