我有几十种形式的宏:
我想要做的是在SQL中编写整个宏的脚本。我知道这可以通过打开查询并选择SQL View
手动完成。
例如,第一个查询Build BOM - Part 0A
,如果已打开并选择SQL view
,则会显示:
DELETE FROM [BOM Cost];
有没有办法为整个宏自动完成此操作而无需进入每个查询和宏?
答案 0 :(得分:1)
您可以使用VBA代码获取(至少某些)您需要的内容。例如,您可以使用
遍历当前数据库中的所有宏Dim m As Object
For Each m In CurrentProject.AllMacros
Dim macroName As String
macroName = m.Name
Debug.Print macroName
Next
现在,您可以将其转储到带有
的文本文件中,而不是简单地打印宏名称Application.SaveAsText acMacro, macroName, "C:\Users\Gord\Desktop\macroDump.txt"
将产生一个看起来像这样的文件
Version =196611
PublishOption =1
ColumnsShown =0
Begin
Action ="OpenQuery"
Argument ="MyUpdateQuery"
Argument ="0"
Argument ="1"
End
Begin
Comment ="_AXL:<?xml version=\"1.0\" encoding=\"UTF-16\" standalone=\"no\"?>\015\012<UserI"
"nterfaceMacro MinimumClientDesignVersion=\"14.0.0000.0000\" xmlns=\"http://schem"
"as.microsoft.com/office/accessservices/2009/11/application\" xmlns:a=\"http://sc"
"hemas.microsoft.com/office/acc"
End
Begin
Comment ="_AXL:essservices/2009/11/forms\"><Statements><Action Name=\"OpenQuery\"><Argumen"
"t Name=\"QueryName\">MyUpdateQuery</Argument></Action></Statements></UserInterfa"
"ceMacro>"
End
然后,您可以解析该文件,查找包含Action ="OpenQuery"
的Begin / End块并检索查询名称。有了它,您可以打开QueryDef对象并检索其SQL
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = cdb.QueryDefs(queryName) ' MyUpdateQuery
Dim querySql As String
querySql = qdf.SQL
答案 1 :(得分:0)
虽然没有完全自动化并且类似于@ GordThompson的建议,但考虑将每个宏中的所有查询名称手动收集到VBA数组中,然后遍历QueryDefs集合,将每个查询名称写入不断增长的文件:
Public Sub ExtractSQL()
Dim db As DAO.Database, qdef As DAO.Querydef
Dim qrys As Variant, qry As Variant
Dim strSQL As String, sqlFile As String
Set db = CurrentDb
qrys = Array("Query1", "Query2", "Query3")
sqlFile = "C:\Path\To\AllQueries.sql"
' OPEN SQL TEXT FILE
Open sqlFile For Output As #1
For Each qdef In db.QueryDefs
For Each qry In qrys
If qdef.Name = qry Then
Print #1, qdef.SQL ' SQL STATEMENT
Print #1, "" ' LINE SEPARATOR
End If
Next qry
Next qdef
' CLOSE SQL TEXT FILE
Close #1
Set qdef = Nothing
Set db = Nothing
End Sub
请注意:Access SQL在SQL Server的T-SQL中并不容易兼容。这两种方言略有不同。因此,需要进行一些翻译,包括IIF()
到CASE
(如果在2012年之前使用SQL Server);不使用双引号括起字符串文字;没有交叉点枢轴;和其他项目。