脚本输出并将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文字; 没有交叉点枢轴; 和其他项目。