我整个下午都在努力编写一个函数,将表单数据表中显示的记录缓存到临时表中。
用例是用户使用数据表自动过滤器&排序以使记录成为所需的形式。然后他们运行一个报告函数,输出他们看到的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种不同的形式。
我发现的所有代码都是啰嗦/过度,我很惊讶没有更优雅/直接的方式只是将数据表中显示的内容的快照副本直接转储到自己的表。
非常感谢任何帮助。感谢。
答案 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
不要乱构构建查询,排序等。只需将记录集直接写入新表。