过滤&订购表格数据到本地表

时间:2018-02-20 19:14:49

标签: sql vba ms-access

我整个下午都在努力编写一个函数,将表单数据表中显示的记录缓存到临时表中。

用例是用户使用数据表自动过滤器&排序以使记录成为所需的形式。然后他们运行一个报告函数,输出他们看到的xml,通过xslt转换为html运行它。我不能让MSXML直接从查询中工作,因此需要一个本地缓存的副本,用户可以在表格数据表中看到。

到目前为止我所做的工作,但似乎忽略了过滤器&在sql字符串中按子句排序。

Private Sub CacheLocalTemp()

      Dim strSql As String: strSql = "SELECT * INTO rpt_TEMP FROM tbl_Outputs"

      If Len(Me.Filter) > 0 Then
          strSql = strSql & " WHERE " & Me.Filter
      End If

      If Len(Me.OrderBy) > 0 Then
          strSql = strSql & " ORDER BY " & Me.OrderBy
      End If

      DoCmd.SetWarnings False
          DoCmd.RunSQL strSql
      DoCmd.SetWarnings True

End Sub

我见过使用INSERT和SELECT INTO VALUES(x,yz)的方法,但是不想沿着这条路走下去,因为这意味着我需要对所有字段名进行硬编码,而且还有很多大约10种不同的形式。

我发现的所有代码都是啰嗦/过度,我很惊讶没有更优雅/直接的方式只是将数据表中显示的内容的快照副本直接转储到自己的表。

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:1)

通过使用将记录集输出到表的辅助函数,可以非常轻松地解决此问题。

辅助功能:

Public Sub RecordSetToTable(rs As DAO.Recordset, tableName As String)
    Dim td As DAO.TableDef
    Set td = CurrentDb.CreateTableDef(tableName)
    Dim fld As DAO.Field
    For Each fld In rs.Fields
        td.Fields.Append td.CreateField(fld.Name, fld.Type, fld.Size)
    Next
    CurrentDb.TableDefs.Append td
    Dim tableRS As DAO.Recordset
    Set tableRS = CurrentDb.OpenRecordset(tableName)
    rs.MoveFirst
    Do While Not rs.EOF
        tableRS.AddNew
        For Each fld In rs.Fields
            tableRS.Fields(fld.Name).Value = fld.Value
        Next
        tableRS.Update
        rs.MoveNext
    Loop
End Sub

在表格上:

Private Sub CacheLocalTemp()
     RecordSetToTable Me.Recordset, "rpt_TEMP"
End Sub

不要乱构构建查询,排序等。只需将记录集直接写入新表。