访问:如何执行查询并将其结果保存在报告中

Posted

技术标签:

【中文标题】访问:如何执行查询并将其结果保存在报告中【英文标题】:Access: How to execute a query and save its result in a report 【发布时间】:2008-10-27 11:39:32 【问题描述】:

嗨,

我正在尝试在 vba 中编写查询并将其结果保存在报告中。 我是初学者。这就是我尝试过的 有人可以纠正我吗

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim sql As String

Set cn = CurrentProject.Connection
sql = "Select * from table1 where empno is 0"

rs.Open sql, cn


While Not rs.EOF

' here i think i should save the result in a report but i am not sure how

  rs.MoveNext
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing

另外,我如何更改此查询以在数据库中的所有表上运行此查询

【问题讨论】:

报告是什么意思?你的意思是html还是word文档? 【参考方案1】:

如果您想使用 MS Access 的报告生成器创建报告,您必须使用查询对象(可能有一种方法可以诱使 MS Access 从您的记录集中运行它,但它可能不值得你努力)。

您可以在“数据库”窗口中创建查询对象。单击对象列表中的查询按钮,然后单击新建。在生成的编辑器中,您可以以图形方式创建查询,或者如果您更喜欢使用 SQL。保存查询并给它一个有意义的全名。

同样可以在“数据库”窗口中创建报告。单击报告按钮,然后单击新建。在生成的向导中,您会将报告链接到您刚刚创建的查询。更新: 作为 D.W. Fenton 说,您可以将查询直接嵌入到报表对象中,而无需创建单独的查询对象。无论如何,我的偏好是创建一个。

这种方法的问题是您必须为每个表创建单独的查询和报告。

如果您只想将结果转储到文本文件(以便稍后读取/打印),那么您可以使用记录集来完成,就像在 VBA 代码中一样。它看起来像这样

'...
dim strFoo as string
dim strBar as string
'...
if not rs.bof then
    rd.MoveFirst
end if
While Not rs.EOF
   strFoo = rs("foo") 'copy the value in the field 
                      'named "foo" into strFoo.
   strBar = rs("bar")
   '... etc. for all fields you want
   '
   'write out the values to a text file 
   '(I'll leave this an exercise for the reader)
   '
   rs.MoveNext
Wend
'...

解析所有表可以像这样在循环中完成:

dim strTableName as string
dim db As Database
'...
Set db = CurrentDb
db.TableDefs.Refresh
For Each myTable In db.TableDefs
    If Len(myTable.Connect) > 0 Then
        strTableName = myTable.Name
        '...
        'Do something with the table
        '...
    End If
Next
set db = nothing

========================更新==================== ===可以从记录集中运行 MS-Access 报告。重复我对 tksy's question 所说的话 从Access Web,您可以使用记录集的“名称”属性。您生成的代码将如下所示:

在报告中

Private Sub Report_Open(Cancel As Integer)
    Me.RecordSource = gMyRecordSet.Name
End Sub

在调用对象(模块、表单等)中

Public gMyRecordSet As Recordset
'...
Public Sub callMyReport()
    '...
    Set gMyRecordSet = CurrentDb.OpenRecordset("Select * " & _
                                               "from foo " & _
                                               "where bar='yaddah'")
    DoCmd.OpenReport "myReport", acViewPreview  
    '...
    gMyRecordSet.Close  
    Set gMyRecordSet = Nothing
    '...
End Sub

Q.E.D.

【讨论】:

您无需保存查询即可生成报告。报表定义具有与报表一起存储的 Recordsource 属性。 您无需在打开报表之前创建记录集。只需将您在 OpenRecordset 中使用的 SQL 字符串指定为 Recordsource 属性。而且我认为您编写的代码不会起作用,因为您正在将在代码中打开的记录集的 name 分配给 Recordsource 属性。【参考方案2】:

通常您会根据数据源设计报告。然后在您的报告完成并正常工作后,您可以使用 VBA 来显示或保存报告。

【讨论】:

【参考方案3】:

要对数据库中的每个表运行此操作,我建议编写一个循环通过 CurrentData.AllTables(i) 的函数,然后在每次迭代中调用上面的函数

希望对你有帮助

【讨论】:

【参考方案4】:

如果您只想查看结果,可以创建查询。例如,这里有一些粗略的、大部分未经测试的 VBA:

Sub Viewmysql
Dim strSQL as String
Dim strName As String

'Note that this is not sensible in that you
'will end up with as many queries open as there are tables

    For Each tdf In CurrentDB.TableDefs
       If Left(tdf.Name,4)<>"Msys" Then
          strName = "tmp" & tdf.Name

          strSQL = "Select * from [" & tdf.Name & "] where empno = 0"
          UpdateQuery strName, strSQL
          DoCmd.OpenQuery strName, acViewNormal
       End If
    Next
End Sub

Function UpdateQuery(QueryName, SQL)

    If IsNull(DLookup("Name", "MsysObjects", "Name='" & QueryName & "'")) Then
        CurrentDb.CreateQueryDef QueryName, SQL
    Else
        CurrentDb.QueryDefs(QueryName).SQL = SQL
    End If

    UpdateQuery = True

End Function

您可能还对 MDB Doc 感兴趣,它是 Microsoft Access 97-2003 的插件,可让您将 Access 数据库中的对象/属性记录到 HTML 文件中。

-- http://mdbdoc.sourceforge.net/

【讨论】:

【参考方案5】:

我并不完全清楚你想做什么。如果要查看 SQL 语句的结果,可以创建一个表单并将其记录源设置为“Select * from table1 where empno is 0”。然后您可以一次查看一条记录的结果。

如果这不是您想要的,那么恐怕我没有足够的信息来回答您的问题。

从你目前已经所说的来看,我看不出你需要 VBA 或报告的任何理由,因为你只是想查看数据。报表用于打印,表单用于查看和编辑。报表是面向页面的,不是那么容易导航,而表单是面向记录的,并且允许您编辑数据(如果您愿意的话)。

有关您想要完成的任务的更多信息将帮助我们为您提供更好的答案。

【讨论】:

【参考方案6】:

有同样的问题。只需使用剪贴板!

    通过单击/拖动显示的所有字段名称来选择查询结果 按 ctrl-c 复制到 Windows 剪贴板 在word中打开一个空白文档并在里面点击 按 ctrl-v 从剪贴板粘贴。

【讨论】:

以上是关于访问:如何执行查询并将其结果保存在报告中的主要内容,如果未能解决你的问题,请参考以下文章

如何修改查询集并将其保存为新对象?

如何在查询中使用 $push 将数据插入子文档,而不是检索文档并将其保存回来

以编程方式构建访问查询

如何读取 FOR XML SQL Server 查询的完整结果?

如何将流式查询的结果保存为 PDF / XLSX(用于生成报告)?

Python - 如何解析 JSON 并将其保存到 MYSQL 数据库