脚本输出并将MS Accessmacros导出到SQL
我有几十个macros的forms:
我想要做的是在SQL中编写整个macros。 我知道这可以通过打开查询并selectSQL View
来手动完成。 例如,第一个查询Build BOM - Part 0A
,如果打开并selectSQL view
将显示:
DELETE FROM [BOM Cost];
有没有办法自动完成整个macros而不需要进入每个查询和macros?
您可以使用VBA代码来获取(至less一些)你需要的。 例如,你可以遍历当前数据库中的所有macros
Dim m As Object For Each m In CurrentProject.AllMacros Dim macroName As String macroName = m.Name Debug.Print macroName Next
现在,而不是简单地打印macros名称,您可以将其转储到一个文本文件
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
然后可以parsing该文件,查找包含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
虽然不是完全自动化的,并且类似于@ GordThompson的build议,但考虑将每个macros中的所有查询名称手动收集到一个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
请注意:在SQL Server的T-SQL中,访问SQL不太容易遵从。 这两种方言有点不同。 所以,需要一些翻译,包括IIF()
到CASE
(如果在2012之前使用SQL Server); 不使用双引号括起string文字; 没有交叉点枢轴; 和其他项目。