web-dev-qa-db-ja.com

VBAを使用してすべてのMS Access SQLクエリをテキストファイルにエクスポートする

多数のマクロクエリなどを含むMS Accessデータベースをドキュメント化する必要があります。コードを使用して、各SQLクエリをクエリと同じ名前のファイルに抽出します。たとえば、クエリの名前がq_warehouse_issuesの場合、抽出しますSQLをq_warehouse_issues.sqlという名前のファイルに

クエリ結果セットをエクスポートしたくありません。SQLだけです。

Accessでこれを手動で実行できることはわかっていますが、クリックしたり、saveasなどを実行したりするのにうんざりしています。

26
Pieter Nienaber

これはあなたを始めるはずです:

  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef

  Set db = CurrentDB()
  For Each qdf In db.QueryDefs
    Debug.Print qdf.SQL
  Next qdf
  Set qdf = Nothing
  Set db = Nothing

ファイルシステムオブジェクトまたは組み込みのVBAファイルI/O機能を使用して、SQLをファイルに書き出すことができます。私はあなたがファイルを書き出す方法よりもSQLを取得する方法についてもっと尋ねていたと思いますが、それが必要な場合はコメントでそのように言ってください。そうすれば投稿が編集されます(または誰かが自分の答えを投稿しますそのための指示)。

27
David-W-Fenton

お役に立てれば。

Public Function query_print()
Dim db As Database
Dim qr As QueryDef

Set db = CurrentDb

For Each qr In db.QueryDefs
  TextOut (qr.Name)
  TextOut (qr.SQL)
  TextOut (String(100, "-"))
Next
End Function

Public Sub TextOut(OutputString As String)

    Dim fh As Long

    fh = FreeFile
    Open "c:\File.txt" For Append As fh
    Print #fh, OutputString
    Close fh

End Sub
17
yoonjinl

このソリューションにはクエリのフィールドが含まれます

Public Sub ListQueries()
    ' Author:                     Date:               Contact:
    ' André Bernardes             09/09/2010 08:45    [email protected]     http://al-bernardes.sites.uol.com.br/
    ' Lista todas as queries da aplicação.
    ' Listening:

    Dim i As Integer
    Dim j As Integer
    Dim k As Integer
    Dim l As Integer

    On Error Resume Next

    For i = 0 To CurrentDb.QueryDefs.Count - 1
        Debug.Print "Query: " & CurrentDb.QueryDefs(i).Name

        For j = 0 To CurrentDb.QueryDefs(i).Fields.Count - 1
            Debug.Print "Field " & CurrentDb.QueryDefs(i).Fields(j).Name
        Next

        Debug.Print "  SQL: " & CurrentDb.QueryDefs(i).SQL
    Next
End Sub
8
Andre Bernardes
  1. VBウィンドウで、Tools->References....をクリックします
  2. [参照]ウィンドウで、依存関係Microsoft Scripting Runtimeをチェックして追加します。

次に、このコードはクエリをgrepの使用に適したファイルにエクスポートします。

Sub ExportQueries()

  Dim fso As New FileSystemObject

  Dim stream As TextStream

  Set stream = fso.CreateTextFile("e:\temp\queries.txt")

  Dim db As DAO.Database
  Dim qdf As DAO.QueryDef

  Set db = CurrentDb()
  For Each qdf In db.QueryDefs

    stream.writeline "Name: " & qdf.Name
    stream.writeline qdf.SQL
    stream.writeline "--------------------------"
  Next qdf
  Set qdf = Nothing
  Set db = Nothing

End Sub
4
leeand00

@ andre-bernardesのコードを「|」を使用するように変更しましたクエリ名の前のセパレータとSQLステートメントの前の ":"セパレータ。さまざまな区切り記号により、pythonでQueries.txtファイルを解析し、クエリとSQLステートメントのディクショナリを作成することが容易になります。このディクショナリを使用して、SQLiteテーブルにビューを作成できます。例。

SQLクエリを抽出するVBAコード

Public Sub ListQueries()
    ' Modified from André Bernardes
    Dim i As Integer
    Dim ff As Long
    ff = FreeFile()
    Open "C:\Dev\Queries.txt" For Output As #ff
    On Error Resume Next

    For i = 0 To CurrentDb.QueryDefs.Count - 1
        Debug.Print "|" & CurrentDb.QueryDefs(i).Name & ":"
        Print #ff, "|" & CurrentDb.QueryDefs(i).Name & ":"

        Debug.Print CurrentDb.QueryDefs(i).SQL
        Print #ff, CurrentDb.QueryDefs(i).SQL
    Next
End Sub

Queries.txtを辞書に解析するPythonコード

queries_file = open(data_path + '/Queries.txt')
queries = queries_file.read().split('|')
l = [x.split(':') for x in queries]
l.pop(0)
table_name_to_query = {name: query for name, query in l}

AccessクエリからSQLiteビューを作成する

import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
for table, query in table_name_to_query.items():
    try:
        c.execute("CREATE VIEW `%s` AS %s" % (table,query))
        print("\n\n"+ table + " passed")
        print(query)
    except Exception as e:
        print("\n\n"+ table + " error")
        print(e)
        print(query)
0
Paul Rougieux