Запрос обновления VBA ADO

0 Lich4r [2017-10-27 12:34:00]

Я пытаюсь создать динамический файл excel клиента, который связан с файлом master файла "server".

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

Я могу получить данные с помощью SELECT очень легко, но запрос обновления не будет работать. Вот часть кода:

Option Explicit


Private Type FichierSource
    'Objet Fichier source.
    Path As String
    SourceSheet As String
    TargetSheet As String
    Columns As String
    Filter As String
    Name As String
End Type

Sub GetFiles()
    'Take !M sheet to create files and their informations
    Dim Base As FichierSource

    '----------------------------
    'Create files object
    '----------------------------

    'Fichier Source
    Base.Path = "U:\Macros\SQL\Base.xlsx"
    Base.SourceSheet = "DATA"
    Base.TargetSheet = "Base2"
    Base.Columns = "*"
    Base.Filter = ""
    Base.Name = "Base.xlsx"


    '---------------------------
    'Launch queries
    '---------------------------

    With Base
        Call UPDATEQUERY(.Path, .SourceSheet, .TargetSheet, .Columns, .Filter)
    End With

End Sub

Sub UPDATEQUERY(SourcePath As String, SourceSheet As String, TargetSheet As String, _
Columns As String, Filter As String)

    Dim Cn As ADODB.Connection
    Dim QUERY_SQL As String
    Dim CHAINE_HDR As String
    Dim STRCONNECTION As String
    Dim i As Long

    CHAINE_HDR = "[Excel 12.0 Macro;Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='HDR=YES;'] "


    Set Cn = New ADODB.Connection

    QUERY_SQL = _
    "UPDATE [" & TargetSheet & "$] SET [Col] = (SELECT [Col] FROM [" & SourceSheet & "$] " & _
    "IN '" & SourcePath & "' " & CHAINE_HDR & Filter & ")"



    STRCONNECTION = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source='" & ThisWorkbook.FullName & "';" & _
    "Extended Properties=""Excel 12.0 Macro;"";"

'    QUERY_SQL = _
'    "UPDATE [" & TargetSheet & "$] SET " & _
'    "[Col] = '3'"

    'MsgBox (QUERY_SQL)
    Cn.Open STRCONNECTION

    Cn.Execute (QUERY_SQL)


    '--- Fermeture connexion ---
    Cn.Close
    Set Cn = Nothing

End Sub

Когда я выполняю запрошенный запрос Sql Query, чтобы обновить столбец "Col" до "3", он отлично работает, когда я пытаюсь обновить с помощью SELECT из главного файла, я получаю следующую ошибку

Операция должна использовать обновляемый запрос

ОБНОВЛЕНИЕ: Я думаю, что настоящая проблема:

Я читал вопросы, поднятые по этому вопросу, но все работало на меня. Действительно, если я установил "ReadOnly = False" в моей строке подключения, я получаю следующую ошибку: "Pilot ISAM introuvable" ("Драйвер ISAM не найден").

ОБНОВЛЕНИЕ 2: Ошибка драйвера ISAM появляется, когда строка подключения неверна. (например: плохой номер версии excel). Требуется ReadOnly = False (или Mode = 'Share Deny Write'), так же как и внутреннее соединение.

Я уже достиг всего этого вручную, добавив соединение с основным файлом в excel-соединении, поэтому я знаю, что это должно быть возможно.

Спасибо

sql vba excel ado


2 ответа


1 Решение Patrick Honorez [2017-10-27 14:32:00]

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

Sub SQLUpdateExample()
    Dim con As ADODB.Connection
    Dim rs As ADODB.Recordset
    Set con = New ADODB.Connection
    con.Open "Driver={Microsoft Excel Driver (*.xls)};" & _
           "DriverId=790;" & _
           "Dbq=" & ThisWorkbook.FullName & ";" & _
           "DefaultDir=" & ThisWorkbook.FullName & ";ReadOnly=False;"
    Set rs = New ADODB.Recordset
    Set rs = con.Execute("UPDATE [Sheet1$]  inner join [Sheet2$] on [Sheet1$].test1 = [Sheet2$].test1  SET [Sheet1$].test3 = [Sheet2$].test3 ")

    Set rs = Nothing
    Set con = Nothing
End Sub

Возможно, все, что вам нужно, это ;ReadOnly=False; в вашей строке подключения?
Обратите внимание, что, несмотря на имя, которое я использую для драйвера, это работает в файле.XLSM.


1 Paul Ogilvie [2017-10-27 13:50:00]

Я добавил тэг SQL к вашему вопросу, так что, возможно, гуру SQL может помочь вам лучше. Однако, глядя на синтаксис UPDATE, запрос UPDATE без предложения WHERE будет обновлять указанный столбец каждой строки таблицы с тем же значением. Если вы посмотрите на свою часть запроса SELECT, похоже, что она будет извлекать более одного значения.

Если вы хотите обновить столбец таблицы со значением столбца соответствия в другой таблице, вы должны присоединиться к таблицам, используя предложение WHERE. Я думаю, что следующий пример будет правильным:

UPDATE table1 SET col = (SELECT col FROM table2 WHERE table1.key=table2.key)

ИЛИ ЖЕ

UPDATE t1
SET t1.Col = t2.Col
FROM table1 AS t1
    INNER JOIN table2 AS t2
        ON t1.Key = t2.Key