HI,
我正在尝试在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
另外,如何更改此查询以在数据库中的所有表上运行此
答案 0 :(得分: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
<强> ======================= UPDATE ==================== === 强>
可以从记录集中运行MS-Access报告。要重复我对tksy's question的说法
从Access Web开始,您可以使用记录集的“name”属性。结果代码看起来像这样:
在报告中
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。强>
答案 1 :(得分:0)
通常,您会根据数据源设计报告。然后在报告完成并正常工作后,使用VBA显示或保存报告。
答案 2 :(得分:0)
要为数据库中的每个表运行此操作,我建议编写一个循环通过CurrentData.AllTables(i)的函数,然后在每次迭代中调用上面的函数
希望这有帮助
答案 3 :(得分:0)
如果您只想查看结果,可以创建查询。例如,这里有一些粗略的,大部分未经测试的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感兴趣,MDB Doc是Microsoft Access 97-2003的一个加载项,允许您将Access数据库中的对象/属性记录到HTML文件中。
答案 4 :(得分:0)
我不清楚你想做什么。如果要查看SQL语句的结果,可以创建一个表单并将其记录源设置为“select * from table1 where empno为0”。然后,您可以一次查看一条记录的结果。
如果那不是你想要的,那么恐怕我没有足够的信息来回答你的问题。
到目前为止,您拥有所说的内容,我认为您不需要VBA或报告,因为您只想查看数据。报告用于打印,表单用于查看和编辑。报告是面向页面的,不易于导航,而表单是面向记录的,并允许您编辑数据(如果您愿意)。
有关您想要完成的更多信息将有助于我们为您提供更好的答案。
答案 5 :(得分:0)
有同样的问题。只需使用剪贴板!