Как обновить таблицу в MS Access 2007 - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь обновить записи в таблице в MS Access 2007 из временной таблицы. Временная таблица получает новые данные из внешнего инструмента. Новые данные (2 столбца) должны войти в постоянную таблицу.

Я попробовал 2 следующих запроса, но оба показывают пустые записи, когда я смотрю на представление таблицы запросов. (кстати, есть ли лучший способ отладки SQL при доступе?) Второй запрос также показывает столько строк, сколько имеется в table1 , а не только количество строк, отредактированных внешним инструментом. (в обоих случаях результаты пусты для каждой строки)

версия, которая имеет как минимум правильное количество записей:

UPDATE (table1 INNER JOIN table2 ON table1.key = table2.key)
SET table1.value1 = table2.value1, table1.datevalue = table2.datevalue
WHERE ((table1.value1) IS NULL);

версия с таким количеством записей в результате, сколько записей в таблице1:

UPDATE table1
SET table1.value1 = (SELECT value1
FROM table2
WHERE ((table1.value1 IS NULL)
AND (table1.key = table2.key))),
table1.datevalue = (SELECT datevalue
FROM table2
WHERE ((table1.key = table2.key)
AND (table1.value1 IS NULL)))

В моем тесте инструмент манипулировал 1 записью, поэтому я ожидал увидеть одну строку как вывод запроса с value1 и datevalue из table2 , но вывод показывает value1 и datevalue с пустыми записями (1 или (количество записей в table1 )).

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Чтобы полностью ответить на ваши вопросы, запросы действий, включая UPDATE и INSERT в программе MS Access .exe, по умолчанию вызовут сообщение, сообщающее пользователю, сколько строк будет обновлено или вставлено, и если пользователь хочет продолжить действие. Другие представления запросов действий могут не информировать затронутые записи.

Access GUI Message

Это сообщение появится, если запрос действия вызывается из:

  • Окно Query Design с использованием действия запуска ! icon
  • Макрос с использованием OpenQuery action
  • Модуль с использованием DoCmd.OpenQuery команда

Если не использовать MS Access .exe (поскольку Access - это и прикладная программа, и база данных), вы все равно можете увидеть, сколько записей влияют через код, используя свойство DAO Database.RecordsActed , которое является частью библиотека объектов MS Access. Любой COM-интерфейсный язык может запускать один и тот же процесс, включая VBA, Python, PHP, Java и т. Д.

Пример VBA (примечание: VBA является отдельным компонентом для MS Access и других приложений Office)

Sub RunUpdate()    
   Dim db as DAO.Database

   Set db = CurrentDb()
   db.Execute "mySavedUpdateQuery"

   MsgBox CStr(db.RecordsAffected) & " records were affected."    

   Set db = Nothing
End Sub

Пример 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("EmployeesUpdateQ")
    print("{} records were affected.".format(db.RecordsAffected))

except Exception as e:
    print(e)

finally:
    oApp.Quit()
    db = None; oApp = None
    del db; del oApp

Количество строк Вопрос

Оба ваших запроса обновят разное количество записей. Первая версия поддерживает условия JOIN и WHERE на внешнем уровне, поэтому будет влиять на отфильтрованное количество записей в table1 .

UPDATE (table1 t1 INNER JOIN table2 t2 ON t1.[key] = t2.[key])
SET t1.value1 = t2.value1, 
    t1.datevalue = t2.datevalue
WHERE ((t1.value1) IS NULL);

Вторая версия использует подзапросы с условиями JOIN и WHERE, но ничего на внешнем уровне, поэтому все записи table1 будут затронуты, но конкретные значения могут обновиться до NULL. Фактически, вы можете получить ошибку исключения, если подзапросы возвращают более одного значения:

UPDATE table1
SET table1.value1 = (SELECT value1
                     FROM table2
                     WHERE ((table1.value1 IS NULL)
                       AND  (table1.[key] = table2.[key]))),

    table1.datevalue = (SELECT datevalue
                        FROM table2
                        WHERE ((table1.[key] = table2.[key])
                          AND  (table1.value1 IS NULL)))
1 голос
/ 29 мая 2019
show empty records when I look at the Datasheet view of the Query

Если вы откроете запрос на обновление в табличном режиме, вы увидите только текущие значения ячеек.Вы должны выполнить (выполнить) ваш запрос, чтобы получить обновленные значения.Запрос на обновление нельзя проверить на предварительный просмотр (как вы хотите, как я понял).

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