Обработка внешней базы данных Access в базе данных Access с VBA? - PullRequest
0 голосов
/ 07 декабря 2018

Так что я немного озадачен тем, как обращаться с внешней базой данных и текущей базой данных в коде VBA.Ниже приведена подпрограмма, целью которой является обновление текущей базы данных Access уникальными записями, найденными во внешней базе данных Access.

Внешние SourceDBPath и SelectedTable передаются, и я указываю внешнюю базу данных и таблицу с помощью строковой переменной SourceDBTable.Затем в SQL я пытаюсь извлечь записи со значениями, которые не соответствуют их основному ответному полю, поэтому в исходную базу данных вставляются только уникальные записи между двумя БД.

(Например, где source =external:
NOT EXIST sourceDB.SelectedTable.Field1 = currentDB.SelectedTable.Field1 And sourceDB.SelectedTable.Field2 = currentDB.SelectedTable.Field2 And sourceDB.SelectedTable.Field3 = currentDB.SelectedTable.Field3, и т. д.)

ТАК, мои вопросы:

1) Нужно ли указывать текущую базу данных в SQL (например, currentDB.table.field)или по умолчанию будет использоваться текущая база данных, если таблица или поле вызывается без префикса (просто таблица или поле, как в приведенном ниже коде)?
2) В конечном счете, я поступаю правильно?

Мой код:

Private Sub UpdateDatabaseTable(SourceDBPath As String, SelectedTable As String)
    Dim SourceDBTable As String  

    On Error GoTo DBError  

    SourceDBTable = "[;DATABASE=" & SourceDBPath & "]." & SelectedTable

    Call DoCmd.RunSQL("INSERT INTO " & SelectedTable & " " & _
                        "SELECT Field1, Field2, Field3 " & _
                        "FROM " & SourceDBTable & " " & _
                        "WHERE NOT EXISTS( SELECT * " & _
                                            "FROM " & SourceDBTable & " " & _
                                            "WHERE (Field1=" & SourceDBTable & ".Field1 And Field2=" & SourceDBTable & ".Field2 And Field3=" & SourceDBTable & ".Field3"));")

    GoTo EndSub

DBError:
    MsgBox "Database Error!" & vbCrLf & "Error #" & Str(Err.Number) & ":  " & Err.Source & vbCrLf & Err.Description, vbExclamation, "Database Error"

EndSub:

End Sub

ПРИМЕЧАНИЕ. Я получил свой SQL путем экстраполяции и изменения кода, найденного в решении ЗДЕСЬ

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

В вашем коде есть 2 основные ошибки, в противном случае он должен работать.

  1. Не указывайте имя таблицы для каждого поля.Вместо этого используйте псевдоним
  2. Вы хотите экранировать как имя таблицы, так и имя базы данных, а не только имя базы данных
    Private Sub UpdateDatabaseTable(SourceDBPath As String, SelectedTable As String)
        Dim SourceDBTable As String  

        On Error GoTo DBError  

        SourceDBTable = "[;DATABASE=" & SourceDBPath & "].[" & SelectedTable & "]"

        DoCmd.RunSQL "INSERT INTO " & SelectedTable & " t " & _
                            "SELECT Field1, Field2, Field3 " & _
                            "FROM " & SourceDBTable & " s" & _
                            "WHERE NOT EXISTS( SELECT * " & _
                                                "FROM " & SourceDBTable & " s1 " & _
                                                "WHERE (t.Field1=s1.Field1 And t.Field2=s1.Field2 And t.Field3=s1.Field3));"

        GoTo EndSub

    DBError:
        MsgBox "Database Error!" & vbCrLf & "Error #" & Str(Err.Number) & ":  " & Err.Source & vbCrLf & Err.Description, vbExclamation, "Database Error"

    EndSub:

    End Sub

Я также удалил устаревший Callключевое слово.При желании вы можете отрегулировать это далее, используя CurrentDb.Execute, но это не нужно

0 голосов
/ 07 декабря 2018

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

strExtract = gstrBasePath & "Program\Editing\ConstructionExtract.accdb"

CurrentDb.Execute "INSERT INTO Bituminous IN '" & strExtract & "' SELECT * FROM ConstructionBIT;"

gstrBasePath является глобальной константой, объявленной в общем модуле:

Global Const gstrBasePath = "\\servernamehere\Crm\Lab\Database\"

Youможете использовать буквенный строковый путь в вашей процедуре.

Следуя данным PULLS из ДРУГОГО БД:

CurrentDb.Execute "INSERT INTO Employees SELECT * FROM Employees IN '\\servername\filename.accdb'"

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