2016-09-27 2 views
0

У меня есть несколько десятков макросов вида:Script Out и экспорт MS Access Макросы для SQL

enter image description here

То, что я хочу сделать, это сценарий из всего макроса в SQL. Я знаю, что это можно выполнить вручную, открыв запрос и выбрав SQL View. Например, первый запрос Build BOM - Part 0A, при открытии и выбор SQL view выведет:

DELETE FROM [BOM Cost];

Есть ли способ сделать это автоматически для всего макроса без необходимости идти в каждый и каждый запрос и Macro?

+0

Сделайте это один раз с помощью макросъемщика, и у вас будет базовый код для того, что вы хотите. – litelite

+1

@ AlbertD.Kallal, чтобы уточнить, я предлагаю, чтобы иметь возможность получить SQL-скрипт макроса/запроса, а не использовать SQL для сценариев ... (также, пожалуйста, будьте более конструктивными в своих комментариях) – Sauron

+0

@ AlbertD.Kallal Я никогда не думал, что мне придется это написать, но, пожалуйста, прекратите использовать «клоун родео» на сайте. Никогда не бывает времени, когда можно сравнить кого-то другого с клоуном-родео, будь то пьяные или безработные. – meagar

ответ

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 

затем можно разобрать этот файл, ищет Begin/End блоков, которые содержат Action ="OpenQuery" и извлекая имя запроса. При том, что вы могли бы открыть объект 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 
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-сервером T-SQL. Два диалекта немного отличаются. Таким образом, требуется некоторый перевод, включая IIF() - CASE (при использовании SQL Server до 2012 года); не использовать двойные кавычки, чтобы заключать строковые литералы; нет элементов кросс-таблицы; и другие предметы.

Смежные вопросы