Как обновить таблицу в MS Access 2007

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

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

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

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 записью, поэтому я ожидал увидеть одну строку в качестве вывода запроса с значение1 и значение даты из Таблица 2, но вывод показывает значение1 и значение даты с пустыми записями (1 или (количество записей в Таблица 1)).

Пожалуйста, проверьте SELECT версию вашего обновления и подзапросов: SELECT table1.* FROM table1 INNER JOIN table2 ON table1.[key] = table2.[key] WHERE ((table1.value1) IS NULL). Если в результате получается ноль строк, то просто нет записей, соответствующих условиям JOIN и WHERE.

Parfait 29.05.2019 15:44

@Parfait Я попробовал избранную версию (в предложенной вами форме). Результатом была 1 строка (что правильно, поскольку я изменил 1 строку в тесте) со значениями, соответствующими ожидаемому.

veryBadProgrammer 29.05.2019 15:54

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

Parfait 29.05.2019 16:09
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
show empty records when I look at the Datasheet view of the Query

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

Понимаю. Вы правильно поняли, это именно то, что я хотел сделать. Однако мне нужно спросить, как мне выполнить запрос? Щелчок правой кнопкой мыши не показывает никаких вариантов выполнения запроса.

veryBadProgrammer 29.05.2019 15:50

Я нашел это. Блин, я пиздец ..не умный. Это сработало, и обновление сработало, как и ожидалось, после фактического выполнения запроса. Я собираюсь удариться головой о стену. Спасибо за вашу помощь.

veryBadProgrammer 29.05.2019 15:58

Из графического интерфейса: нажмите кнопку !; из кода VBA: используйте метод DAO.QueryDef Execute или обходной путь DoCmd.RunSQL. Все приходит с опытом, удачи!

Van Ng 29.05.2019 15:58

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

Access GUI Message

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

  • Окно «Дизайн запроса» с использованием значка действия запуска !
  • Макрос с использованием действия OpenQuery
  • Модуль, использующий команду DoCmd.OpenQuery

Если вы не используете MS Access .exe (поскольку Access является и прикладной программой, и базой данных), вы все равно можете увидеть, сколько записей влияет на код, используя свойство DAO База данных.RecordsAffected, которое является частью библиотеки объектов 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 на внешнем уровне, поэтому повлияет на отфильтрованное количество записей в Таблица 1.

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, но ничего на внешнем уровне, поэтому все записи Таблица 1 будут затронуты, но определенные значения могут обновиться до 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)))

Другие вопросы по теме