Можно ли запустить макрос VBA для выполнения запросов SQL, сохраненных в базе данных MS Access? - PullRequest
1 голос
/ 30 мая 2019

Я потратил много времени на создание 24 различных отдельных запросов MS Access, которые я сохранил в базе данных MS Access. Они должны быть запущены в определенном порядке.

Я хочу запустить макрос, который будет выполнять их один за другим.

Я знаю, что могу сделать это с помощью VBA, но мне нужно скопировать все SQL в VBA по одному.

Есть ли способ, с помощью которого VBA может выполнять сохраненные запросы в базе данных MS Access, не копируя их в VBA?

Я очень хорошо разбираюсь в SQL. Более 15 лет работаю в Oracle, пишу код, настраиваю БД, работаю с БД.

Я новичок в использовании SQL и VBA для работы с БД MS Access.

Ответы [ 4 ]

3 голосов
/ 30 мая 2019

В самой простой форме вы можете определить Sub, например:

Sub ExecuteQueries()
    With CurrentDb
        .Execute "MyQuery1"
        .Execute "MyQuery2"
        '...
        .Execute "MyQueryN"
    End With
End Sub

Или определите это как Function в общедоступном модуле, если вы собираетесь вызывать его из макроса MS Access.

2 голосов
/ 30 мая 2019

Чтобы очистить несколько терминологий:

  1. Графический интерфейс MS Access состоит из пяти основных типов объектов: таблиц, запросов, форм, макросов и модулей.Технически, в MS Access нет такой вещи, как VBA macros .Это терминология из MS Excel, где каждая подпрограмма определена как макрос.

    В MS Access есть физический объект, известный как макрос , который отделен от VBA (хотя может вызывать код VBA).Кодированные подпрограммы, которые включают все функции и подпрограммы в MS Access, инкапсулированы в модуль (объект), обычно за формами, отчетами или автономными модулями.

  2. Помните, что каждое приложение Microsoft Office поддерживает свою собственную библиотеку объектов и не должно быть связано друг с другом.VBA сам по себе является отдельным компонентом, установленным по умолчанию (см. Инструменты \ Ссылки в IDE). Любой язык (Java, PHP, Python и т. Д.), Который может поддерживать COM-интерфейс, может подключаться и запускать библиотеку объектов каждого приложения Office.VBA - это просто один тип, который делает это.

  3. MS Access поддерживает хранимые запросы (как другой объект), которые могут быть запросами действий (UPDATE, INSERT даже CREATE TABLE или ALTER TABLE) или запросы набора записей (SELECT).Вам не нужно копировать весь код SQL внутри VBA для запуска этих сохраненных объектов запроса.На самом деле хранимые запросы выполняются более эффективно, чем строковые запросы, вызываемые в коде, поскольку механизм MS Access компилирует наилучший план выполнения с сохраненными запросами.


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

Макрос

OpenQuery    
   QueryName: myfirstActionQuery
        View: Datasheet
   Data Mode: Edit

OpenQuery    
   QueryName: mySecondActionQuery
        View: Datasheet
   Data Mode: Edit

OpenQuery    
   QueryName: myThirdActionQuery
        View: Datasheet
   Data Mode: Edit

...

Для запросов действий вам не нужно закрывать запрос, поскольку OpenQuery запускает процесс, не открывая ничего на экране.Возможно, вы захотите включить действие от SetWarnings до False, чтобы избежать появления сообщения о том, сколько записей будет обновлено или вставлено, что является настройкой по умолчанию в Access.Поскольку это потенциально опасное действие, нажмите Show All Actions, чтобы увидеть это конкретное действие.

Модуль

Public Sub RunQueries()    
     DoCmd.SetWarnings False

     DoCmd.OpenQuery "myfirstSavedQuery"
     DoCmd.OpenQuery "mySecondSavedQuery"
     DoCmd.OpenQuery "myThirdSavedQuery"
     ...

     DoCmd.SetWarnings True
End Sub

Как и в макросах, закрывать необязательнозапрашивает действие и может вызывать DoCmd.SetWarnings для подавления подсказок сообщения при каждом действии обновления, вставки или создания таблицы.

Альтернативой выключению и включению SetWarnings является @ решение LeeMac , которое выполняет запросы с помощью команды DAO Database.Execute () .Фактически, поскольку DAO является частью библиотеки объектов MS Access, описанный выше метод можно запускать вне VBA, как указано выше.

Python

import os
import win32com.client

access_file = r'C:\Path\To\MyDatabase.accdb'

try:
    oApp = win32com.client.Dispatch("Access.Application")
    oApp.OpenCurrentDatabase(access_file)

    db = oApp.Currentdb()
    db.Execute("myFirstSavedQuery")
    db.Execute("mySecondSavedQuery")
    db.Execute("myThirdSavedQuery")
    ...   

except Exception as e:
    print(e)

finally:
    oApp.Quit()
    db = None; oApp = None
    del db; del oApp
1 голос
/ 30 мая 2019

Вот еще один метод, если у вас нет особых соглашений об именах, использующих массив для имен запросов в порядке выполнения:

Public Sub RunMasterUpdate()

    Dim qryList As Variant
    Dim i As Long

    qryList = Array("QueryName1", "QueryName2", "QueryName3")

    For i = LBound(qryList) To UBound(qryList)
        CurrentDb.Execute qryList(i)
    Next

End Sub
1 голос
/ 30 мая 2019

Вы можете сделать что-то подобное для запуска сохраненных запросов:

Dim db As DAO.Database, qry As DAO.QueryDef

Set db = CurrentDb

Debug.Print "-- Start --"
For Each qry In db.QueryDefs
    If qry.Name Like pattern Then
        Debug.Print qry.Name,
        qry.Execute
        Debug.Print "(" & qry.RecordsAffected & ")"
    End If
Next
Debug.Print "-- End --"

db.Close()

Назовите запросы так, чтобы алфавитный порядок соответствовал ожидаемому порядку выполнения, например, 01_deleteCustomers, 02_appendCustomers, 03_etc.

Укажите строку pattern или полностью удалите If, если хотите выполнить все запросы.

Обратите внимание, что в редакторе Visual Basic в меню Tools> References... Я выбрал Microsoft DAO 3.6 Object Library.(У вас может быть другая версия)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...